假设有两个按元素值递增有序排列的线性表[1A和B,均以单链表作为存储结构,请编写算法将A表和B表归并成一个按元素值递减有序(即非 递增有序,允许表中含有值相同的元素)排列的线性表C,并要求利用原表(即A表和B表)的结点图空间构造C表。c语言实现
时间: 2024-09-23 12:16:54 浏览: 52
已知线性表中的元素以值递增有序排列,并以单链表作存储结构。试写一高效的算法,删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同)
在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));
newNode->data = value;
newNode->next = NULL;
return newNode;
}
// 归并两个有序链表
Node* mergeSortedLists(Node* headA, Node* headB) {
if (headA == NULL) return headB;
if (headB == NULL) return headA;
// 指向当前列表中的最小元素
Node* minHead = (headA->data <= headB->data) ? headA : headB;
// 将未选择的头移到下一个
headA = (minHead == headA) ? headA->next : NULL;
headB = (minHead == headB) ? headB->next : NULL;
// 创建新的归并后的链表头
Node* result = createNode(minHead->data);
// 逆序插入较小元素
while (headA != NULL && headB != NULL) {
if (headA->data > headB->data) {
result->next = createNode(headA->data);
result = result->next;
headA = headA->next;
} else {
result->next = createNode(headB->data);
result = result->next;
headB = headB->next;
}
}
// 如果其中一个链表还有剩余元素,直接添加到结果链表的末尾
if (headA != NULL) {
result->next = headA;
} else if (headB != NULL) {
result->next = headB;
}
return result;
}
// 打印链表
void printList(Node* head) {
while (head != NULL) {
printf("%d ", head->data);
head = head->next;
}
printf("\n");
}
int main() {
// 初始化两个有序链表A和B...
// 这里假设它们已经按照题目要求初始化好了
Node* listC = mergeSortedLists(headA, headB);
// 打印归并后的链表C
printList(listC);
return 0;
}
```
阅读全文