帮我用c语言有序链表写一个集合交并差运算的算法
时间: 2023-05-21 16:06:47 浏览: 189
好的,以下是一个使用有序链表实现集合交、并、差运算的算法:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义有序链表结点的结构体
typedef struct node{
int data;
struct node* next;
}Node, *List;
// 创建一个空链表,返回头结点
List createList(){
List head = (List)malloc(sizeof(Node));
head->next = NULL;
return head;
}
// 向链表中插入元素,保证链表的有序性
void insert(List L, int x){
List p = L->next, s = L;
while(p && p->data < x){
s = p;
p = p->next;
}
if(p && p->data == x){
return;
}
List newNode = (List)malloc(sizeof(Node));
newNode->data = x;
s->next = newNode;
newNode->next = p;
}
// 集合并运算,将两个有序链表合并成一个新的有序链表
List merge(List L1, List L2){
List result = createList(), p = result, p1 = L1->next, p2 = L2->next;
while(p1 && p2){
if(p1->data < p2->data){
p1 = p1->next;
}
else if(p1->data > p2->data){
p2 = p2->next;
}
else{
List newNode = (List)malloc(sizeof(Node));
newNode->data = p1->data;
p->next = newNode;
p = p->next;
p1 = p1->next;
p2 = p2->next;
}
}
p->next = NULL;
return result;
}
// 集合交运算,将两个有序链表的共有元素取出组成一个新的有序链表
List intersect(List L1, List L2){
List result = createList(), p = result, p1 = L1->next, p2 = L2->next;
while(p1 && p2){
if(p1->data < p2->data){
p1 = p1->next;
}
else if(p1->data > p2->data){
p2 = p2->next;
}
else{
List newNode = (List)malloc(sizeof(Node));
newNode->data = p1->data;
p->next = newNode;
p = p->next;
p1 = p1->next;
p2 = p2->next;
}
}
p->next = NULL;
return result;
}
// 集合差运算,将第一个有序链表中不在第二个有序链表中的元素取出组成一个新的有序链表
List difference(List L1, List L2){
List result = createList(), p = result, p1 = L1->next, p2 = L2->next;
while(p1 && p2){
if(p1->data < p2->data){
List newNode = (List)malloc(sizeof(Node));
newNode->data = p1->data;
p->next = newNode;
p = p->next;
p1 = p1->next;
}
else if(p1->data > p2->data){
p2 = p2->next;
}
else{
p1 = p1->next;
p2 = p2->next;
}
}
while(p1){
List newNode = (List)malloc(sizeof(Node));
newNode->data = p1->data;
p->next = newNode;
p = p->next;
p1 = p1->next;
}
p->next = NULL;
return result;
}
// 打印链表
void printList(List L){
List p = L->next;
while(p){
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
// 主函数
int main(){
List L1 = createList(), L2 = createList();
int n, m, x;
printf("请输入第一个有序链表的长度:");
scanf("%d", &n);
printf("请输入第一个有序链表的元素:");
for(int i = 0; i < n; i++){
scanf("%d", &x);
insert(L1, x);
}
printf("第一个有序链表为:");
printList(L1);
printf("请输入第二个有序链表的长度:");
scanf("%d", &m);
printf("请输入第二个有序链表的元素:");
for(int i = 0; i < m; i++){
scanf("%d", &x);
insert(L2, x);
}
printf("第二个有序链表为:");
printList(L2);
printf("两个有序链表的并集为:");
printList(merge(L1, L2));
printf("两个有序链表的交集为:");
printList(intersect(L1, L2));
printf("第一个有序链表减去第二个有序链表的差集为:");
printList(difference(L1, L2));
return 0;
}
```
如果你有其他问题,欢迎提出。
阅读全文