将线性表看成是集合,写一个函数求两个集合的并集 要求: (1)线性表可能有重复的元素,要对线性表去除重复的元素(可以调用去重函数)。 (2)写主函数调用该函数,进行正确性测试。用c语言数据结构desktop中实现
时间: 2024-09-23 14:17:04 浏览: 86
在C语言中,我们可以使用数组或动态内存分配的结构体(如链表)来表示线性表,并通过遍历的方式来合并两个线性表并去除重复元素。这里我们假设有一个简单的链表节点结构体`ListNode`,其中包含一个整数值`val`和指向下一个节点的指针`next`。下面是一个示例,展示了如何编写一个函数`mergeAndRemoveDuplicates`来实现这个功能:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构
typedef struct ListNode {
int val;
struct ListNode* next;
} ListNode;
// 去除链表中的重复元素
ListNode* removeDuplicates(ListNode* head) {
if (head == NULL || head->next == NULL) return head;
ListNode* current = head, *prev = NULL;
while (current != NULL) {
ListNode* temp = current->next;
while (temp != NULL && temp->val == current->val) {
temp = temp->next;
}
if (prev == NULL || prev->val != current->val) {
prev->next = current;
} else {
prev->next = temp;
}
prev = current;
current = temp;
}
return head;
}
// 合并并去除重复的线性表
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
// 如果list1为空,则直接返回list2
if (list1 == NULL) return list2;
// 合并两个列表
ListNode* merged = removeDuplicates(list1);
if (list2 == NULL) return merged;
while (list2 != NULL) {
if (merged->val < list2->val) {
merged->next = list2;
merged = merged->next;
} else {
ListNode* insertHere = merged;
while (insertHere->next != NULL && insertHere->next->val < list2->val)
insertHere = insertHere->next;
insertHere->next = list2;
list2 = list2->next;
}
}
return merged;
}
// 主函数用于测试
void testMerge() {
// 创建两个线性表示例
ListNode* list1 = createLinkedList({1, 2, 3, 4});
ListNode* list2 = createLinkedList({2, 3, 5, 6});
// 调用合并函数
ListNode* result = mergeTwoLists(list1, list2);
// 打印结果
printLinkedList(result);
// 清理内存
destroyLinkedList(result);
}
// 辅助函数,创建链表
ListNode* createLinkedList(int values[]) {
ListNode* head = NULL, *tail = NULL;
for (int i : values) {
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->val = i;
newNode->next = NULL;
if (head == NULL) {
head = tail = newNode;
} else {
tail->next = newNode;
tail = newNode;
}
}
return head;
}
// 辅助函数,打印链表
void printLinkedList(ListNode* head) {
while (head != NULL) {
printf("%d ", head->val);
head = head->next;
}
printf("\n");
}
// 辅助函数,释放链表内存
void destroyLinkedList(ListNode* head) {
ListNode* temp;
while (head != NULL) {
temp = head;
head = head->next;
free(temp);
}
}
// 主函数入口
int main() {
testMerge();
return 0;
}
```
在这个示例中,我们首先创建了两个链表`list1`和`list2`,然后调用`mergeTwoLists`函数将它们合并并去除重复元素。最后,在`main`函数中测试了合并后的结果。注意,你需要自定义`createLinkedList`、`printLinkedList`和`destroyLinkedList`这些辅助函数来处理链表的具体操作。
阅读全文