原题链接:[编程入门]链表之节点删除
解题思路: 直接上代码,重要点已打注释
注意事项:
参考代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct student//建立学生结构体
{
int num;
int scorm;
struct student* next;
}*node,Node;
/*--------------------------------------------------------*/
node creat(int count)//创建n个节点的链表
{
node header,tail,insert;
header = (node)malloc(sizeof(Node));
header->next =NULL;
tail=header;
for(int i=0;i<count;i++)
{
insert = (node)malloc(sizeof(Node));
scanf("%d%d",&insert->num,&insert->scorm);
insert->next = NULL;
tail->next = insert;
tail=insert;
}
return header;
}
/*--------------------------------------------------------*/
node delete_header(node head_a,node head_b)//删除相同节点
{
int flag;
node header1_a,header1_b,header2_a,header2_b;
header1_a = head_a;
while(header1_a->next!=NULL)
{
flag = 0;
header1_b = head_b;
while(header1_b->next!=NULL)
{
if(header1_a->next->num==header1_b->next->num)
{
header2_a=header1_a->next;
header1_a->next=header2_a->next;
free(header2_a);
header2_b=header1_b->next;
header1_b->next=header2_b->next;
free(header2_b);
flag = 1;
}
else
header1_b = header1_b->next;
}
if(flag==0)
header1_a = header1_a->next;
}
return head_a;
}
/*--------------------------------------------------------*/
void count_output(node head_a)//打印节点数和链表成员
{
int n=0;
node tail=head_a->next;
while(tail!=NULL)//节点数
{
tail = tail->next;
n++;
}
printf("%d\n",n);
tail=head_a->next;
while(tail!=NULL)//成员
{
printf("%d %d\n",tail->num,tail->scorm);
tail = tail->next;
}
}
/*--------------------------------------------------------*/
void free_head(node head_a,node head_b)//释放链表
{
node temp=head_a;//注意释放节点要保持先后顺序,否则会发生指针漂移(先找好下个节点,再释放,最后重新继承)
while(temp!=NULL)//释放a链表
{
head_a=head_a->next;
free(temp);
temp = head_a;
}
temp=head_b;
while(temp!=NULL)//释放b链表
{
head_b=head_b->next;
free(temp);
temp = head_b;
}
}
/*-----------------------主函数---------------------------------*/
int main()
{
int n,m;
node header_a,header_b;
scanf("%d%d",&n,&m);
header_a = creat(n);
header_b = creat(m);
delete_header(header_a,header_b);//删除
count_output(header_a);//输出
free_head(header_a,header_b);//释放
return 0;
}0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复