原题链接:[编程入门]链表之节点删除
参考代码:
#include <stdio.h>
#include <stdlib.h> //热知识:stdlib库里面包含malloc函数
typedef struct Linklist //初始化链表结构
{
int id; //学号
int score; //成绩
struct Linklist *next; //下一个节点的地址
} Linklist;
int main()
{
void create_a(Linklist * head_a, int n); //函数声明,下同
void create_b(Linklist * head_b, int m);
void function1(Linklist * head_a, Linklist * head_b, int n, int m);
int n, m, i;
Linklist *head_a, *head_b;
head_a = (Linklist *)malloc(sizeof(Linklist)); //创建A链表表头
if (head_a == NULL) //此为创建链表失败后出现的提示,可删除,下同
printf("A头节点创建失败");
head_b = (Linklist *)malloc(sizeof(Linklist)); //创建B链表表头
if (head_b == NULL)
printf("B头节点创建失败");
scanf("%d %d", &n, &m); //读取所给的n,m值
create_a(head_a, n); //创建链表A
create_b(head_b, m); //创建链表B
function1(head_a, head_b, n, m); //执行筛选、删除重复节点任务
return 0;
}
void create_a(Linklist *head_a, int n)
{
int i;
Linklist *p_a = head_a; //将p_a的地址初始化为A链表表头的地址
scanf("%d %d", &p_a->id, &p_a->score); // A链表表头的数据单独赋值
for (i = 0; i < n - 1; ++i) //使用尾插法创建单向链表A
{
p_a->next = (Linklist *)malloc(sizeof(Linklist));
p_a = p_a->next;
p_a->next = NULL;
if (p_a == NULL)
printf("节点创建失败");
scanf("%d %d", &p_a->id, &p_a->score);
}
}
void create_b(Linklist *head_b, int m)
{
int i;
Linklist *p_b = head_b; //将p_b的地址初始化为B链表表头的地址
scanf("%d %d", &p_b->id, &p_b->score); // B链表表头表头的数据单独赋值
for (i = 0; i < m - 1; ++i) //使用尾插法创建单向链表B
{
p_b->next = (Linklist *)malloc(sizeof(Linklist));
p_b = p_b->next;
p_b->next = NULL;
if (p_b == NULL)
printf("节点创建失败");
scanf("%d %d", &p_b->id, &p_b->score);
}
}
void function1(Linklist *head_a, Linklist *head_b, int n, int m)
{
int i, j, sum = n; // sum为A中还剩的节点数
Linklist *p_a, *p_b;
for (i = 0, p_a = head_a; i < n; ++i) //从A链表表头开始遍历所有节点
{
for (j = 0, p_b = head_b; j < m; ++j) //从B链表表头开始遍历所有节点
{
if (p_a->id == p_b->id) //注意:此为特殊解法,不为通解,当学号可能为0时,需要换种解法
{ //当A、B链表节点中的ID值相同时
p_a->id = 0; //将A节点的ID赋值为0
--sum; // A节点剩余节点数-1
}
p_b = p_b->next; //若不相同则进入B链表的下一个节点
}
p_a = p_a->next; //当B链表的节点全部遍历完后,进入A链表的下一个节点
}
printf("%d\n", sum); //输出A链表的剩余节点数
for (i = 0, p_a = head_a; i < n; ++i)
{
if (p_a->id) //通过判断节点的ID值是否为0来决定是否输出
printf("%d %d\n", p_a->id, p_a->score); //为0则输出
p_a = p_a->next; //不为0则进入下一个节点
}
}0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复