解题思路:
//用到链表的基础用法,链表中节点按照成员排序的话用插入法比较好用。
注意事项:
//第一次写链表题目
参考代码:
#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语言训练-素数问题 (C语言代码)浏览:1684 |
剪刀石头布 (C语言代码)不知道怎么直接在scanf中用枚举变量浏览:1420 |
WU-整数平均值 (C++代码)浏览:1293 |
剪刀石头布 (C++代码)浏览:1802 |
C语言程序设计教程(第三版)课后习题12.5 (C语言代码)浏览:791 |
C二级辅导-等差数列 (C语言代码)浏览:875 |
青年歌手大奖赛_评委会打分 (C语言代码)浏览:2227 |
求圆的面积 (C语言代码)浏览:705 |
C语言程序设计教程(第三版)课后习题8.1 (C++代码)浏览:606 |
龟兔赛跑预测 (C++代码)浏览:1204 |