#include <iostream>
#include<stdio.h>
#include<malloc.h>
#include<cstdio>
using namespace std;
typedef int datatype;
typedef struct LNode
{
datatype data;
struct LNode* next;
} LinkList;
void DispList(LinkList* L)
{
LinkList* p = L->next;
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
void DestroyList(LinkList*& L)
{
LinkList* p = L->next, * pre = L;
while (p != NULL)
{
free(pre);
pre = p;
p = pre->next;
}
free(pre);
}
LinkList * CreateListF()//尾插法建立单链表
{
LinkList* head, * p, * r, * s;
datatype CreateListF_num;
int n;
printf("创立一个链表,大小为:");
scanf("%d", &n);
head = (LinkList*)malloc(sizeof(LinkList));
head->next = NULL;
r = head;
printf("输入以空格隔开的十进制整数:");
for (int i = 1, k = 1; i <= n; i++, k++)
{
int flag = 1;
s = head->next;
scanf("%d", &CreateListF_num);
for (int j = 1; j < k; j++, s = s->next)
{
if (CreateListF_num == s->data)
{
flag = 0;
k--;
break;
}
}
if (flag)
{
p = (LinkList*)malloc(sizeof(LinkList));
p->data = CreateListF_num;
r->next = p;
r = p;
}
}
r->next = NULL;
return head;
}
///从小到大排序
void sort(LinkList* L)
{
LinkList* pre, * p, * q;
if (L->next != NULL)
{
p = L->next->next;
L->next->next = NULL;
while (p != NULL)
{
q = p->next;
pre = L;
while (pre->next != NULL && pre->next->data < p->data)
pre = pre->next;
p->next = pre->next;
pre->next = p;
p = q;
}
}
}
void Delete(LinkList* head)
{
if (head->next != NULL)
{
LinkList* p = head->next, * r = head, * q;
while (p->next)
{
if (p->data == p->next->data)
{
q = p->next;
p->next = q->next;
free(q);
}
else
p = p->next;
}
}
}
///求集合的并
void Union(LinkList* ha, LinkList* hb, LinkList*& hc)
{
LinkList* pa = ha->next, * pb = hb->next, * pc, * s;
hc = (LinkList*)malloc(sizeof(LinkList));
pc = hc;
while (pa != NULL && pb != NULL)
{
if (pa->data < pb->data)
{
s = (LinkList*)malloc(sizeof(LinkList));
s->data = pa->data;
pc->next = s;
pc = s;
pa = pa->next;
}
else if (pa->data > pb->data)
{
s = (LinkList*)malloc(sizeof(LinkList));
s->data = pb->data;
pc->next = s;
pc = s;
pb = pb->next;
}
else
{
s = (LinkList*)malloc(sizeof(LinkList));
s->data = pa->data;
pc->next = s;
pc = s;
pa = pa->next;
pb = pb->next;
}
}
if (pb != NULL)
pa = pb;
while (pa != NULL)
{
s = (LinkList*)malloc(sizeof(LinkList));
s->data = pa->data;
pc->next = s;
pc = s;
pa = pa->next;
}
pc->next = NULL;
}
///求两个有序集合的交用尾插法
void InterSect(LinkList* ha, LinkList* hb, LinkList*& hc)
{
LinkList* pa = ha->next, * pb, * pc, * s;
hc = (LinkList*)malloc(sizeof(LinkList));
pc = hc;
while (pa != NULL)
{
pb = hb->next;
while (pb != NULL && pb->data < pa->data)
pb = pb->next;
if (pb != NULL && pb->data == pa->data)///B 节点在 A 节点中复制 A 节点
{
s = (LinkList*)malloc(sizeof(LinkList));
s->data = pa->data;
pc->next = s;
pc = s;
}
pa = pa->next;
}
pc->next = NULL;
}
///求两个有序集合的差
void Subs(LinkList* ha, LinkList* hb, LinkList*& hc)
{
LinkList* pa = ha->next, * pb, * pc, * s;
hc = (LinkList*)malloc(sizeof(LinkList));
pc = hc;
while (pa != NULL)
{
pb = hb->next;
while (pb != NULL && pb->data < pa->data)
pb = pb->next;
if (!(pb != NULL && pb->data == pa->data))///B 节点不在 A 节点中复制 A 节点
{
s = (LinkList*)malloc(sizeof(LinkList));
s->data = pa->data;
pc->next = s;
pc = s;
}
pa = pa->next;
}
pc->next = NULL;
}
int main()
{
LinkList* ha, * hb, * hc;
ha = CreateListF();
hb = CreateListF();
printf(" 集合的运算如下:\n");
printf(" 原集合 A: ");
DispList(ha);
printf(" 原集合 B: ");
DispList(hb);
sort(ha);
sort(hb);
Delete(ha);
Delete(hb);
printf(" 有序集合 A: ");
DispList(ha);
printf(" 有序集合 A: ");
DispList(ha);
Union(ha, hb, hc);
printf(" 集合的并 C: ");
DispList(hc);
InterSect(ha, hb, hc);
printf(" 集合的交 C: ");
DispList(hc);
Subs(ha, hb, hc);
printf(" 集合的差 C: ");
DispList(hc);
DestroyList(ha);
DestroyList(hb);
DestroyList(hc);
return 0;
}
集合的交叉并补
最新推荐文章于 2023-09-09 15:57:59 发布