#包含?& ltmalloc.h & gt
typedef?struct?節點?{
int?num
struct?節點?*下壹個;
} AGG
AGG?*CreateList()?{?//?創建壹個循環鏈表並返回列表頭。
AGG?*頭,* p;
int?I,n;
Printf("節點數n?=?");
scanf("%d ",& ampn);
頭?=?p?=?(AGG?*)malloc(sizeof(AGG));?//?專用頭節點
head->;num?=?0;
Printf("輸入?%d?整數(用空格分隔):\n”,n);
對於(我?=?0;?我?& lt?n;?++i)?{
p->;下壹個?=?(AGG?*)malloc(sizeof(AGG));
scanf("%d ",& ampp->;下壹個-& gt;num);
p?=?p->;接下來;
}
p->;下壹個?=?頭;
回歸?頭;
}
作廢?RiseSort(AGG?*頭)?{?//?升序排序
AGG?*p,*s,* pt?
p?=?頭;
s?=?p->;接下來;
while(p->;下壹個?!=?頭)?{
while(s->;下壹個?!=?頭)?{
如果(p->;下壹個-& gt;num?& gt?s-& gt;下壹個-& gt;num)?{
pt?=?p->;接下來;
p->;下壹個?=?s-& gt;接下來;
s-& gt;下壹個?=?p->;下壹個-& gt;接下來;
p->;下壹個-& gt;下壹個?=?pt;
}
不然呢?s?=?s-& gt;接下來;
}
p?=?p->;接下來;
s?=?p->;接下來;
}
}
作廢?簡化(AGG?*頭)?{?//?移除相同的集合元素。
AGG?*p,*q,* s;
p?=?head->;接下來;
q?=?p->;接下來;
而(q?!=?頭)?{
如果(p->;num?==?q->;num)?{
p->;下壹個?=?q->;接下來;
s?=?q;
q?=?q->;接下來;
刪除?s;
}
不然呢?{
p?=?p->;接下來;
q?=?q->;接下來;
}
}
}
AGG?*CreateAgg()?{
AGG?*頭;
頭?=?create list();
RiseSort(頭);;
簡化(頭);
回歸?頭;
}
作廢?InsertNode(AGG?*head,int?num)?{
AGG?*t,*p?=?頭;
while(p->;下壹個?!=?頭)?{
如果(p->;下壹個-& gt;num?==?num)?返回;?
如果(p->;下壹個-& gt;num?& lt?num)?p?=?p->;接下來;
不然呢?{
t?=?(AGG?*)malloc(sizeof(AGG));
t->;num?=?num
t->;下壹個?=?p->;接下來;
p->;下壹個?=?t;
返回;
}
}
t?=(AGG?*)malloc(sizeof(AGG));
t->;num?=?num
p->;下壹個?=?t;?
t->;下壹個?=?頭;?//?鏈表末尾插入的處理
}
AGG?*MergeAgg(AGG?*A,AGG?*B)?{//?A∪B
AGG?*頭,*pa,*pb,*pc,* qc
頭?=?pc?=?(AGG?*)malloc(sizeof(AGG));
爸?=?a-& gt;接下來;
而(pa?!=?a)?{
qc?=?(AGG?*)malloc(sizeof(AGG));
QC-& gt;num?=?pa-& gt;num
PC-& gt;下壹個?=?QC;
pc?=?QC;
爸?=?pa-& gt;接下來;
}
PC-& gt;下壹個?=?頭;
pb?=?b-& gt;接下來;
而(pb?!=?b)?{
InsertNode(head,p B- & gt;num);
pb?=?pb- >接下來;
}
回歸?頭;
}
AGG?*MutualAgg(AGG?*A,AGG?*B)?{//?A∩B
AGG?*C、*pa、*pb、*pc、* qc
c?=?pc?=?(AGG?*)malloc(sizeof(AGG));
PC-& gt;num?=?0;
爸?=?a-& gt;接下來;
pb?=?b;
而(pa?!=?a)?{
pb?=?b-& gt;接下來;
而(pb?!=?b)?{
if(p B- & gt;num?==?pa-& gt;num)?{
qc?=?(AGG?*)malloc(sizeof(AGG));
QC-& gt;num?=?pb- >num
PC-& gt;下壹個?=?QC;
pc?=?QC;
}
pb?=?pb- >接下來;
}
爸?=?pa-& gt;接下來;
}
PC-& gt;下壹個?=?c;
回歸?c;
}
AGG?*DifferAgg(AGG?*A,AGG?*B)?{?//?返回a和b的差集?A-B
AGG?*head,*p,*q,* r;
int?標簽;
頭?=?r?=?(AGG?*)malloc(sizeof(AGG));
對於(p?=?a-& gt;接下來;?p?!=?a;?p?=?p->;下壹個)?{
標簽?=?1;
對於(q?=?b-& gt;接下來;?q?!=?b?& amp& amp?標簽;?q?=?q->;下壹個)
標簽?=?p->;num?!=?q->;num
如果(標簽)?{
r-& gt;下壹個?=?(AGG?*)malloc(sizeof(AGG));
r?=?r-& gt;接下來;
r-& gt;num?=?p->;num
}
}
對於(p?=?b-& gt;接下來;?p?!=?b;?p?=?p->;下壹個)?{
標簽?=?1;
對於(q?=?a-& gt;接下來;?q?!=?答?& amp& amp?標簽;?q?=?q->;下壹個)
標簽?=?p->;num?!=?q->;num
如果(標簽)?{
r-& gt;下壹個?=?(AGG?*)malloc(sizeof(AGG));
r?=?r-& gt;接下來;
r-& gt;num?=?p->;num
}
}
r-& gt;下壹個?=?頭;
RiseSort(頭);
回歸?頭;
}
作廢?PrintList(AGG?*頭)?{
AGG?*p?=?head->;接下來;
矮?櫃臺?=?0;
而(p?!=?頭)?{
如果(計數器?& amp& amp?計數器%10?==?0)?printf(" \ n ");
printf("%5d ",p-& gt;num);
counter++;
p?=?p->;接下來;
}
如果(計數器?%?10)?printf(" \ n ");
}
作廢?freeheap(AGG?*頭)?{
AGG?*p,* q;
p?=?頭;
q?=?p->;接下來;
而(q?!=?頭)?{
p?=?q;
q?=?p->;接下來;
免費(p);
}
免費(頭);
}
int?main()?{
AGG?* A *、B *、C *、D *、E;
Printf("創建收藏?a:\ n ");
答?=?create agg();
Printf("創建收藏?b:\ n ");
b?=?create agg();
Printf("集合A的元素為:\ n ");
打印列表(A);
Printf("集合B的元素是:\ n ");
打印列表(B);
c?=?MutualAgg(A,B);
Printf("交集?c?=?a∩B:\ n ");
打印列表(C);
Printf ("Union?d?=?A∪B?:\ n ");
d?=?MergeAgg(A,B);
打印列表(D);
Printf("差集?d?=?A-B?:\ n ");
e?=?DifferAgg(A,B);
打印列表(E);
free heap(A);
free heap(B);
free heap(C);
free heap(D);
自由堆(E);
printf(" \ n \ n ");
回歸?0;
}