两个链式存储的线性表LA和LB,其元素均按从小到大的顺序排列,编写一个算法,将他们合并为一个递增的链表,要求利用原表(LA和LB)的节点空间构造LC,要求利用原表使用C语言
时间: 2024-11-15 11:29:04 浏览: 12
一算法可实现两个非递减的线性表的合并,采用链式存储结构,能够输出合并前和合并后链表的内容
要合并两个已排序的链表LA和LB,并创建一个新的递增链表LC,你可以按照以下步骤来编写C语言算法:
```c
#include <stdio.h>
#include <stdlib.h>
// 链表节点结构体
typedef struct Node {
int data;
struct Node* next;
} Node;
// 创建新节点并插入值
Node* createNode(int value) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (newNode != NULL) {
newNode->data = value;
newNode->next = NULL;
}
return newNode;
}
// 合并两个有序链表
Node* mergeSortedLists(Node* LA, Node* LB) {
// 创建头节点指向空
Node* LC = NULL;
// 当两个链表都不为空
while (LA && LB) {
// 如果LA的节点小于LB的节点,将LA的节点添加到LC
if (LA->data <= LB->data) {
if (!LC) {
LC = LA; // 将头节点设置为LA
} else {
LA->next = LC; // LA的下一个节点连接到LC
}
LA = LA->next; // 移动LA指针
} else { // 否则,将LB的节点添加到LC
if (!LC) {
LC = LB; // 将头节点设置为LB
} else {
LB->next = LC; // LB的下一个节点连接到LC
}
LB = LB->next; // 移动LB指针
}
}
// 添加剩余的链表节点(如果其中一个链表已经遍历完)
if (LA) {
LC->next = LA;
} else {
LC->next = LB;
}
return LC;
}
// 打印链表
void printList(Node* head) {
Node* temp = head;
while (temp) {
printf("%d -> ", temp->data);
temp = temp->next;
}
printf("NULL\n");
}
int main() {
// 初始化LA和LB示例,这里省略实际初始化过程
Node* LA = ...;
Node* LB = ...;
// 合并链表
Node* LC = mergeSortedLists(LA, LB);
// 打印合并后的链表
printList(LC);
// 清理内存(注意在实际项目中执行此操作)
free(LA);
free(LB);
return 0;
}
```
这个算法首先检查每个链表的头部节点,选择较小的一个添加到结果链表LC。然后,移动对应的链表指针,直到其中一个链表遍历完。最后,将剩余未遍历完的链表接到LC的尾部。
阅读全文