目的:
掌握单链表的应用和有序单链表的二路归并算法设计。
内容:
编写程序,采用单链表表示集合(假设同一个结合中不存在重复的元素),将其按递增方式排序,构成有序单链表,并求这样的两个集合的并、交和差。
这里一定要建新表,不要在原来的表上改,不然后面全错了,血的教训,浪费了我贼多时间。
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType; //元素的数据类型
typedef struct LNode {
ElemType data; //结点的数据域
struct LNode *next; //指向后继结点
} LinkNode; //单链表结点类型
//尾插法建立单链表,细节不表
void CreateListR(LinkNode *&L, ElemType a[], int n);
//输出线性表,细节不表
void DispList(LinkNode *L);
//求两个有序集合的并
void Union(LinkNode *A, LinkNode *B, LinkNode *&C);
//求两个有序集合的交
void InterSect(LinkNode *A, LinkNode *B, LinkNode *&C);
//求两个有序集合的差
void Subs(LinkNode *A, LinkNode *B, LinkNode *&C);
int main()
{
LinkNode *A, *B, *C;
int n, m;
scanf("%d", &n);
ElemType a[n];
for (int i = 0; i < n; i++)
scanf("%d", &a[i]);
scanf("%d", &m);
ElemType b[m];
for (int i = 0; i < m; i++)
scanf("%d", &b[i]);
CreateListR(A, a, n);
CreateListR(B, b, m);
Union(A, B, C);
printf("集合A与B的并: ");
DispList(C);
InterSect(A, B, C);
printf("集合A与B的交: ");
DispList(C);
//DispList(A);
//DispList(B);
Subs(A, B, C);
printf("集合A与B的差: ");
DispList(C);
return 1;
}
/* 请在下面填写答案 */
void CreateListR(LinkNode *&L, ElemType a[], int n)
{
L=(LinkNode *)malloc(sizeof(LinkNode));
L->next=NULL;
LinkNode *p,*r=L;
for(int i=0;i<n;i++)
{
p=(LinkNode *)malloc(sizeof(LinkNode));
p->data=a[i];
r->next=p;
r=p;
}
r->next=NULL;
}
void DispList(LinkNode *L)
{
if(L->next==NULL) printf("NULL");
else{
LinkNode *p=L->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
}
printf("\n");
}
///这里千万要建立新表
///否则A,B表就会改变,影响下面的操作
void Union(LinkNode *A, LinkNode *B, LinkNode *&C)
{
C=(LinkNode *)malloc(sizeof(LinkNode));
LinkNode *i=A->next,*j=B->next,*r=C,*p;
while(i&&j)
{
if(i->data<j->data)
{
p=(LinkNode *)malloc(sizeof(LinkNode));
p->data=i->data;
r->next=p;
r=p;
i=i->next;
}
else if(i->data>j->data)
{
p=(LinkNode *)malloc(sizeof(LinkNode));
p->data=j->data;
r->next=p;
r=p;
j=j->next;
}
else{
p=(LinkNode *)malloc(sizeof(LinkNode));
p->data=j->data;
r->next=p;
r=p;
i=i->next;
j=j->next;
}
}
if(j) r->next=j;
if(i) r->next=i;
}
///这里也必须建立新表
///否则A,B表就会改变,影响下面的操作
void InterSect(LinkNode *A, LinkNode *B, LinkNode *&C)
{
C=(LinkNode *)malloc(sizeof(LinkNode));
LinkNode *i=A->next,*j=B->next,*r=C,*p;
while(i&&j)
{
if(i->data<j->data) i=i->next;
else if(i->data>j->data) j=j->next;
else{
p=(LinkNode *)malloc(sizeof(LinkNode));
p->data=i->data;
r->next=p;
r=p;
i=i->next;
j=j->next;
}
}
r->next=NULL;
}
void Subs(LinkNode *A, LinkNode *B, LinkNode *&C)
{
C=(LinkNode *)malloc(sizeof(LinkNode));
LinkNode *i=A->next,*j=B->next,*r=C,*p;
while(i&&j)
{
if(i->data<j->data)
{
p=(LinkNode *)malloc(sizeof(LinkNode));
p->data=i->data;
r->next=p;
r=p;
i=i->next;
}
else if(i->data>j->data)
{
j=j->next;
}
else{
i=i->next;
j=j->next;
}
}
if(i) r->next=i; ///如果A有剩余
else r->next=NULL;
}