解题思路:
//用到链表的基础用法,链表中节点按照成员排序的话用插入法比较好用。
注意事项:
//第一次写链表题目
参考代码:
#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语言程序设计教程(第三版)课后习题6.10 (C语言代码)浏览:588 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:1015 |
C语言程序设计教程(第三版)课后习题1.6 (C语言代码)浏览:689 |
【矩阵】 (C++代码)浏览:999 |
C语言程序设计教程(第三版)课后习题5.6 (C语言代码)浏览:913 |
数对 (C语言代码)浏览:762 |
C语言程序设计教程(第三版)课后习题3.7 (C语言代码)浏览:561 |
矩阵乘方 (C语言代码)浏览:1079 |
2004年秋浙江省计算机等级考试二级C 编程题(1) (C语言代码)浏览:331 |
矩形面积交 (C语言代码)浏览:1433 |