原题链接:[编程入门]链表合并
解题思路:
链表的优势在于插入数据时的高效性
注意事项:
单向链表节点之间的关系就像糖葫芦一样,一个连着一个,想吃(访问)他们其中的一个就得先访问前面的节点,将节点串一起的“棍子”就是结构体里的指针next。
(这里每个链表的第一个节点不存储数据)
参考代码:
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>
struct note
{
int num;
int score;
struct note* next;
};//创建链表节点的结构体(节点内部含有数据)
struct note new1(int n)
{
struct note* rear,hearder;
hearder.next = NULL;
rear = &hearder;
hearder.num = -1;
for (int i = 0; i < n; i++)
{
int num0,score0;
scanf("%d %d",&num0,&score0);
struct note* newnote = (struct note*)malloc(sizeof(struct note));
newnote->num = num0;
newnote->score = score0;
newnote->next = NULL;
rear->next = newnote;
rear = newnote;
}
return hearder;//返回第一个节点(第一个节点不存储数据)
}//创建新链表的函数
void sort1(struct note *hearder)
{
struct note* rear = hearder;
struct note* i = hearder;
i->num = -1;
while (rear != NULL)
{
for (i = hearder; i != rear; i = i->next)
{
if (i->num > rear->num)
{
struct note tmp;
tmp.num = i->num;
tmp.score = i->score;
tmp.next = NULL;
i->num = rear->num;
i->score = rear->score;
rear->num = tmp.num;
rear->score = tmp.score;
continue;
}
}
rear = rear->next;
}
}//将链表按学号从小到大排序的函数
int main()
{
int n1, n2;
scanf("%d %d", &n1, &n2);
struct note note1 = new1(n1);
struct note note2 = new1(n2);
for (struct note* i = ¬e1; i != NULL;i = i->next)
if (i->next == NULL)
{
i->next = note2.next;
break;
}//将两个链表连接在一起(注意不要将首节点也接上去)
sort1(¬e1);
for (struct note* i = ¬e1; i != NULL; i = i->next)
if (i->num != -1)
printf("%d %d\n", i->num, i->score);//打印
return 0;
}0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复