合并两顺序表,首尾相连,合并后保持数据有序C语言代码
时间: 2024-10-15 16:07:30 浏览: 35
数据结构-循环链表-C语言实现循环链表功能-数据结构学习
合并两个已排序的顺序表(也称为链表),使其成为一个新的有序链表,可以使用递归的方式来实现。这里有一个简单的C语言示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义单链表节点结构体
typedef struct Node {
int data;
struct Node* next;
} Node;
// 插入节点到已排序链表末尾
Node* insertSorted(Node* head, int value) {
if (head == NULL || head->data >= value) {
// 如果头节点为空或新值应放在头部,创建新节点作为头
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = value;
newNode->next = head;
return newNode;
} else {
// 如果头节点小于新值,递归插入到头节点之后
return insertSorted(head->next, value);
}
}
// 合并两个已排序链表
Node* mergeSortedLists(Node* list1, Node* list2) {
if (list1 == NULL) {
return list2;
}
if (list2 == NULL) {
return list1;
}
// 如果list1的数据小于list2,将list1的头节点移到结果链表
if (list1->data <= list2->data) {
list1->next = mergeSortedLists(list1->next, list2);
return list1;
} else {
list2->next = mergeSortedLists(list1, list2->next);
return list2;
}
}
// 打印链表
void printList(Node* head) {
while (head != NULL) {
printf("%d -> ", head->data);
head = head->next;
}
printf("NULL\n");
}
int main() {
Node* list1 = NULL; // 初始化第一个链表
list1 = insertSorted(list1, 5); // 插入数值
list1 = insertSorted(list1, 2);
Node* list2 = NULL; // 初始化第二个链表
list2 = insertSorted(list2, 7); // 插入数值
list2 = insertSorted(list2, 1);
Node* mergedList = mergeSortedLists(list1, list2); // 合并
printList(mergedList); // 输出合并后的链表
return 0;
}
```
这个程序首先定义了链表节点结构,并实现了插入、合并和打印链表的功能。`mergeSortedLists`函数递归地比较两个链表的头节点,并把较小的节点加入结果链表。最后,`main`函数展示了如何使用这个合并功能。
阅读全文