原题链接:[编程入门]链表之节点删除
解题思路:
创建两个链表,首先是每个内部没有重复的值,但是在不同的链表之间有重复的值,因此只要判定有一个相同,就可以判断第一个链表的下一个节点 对应有n个节点的那个);在进行判断时要注意,使用while循环
注意事项:
1:如下的代码中 2:不要将m和n的位置弄乱了
参考代码:
/*为了方便头指针的使用,在下面的代码中先申请head的空间,然后就对head对应的值进行赋初值*/
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
typedef struct stu
{
int serial_number;
int score;
struct stu* next;
}*stu0, stu1;
int main()
{
int n, m, i = 0, j = 1;
//j的作用:用来判断是否在一次外循环中找到了要删除的对象,在这里将j赋初值为1是
//因为在下面的代码中,当进行了删除后将会把p推进1(p和q均是结构体指针,在本题中我
//以p为先,q为后),因而就不执行下面的p=向前推进1了
//n表示的是第一个链表的节点个数,m表示的是第二个的
scanf("%d%d", &n, &m);
stu0 head0 = (stu0)malloc(sizeof(stu1)), head1 = (stu0)malloc(sizeof(stu1)), p = NULL, q = NULL, pq = NULL;
//习惯上以前为先即p
if (head0 == NULL || head1 == NULL)
//判断是否有足够的空间,没有则退出
{
printf("There is not enough memery");
exit(-1);
//位于标准库中
}
scanf("%d%d", &head0->serial_number, &head0->score);
//数据的读入
head0->next = head1->next = NULL;
p = head0;
while (i < n - 1)
{
q = (stu0)malloc(sizeof(stu1));
q->next = NULL;
scanf("%d%d", &q->serial_number, &q->score);
p->next = q;
p = q;
i++;
}
scanf("%d%d", &head1->serial_number, &head1->score);
//在这里%d之间可以加空格
p = head1;
i = 0;
while (i < m - 1)
{
q = (stu0)malloc(sizeof(stu1));
q->next = NULL;
scanf("%d%d", &q->serial_number, &q->score);
p->next = q;
p = q;
i++;
}
p = head0;
q = head1;
while(p)
//外层循环,对head0 进行遍历
{
q = head1;
j = 1;
if (p == NULL)
{
break;
}
while(q)
//内层循环,对q进行遍历
{
if (p->serial_number == q->serial_number)
{
j = 0;
if (p == head0)
{
head0 = p->next;
free(p);
p = head0;
break;
}
else if (p->next == NULL)
{
free(p);
pq->next = NULL;
p = NULL;
break;
}
else
{
pq->next = p->next;
free(p);
p = pq->next;
break;
}
}
else
{
q = q->next;
}
}
if (j == 1)
{
pq = p;
p = p->next;
}
}
for (p = head0, i = 0; p; i++, p = p->next);
//用i来计数看看留下了多少个节点
//也可以将i和j的使用合并,就可以少申请一个空间
printf("%d\n", i);
for (p = head0; p; p = p->next)
{
printf("%d %d\n", p->serial_number, p->score);
//在这里,用for循环语句就可以和方便地输出所有的节点
}
}0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复