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


参考代码:

#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)
 

0.0分

6 人评分

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

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

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

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

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

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

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

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

评论列表 共有 8 条评论

CyanLan2 2年前 回复TA
有人帮忙解释一下else q->next =p;
                           q=p;
么?
朱派金 2年前 回复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的妙用,顶上去。