原题链接:[编程入门]链表合并
解题思路:
//用到链表的基础用法,链表中节点按照成员排序的话用插入法比较好用。
注意事项:
//第一次写链表题目
参考代码:
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点
typedef struct ListNode {
int student_number; // 节点存储的数据
int score;
struct ListNode* next; // 指向下一个节点的指针
} ListNode;
ListNode* List_create() {
return NULL; // 空链表就是返回NULL
}
// 遍历链表并打印
void List_Print(ListNode* head) { //传入的参数是结构体类型的指针,也是链表开头结构体的指针,所以也可以说是传入了链表
ListNode* current = head;
while (current != NULL) {
printf("%d %d\n", current->student_number, current->score);
current = current->next;
}
}
// 在链表末尾添加元素
void List_End_appendNode(ListNode** head, int student_number, int score) {
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode)); // 创建新节点
if (newNode == NULL) {
printf("Memory allocation failed\n");
return;
}
newNode->student_number = student_number;
newNode->score = score;
newNode->next = NULL;
if (*head == NULL) {
// 如果链表为空,新节点即为头节点
*head = newNode; //改变了头节点的地址
} //*head存储的是链表的头地址
else {
// 否则,遍历到链表末尾,将新节点添加进去
ListNode* current = *head;
while (current->next != NULL) {
current = current->next;
}
current->next = newNode;
}
}
//链表拼接
void List_Link(ListNode** head_1, ListNode** head_2) {
if (head_1 == NULL || *head_1 == NULL || head_2 == NULL || *head_2 == NULL) {
// 处理空指针的情况,比如打印错误信息或设置错误代码
return;
}
ListNode* current = *head_1;
while (current->next != NULL) {
current = current->next;
}
current->next = *head_2;
}
// 插入排序函数 ,根据student_number排序
void List_insertionSort(ListNode** head) {
ListNode* sorted = NULL; // 初始化一个空的已排序链表
ListNode* current = *head;
while (current != NULL) {
ListNode* nextTemp = current->next; // 保存当前节点的下一个节点
// 将当前节点插入到已排序链表中的正确位置,此时current->next会变更,不在与原链表连接
if (sorted == NULL || sorted->student_number >= current->student_number) {
// 如果已排序链表为空,或者当前节点应该插入到已排序链表的头部
current->next = sorted;
sorted = current;
}
else {
// 否则,在已排序链表中查找插入位置
ListNode* prev = NULL;
ListNode* temp = sorted;
while (temp != NULL && temp->student_number < current->student_number) {
prev = temp;
temp = temp->next;
}
prev->next = current; // 将当前节点插入到正确位置
current->next = temp;
}
current = nextTemp; // 移动到原始链表的下一个节点
}
*head = sorted; // 更新头指针
}
int main() {
int n, m;
scanf("%d %d", &n, &m); //两个链表元素的数量N、M,
ListNode* mylist_1; ListNode* mylist_2; //定义两个链表
mylist_1 = List_create(); //初始化链表
mylist_2 = List_create();
int student_number, score;
for (int i = 0; i < n; i++) {
scanf("%d %d", &student_number, &score);
List_End_appendNode(&mylist_1, student_number, score);
}
for (int i = 0; i < m; i++) {
scanf("%d %d", &student_number, &score);
List_End_appendNode(&mylist_2, student_number, score);
}
List_Link(&mylist_1, &mylist_2); //链表拼接
List_insertionSort(&mylist_1); //根据student_number排序
List_Print(mylist_1); //打印
return 0;
}0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复