Hzu挑战自我


私信TA

用户名:gxhzxyjsj

访问量:98798

签 名:

2024终究会过去,期待2025!

等  级
排  名 8
经  验 27863
参赛次数 67
文章发表 157
年  龄 0
在职情况 教师
学  校 贺州学院
专  业 软件工程

  自我简介:

弱鸡一个,继续努力!

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


参考代码:

#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;  
}


 

0.0分

8 人评分

  评论区

有人帮忙解释一下else q->next =p;
                           q=p;
么?
2022-04-09 07:19:56
可以请问一下qa表示什么?
2021-10-16 20:20:33
这个代码删除函数有问题,按照题目的输入,应该
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
2021-08-12 20:07:15
结构清晰,鞭辟入里,算法精妙之处,往往就是0和1的区别,第一次读并不能完全吃透作者的算法,自己上手编写后,才逐渐明白y=1的妙用,顶上去。
2021-05-27 11:32:20
  • «
  • 1
  • »