解题思路:完全按照题目要求用链表来实现,涉及到链表的建立,链表的释放,链表的遍历,链表的删除。


参考代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include<stdio.h>  
#include <stdlib.h>
typedef struct student  //定义学生结构体 
{
    int num;
    int score;
    struct student *next;
}Student;
Student *create(int n)  //建立具有n个结点的链表 
{
    Student *p,*head,*q;
    int i;
    head=(Student *)malloc(sizeof(Student));
    for(i=0;i<n;i++)
    {  
        p=(Student *)malloc(sizeof(Student));
        scanf("%d%d",&p->num,&p->score);
        p->next=NULL;       
        if(i==0) head->next=p;
        else q->next=p;
        q=p;
    }
    return head;      
}
int count(Student *head)  //统计链表结点个数 
{
    Student *p;
    int n=0;
    p=head->next;
    while(p!=NULL)
    {
        p=p->next;
        n++;       
    }  
    return n;
}
void print(Student *head)  //打印输出链表 
{
    Student *p;
    p=head->next;
    while(p!=NULL)
    {
        printf("%d %d\n",p->num,p->score);
        p=p->next;
    }
}
Student *merge(Student *heada,Student *headb) //删除链表中学号相同的结点 
{
    Student *pa,*pb,*qa,*qb;
    int y;
    pa=heada;  
    while(pa->next!=NULL)
    {
        pb=headb;
        y=0; //标志位 
        while(pb->next!=NULL)
        {
            if(pa->next->num==pb->next->num)
            {              
                qa=pa->next;
                pa->next=qa->next;
                free(qa);
                qb=pb->next;
                pb->next=qb->next;
                free(qb);
                y=1;
            }
            else pb=pb->next;          
        }
        if(y==0) pa=pa->next;
    }
    return heada;
}
 
int main()  
{  
    int m,n;
    int k;
    Student *heada,*headb,*p;
    scanf("%d%d",&n,&m);
    heada=create(n); 
    headb=create(m);
    heada=merge(heada,headb);
    k=count(heada);
    printf("%d\n",k);
    print(heada);  
    p=heada;      //释放链表heada 
    while(p!=NULL)
    {
        heada=heada->next;
        free(p);
        p=heada;       
    }
    p=headb;  //释放链表headb
    while(p!=NULL)
    {
        headb=headb->next;
        free(p);
        p=headb;       
    }
     
    return 0;  
}


点赞(1)
 

9.9 分

6 人评分

 

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 8 条评论

CyanLan2 3年前 回复TA
有人帮忙解释一下else q->next =p;
                           q=p;
么?
朱派金 3年前 回复TA
@阿斯嘉德人民 那个标志位确实厉害,我看了半天都不能完全理解
朵儿 3年前 回复TA
@朵儿 明白了,是要删除的
朵儿 3年前 回复TA
可以请问一下qa表示什么?
我不是杜甫 3年前 回复TA
@我不是杜甫 我写错了
我不是杜甫 3年前 回复TA
@我不是杜甫 只改这一句不通用,通过不了,所以答主写的不对
我不是杜甫 3年前 回复TA
这个代码删除函数有问题,按照题目的输入,应该
while(pb->next)
        {
            if(pa->next->num==pb->next->num)
            {
                qa=pa->next;
                pa->next=qa->next;
                free(qa);
                qb=pb->next;
                pb->next=qb->next;
                free(qb);
                y=1;
                pb=headb;
            }
少了最后pb=headb,或者设成双向列表,pb=pb->prior
阿斯嘉德人民 3年前 回复TA
结构清晰,鞭辟入里,算法精妙之处,往往就是0和1的区别,第一次读并不能完全吃透作者的算法,自己上手编写后,才逐渐明白y=1的妙用,顶上去。