链表课后练习题(基础)

//13人围成一圈,报到3退出,找到留在圈子中的人原来的序号
/*
#include<cstdio>
#include<iostream>
#include<cstdlib>
using namespace std;

#define len sizeof(struct student)

struct student
{
    int num;
    struct student *next;
};

struct student * creat(int n)
{
    struct student *head;
    struct student *p1, *p2;        //p1指向循环链表的尾部, p2指向将要插入的新操作点
    head = p1 = p2 = (struct student *)malloc(len);
    p1->num = 1;
    p1->next = head;
    while(p1->num < n){
        p2 = (struct student *)malloc(len);
        p2->num = p1->num+1;
        p1->next = p2;
        p2->next = head;
        p1 = p2;
    }
    return p1;      //返回尾指针
}


void print(struct student *p1)
{
    struct student *p;
    p = p1->next;       //p指向头指针
    while(p != p1){
        printf("%d ", p->num);
        p = p->next;
    }
    printf("%d\n", p1->num);
}


void del(struct student *p)
{
    struct student *tmp;
    tmp = p->next;
    while(tmp->next != p)
    {
        tmp = tmp->next;
    }
    tmp->next = p->next;
    free(p);
}

int main()
{
    int n, x;
    printf("请输入一共多少人:");
    scanf("%d", &n);
    printf("请输入报到序号几退出圈子:");
    scanf("%d", &x);
    struct student *l = creat(n);
    struct student *l1 = l->next;
    int i = 1;
    while(l1 != l1->next){
        struct student *l2 = l1;
        l1 = l1->next;
        if(i == 3){
            del(l2);
            i = 0;
        }
        else{
            l2 = NULL;
        }
        i++;
    }
    printf("剩余的人的序号为:%d\n", l1->num);
}
*/
/*
//实现链表的建立,输出,插入,删除
#include<cstdio>
#include<iostream>
#include<cstdlib>
using namespace std;

#define len sizeof(struct student)

struct student
{
    int num;
    int score;
    struct student *next;
};

struct student *creat()
{
    struct student *head;
    struct student *p1, *p2;
    head = p1 = p2 = (struct student *)malloc(len);
    scanf("%d %d", &p1->num, &p1->score);
    head = p1;
    while(p1->num != 0){
        p2 = (struct student *)malloc(len);
        scanf("%d %d", &p2->num, &p2->score);
        p1->next = p2;
        p2->next = NULL;
        p1 = p2;
    }
    return head;
}

void print(struct student *head)
{
    struct student *p;
    p = head;
    while(p->next != NULL){
        printf("学号:%d 成绩:%d\n", p->num, p->score);
        p = p->next;
    }
}

void del(struct student *p, struct student *head)
{
    struct student *tmp;
    tmp = head;
    while(tmp->next != p){
        tmp = tmp->next;
    }
    tmp->next = p->next;
    free(p);
}

void in(int n, struct student *head)
{
    struct student *p = head;
    struct student *tmp;
    tmp = (struct student *)malloc(len);
    scanf("%d %d", &tmp->num, &tmp->score);
    for(int i=2; i<n; i++){
        p = p->next;
    }
    tmp->next = p->next;
    p->next = tmp;

}

int main()
{
    int n, x;
    struct student *l = creat();
    struct student *l1 = l;
    print(l1);
    printf("请输入插入节点几:");
    scanf("%d", &n);
    in(n, l1);
    print(l1);
    printf("请输入删除节点几:");
    scanf("%d", &x);
    if(x == 1)
        print(l1->next);
    else{
        while(x--){
            l1 = l1->next;
        }
        del(l1, l);
        print(l);
    }
    return 0;
}
*/

//合并两个链表,按学号排序
/*
#include<cstdio>
#include<iostream>
#include<cstdlib>
using namespace std;

#define len sizeof(struct student)

struct student
{
    int num;
    int score;
    struct student *next;
};

struct student *creat()
{
    struct student *head;
    struct student *p1, *p2;
    head = p1 = p2 = (struct student *)malloc(len);
    scanf("%d %d", &p1->num, &p1->score);
    head = p1;
    while(p1->num != 0){
        p2 = (struct student *)malloc(len);
        scanf("%d %d", &p2->num, &p2->score);
        //cout<<p2->num<<endl;
        if (p2->num==0)
            break;
        p1->next = p2;
        p2->next = NULL;
        p1 = p2;
    }
    return head;
}

void print(struct student *head)
{
    struct student *p;
    p = head;
    while(p != NULL){
        printf("学号:%d 成绩:%d\n", p->num, p->score);
        p = p->next;
    }
}

struct student* join(struct student *head1, struct student *head2)
{
    struct student *t = head1;
    struct student *l = head1;
    struct student *g = head2;
    while(t->next != NULL){
        t = t->next;
    }
    t->next = g;            //链接两个链表
    int n = 1;
    while(l->next !=  NULL){
        n++;
        l = l->next;
    }
    //print(head1);
    for(int i=0; i<n; i++){
        struct student *m = head1;
        struct student *n = m->next;
        if(m->num > n->num){
            m->next = n->next;
            n->next = m;
            head1 = n;
        }
        m = head1;
        while(m->next->next != NULL)
        {
            struct student *x = m->next;
            struct student *y = x->next;
            if(x->num > y->num){
                m->next = x->next;
                x->next = y->next;
                y->next = x;
            }
            m = m->next;
        }
    }
    return head1;
}

int main()
{
    struct student *p1 = creat();
    struct student *p2 = creat();
    struct student *p3 = join(p1, p2);
    print(p3);
    return 0;
}
2 3
4 5
5 55
7 9
0 0
1 9
2 6
111 93
0 0
*/

//删除a链表中和b相同学号的节点
#include<cstdio>
#include<iostream>
#include<cstdlib>
using namespace std;

#define len sizeof(struct student)

struct student
{
    int num;
    int score;
    struct student *next;
};

struct student *creat()
{
    struct student *head;
    struct student *p1, *p2;
    head = p1 = p2 = (struct student *)malloc(len);
    scanf("%d %d", &p1->num, &p1->score);
    head = p1;
    while(p1->num != 0){
        p2 = (struct student *)malloc(len);
        scanf("%d %d", &p2->num, &p2->score);
        //cout<<p2->num<<endl;
        if (p2->num==0)
            break;
        p1->next = p2;
        p2->next = NULL;
        p1 = p2;
    }
    return head;
}

void print(struct student *head)
{
    struct student *p;
    p = head;
    while(p != NULL){
        printf("学号:%d 成绩:%d\n", p->num, p->score);
        p = p->next;
    }
}

struct student* del(struct student *head1, struct student *head2)
{
    struct student *m = head1;
    while(m != NULL)
    {
        bool flag=false;
        struct student *n = head2;
        while(n != NULL)
        {
            if(m->num == n->num)
            {
                flag=true;
                if(m==head1)
                {
                    head1 = m->next;
                }
                else
                {
                    struct student *tmp;
                    tmp = head1;
                    while(tmp->next != m){
                        tmp = tmp->next;
                    }
                    tmp->next = m->next;
                }
            }
            n = n->next;
        }
        struct student * p1=m;
        m = m->next;
        if(flag)
        {
            free(p1);
        }
    }
    return head1;
}

int main()
{
    struct student *p1 = creat();
    struct student *p2 = creat();
    struct student *p3 = del(p1, p2);
    print(p3);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值