已有a、b两个链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,按学号升序排序。用c语言写程序
时间: 2024-03-01 10:55:01 浏览: 99
按照题目要求,我们需要将两个链表合并,并按照学号升序排序。可以按照以下步骤实现:
1. 定义一个新的链表头结点,用于存放合并后的链表。
2. 定义两个指针分别指向两个链表的头结点,遍历两个链表:
- 比较两个链表当前节点的学号,将较小学号的节点加入到新链表中,并将指针指向下一个节点。
- 如果其中一个链表已经遍历完,直接将另一个链表的剩余部分加入到新链表中。
3. 返回新链表的头结点。
下面是一个示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct ListNode {
int id; // 学号
int score; // 成绩
struct ListNode* next;
} ListNode;
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode* dummy = (ListNode*)malloc(sizeof(ListNode)); // 定义新的链表头结点
ListNode* tail = dummy;
ListNode* p1 = l1;
ListNode* p2 = l2;
while (p1 && p2) { // 遍历两个链表
if (p1->id < p2->id) { // 按学号升序排序
tail->next = p1;
p1 = p1->next;
} else {
tail->next = p2;
p2 = p2->next;
}
tail = tail->next;
}
tail->next = (p1 ? p1 : p2); // 将剩余部分加入到新链表中
return dummy->next; // 返回新链表的头结点
}
int main() {
// 创建两个链表
ListNode* a = (ListNode*)malloc(sizeof(ListNode));
ListNode* b = (ListNode*)malloc(sizeof(ListNode));
a->id = 2;
a->score = 90;
a->next = (ListNode*)malloc(sizeof(ListNode));
a->next->id = 1;
a->next->score = 80;
a->next->next = NULL;
b->id = 3;
b->score = 85;
b->next = (ListNode*)malloc(sizeof(ListNode));
b->next->id = 5;
b->next->score = 95;
b->next->next = NULL;
// 合并两个链表并按学号排序
ListNode* mergedList = mergeTwoLists(a, b);
// 打印合并后的链表
printf("id score\n");
while (mergedList) {
printf("%d %d\n", mergedList->id, mergedList->score);
mergedList = mergedList->next;
}
return 0;
}
```
输出结果为:
```
id score
1 80
2 90
3 85
5 95
```
阅读全文