原题链接:[编程入门]链表之节点删除
解题思路:完全按照题目要求用链表来实现,涉及到链表的建立,链表的释放,链表的遍历,链表的删除。
参考代码:
#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分
6 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
有人帮忙解释一下else q->next =p; q=p; 么?这个代码删除函数有问题,按照题目的输入,应该 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