c语言中两个有序线性表的合并,要求同样的数据元素只出现一次
时间: 2024-11-25 17:11:44 浏览: 38
在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* mergeAndRemoveDuplicates(Node* list1, Node* list2) {
Node* dummy = (Node*)malloc(sizeof(Node)); // 创建虚拟头节点
dummy->next = list1;
Node* temp = dummy;
while (list1 && list2) {
if (list1->data < list2->data || (list1->data == list2->data && list1->next)) { // 如果list1的数据小于list2或者相等但list1还有后续元素
temp->next = list1;
list1 = list1->next;
} else {
temp->next = list2;
list2 = list2->next;
}
temp = temp->next;
}
// 将剩余的链表添加到结果中
if (list1) temp->next = list1;
if (list2) temp->next = list2;
return dummy->next; // 返回实际的头节点
}
// 打印链表
void printList(Node* node) {
while (node != NULL) {
printf("%d -> ", node->data);
node = node->next;
}
printf("NULL\n");
}
int main() {
Node* list1 = createNode(1);
list1->next = createNode(3);
list1->next->next = createNode(5);
Node* list2 = createNode(2);
list2->next = createNode(4);
list2->next->next = createNode(4);
list2->next->next->next = createNode(6);
Node* mergedList = mergeAndRemoveDuplicates(list1, list2);
printf("Merged and de-duplicated sorted list:\n");
printList(mergedList);
return 0;
}
```
阅读全文