已有a,b两个链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,按学号 升序排序。用c语言编写这段代码
时间: 2024-03-23 22:43:41 浏览: 154
好的,以下是一个简单的C语言代码示例,实现了将两个链表合并,并按学号升序排序的功能:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表结构体
struct Node {
int no; // 学号
int score; // 成绩
struct Node* next;
};
// 定义函数用于在链表中插入结点
void insertNode(struct Node** head, int no, int score) {
struct Node* newNode = (struct Node*) malloc(sizeof(struct Node));
newNode->no = no;
newNode->score = score;
newNode->next = NULL;
if (*head == NULL) {
*head = newNode;
return;
}
struct Node* cur = *head;
while (cur->next != NULL) {
cur = cur->next;
}
cur->next = newNode;
}
// 定义函数用于合并两个链表,并按学号升序排序
struct Node* mergeList(struct Node* a, struct Node* b) {
struct Node* result = NULL;
// 如果其中一个链表为空,则直接返回另外一个链表
if (a == NULL) {
return b;
} else if (b == NULL) {
return a;
}
// 比较两个链表的第一个结点的学号大小,将小的结点加入结果链表中
if (a->no <= b->no) {
result = a;
result->next = mergeList(a->next, b);
} else {
result = b;
result->next = mergeList(a, b->next);
}
return result;
}
// 定义函数用于打印链表
void printList(struct Node* head) {
struct Node* cur = head;
while (cur != NULL) {
printf("学号:%d,成绩:%d\n", cur->no, cur->score);
cur = cur->next;
}
}
int main() {
struct Node* a = NULL;
struct Node* b = NULL;
// 初始化链表a
insertNode(&a, 1, 80);
insertNode(&a, 3, 70);
insertNode(&a, 5, 90);
// 初始化链表b
insertNode(&b, 2, 85);
insertNode(&b, 4, 75);
// 合并链表a和链表b,并按学号升序排序
struct Node* merged = mergeList(a, b);
// 打印结果链表
printf("合并后的链表为:\n");
printList(merged);
return 0;
}
```
这段代码中,我们首先定义了一个链表结构体 `Node`,包括了学号和成绩两个属性,以及指向下一个结点的指针。
然后我们定义了三个函数:`insertNode` 用于在链表中插入结点;`mergeList` 用于合并两个链表,并按学号升序排序;`printList` 用于打印链表。
在 `main` 函数中,我们初始化了两个链表 `a` 和 `b`,并调用 `mergeList` 函数将它们合并,并按学号升序排序。最后调用 `printList` 函数打印出结果链表。
阅读全文