设有链表 A 和B,其中的数据内容均为整型数值,且都按增序排列,生成新的链表 C、D,满足下列要求:(1)C=AUB(C 中元素为 A 和 B 的并集)(2)D=A-B (D 中元素为在 A 中出现但不在 B 中出现的元素)且 C、D 元素都按增序排列。
输入: 键盘输入链表 A 的数据元素(至少 5 个)键盘输入链表 B 的数据元素(至少 5 个)
输出:屏幕分别打印链表 A,B,C,D 的数据元素。
# include <stdio.h>
# include <stdlib.h>
typedef int ElemType;
typedef struct Node
{
ElemType data;
struct Node *next;
}LNode, *LinkList;
void CreateList(LinkList &L,int n)//建立有n个元素的线性链表L
{
LinkList p,s;
int i;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
p=L;
if(n!=0)
printf("请按赠序依次输入数据元素\n");
for(i=0;i<n;i++)
{
s=(LinkList)malloc(sizeof(LNode));
scanf("%d",&s->data);
p->next=s;
p=p->next;
}
p->next=NULL;
}
void ListPrint(LinkList L)//输出链表
{
LinkList p;
int i;
p=L->next;
if(!p) printf("ERROR!\n");
for(i=0;p;i++)
{
printf("%d\t",i+1,p->data);
p=p->next;
}
}
void ListInsert(LinkList &L,int i,ElemType e)//在第i个位置插入元素e
{
LinkList p,s;
int j;
p=L;
for(j=0;p&&j<i-1;j++)
p=p->next;
if(!p||j>i-1) {printf("ERROR!\n"); return;}
s=(LinkList)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
}
void GetUnionSet(LinkList A,LinkList B,LinkList C)//求A、B并集C
{
LinkList a,b;
int i;
a=A->next;
b=B->next;
for(i=0;a||b;i++)
{
if(a&&b)
{
if(a->data==b->data)
{
b=b->next;
i--;
}
else if(a->data<b->data)
{
ListInsert(C,i+1,a->data);
a=a->next;
}
else
{
ListInsert(C,i+1,b->data);
b=b->next;
}
}
else if(a)
{
ListInsert(C,i+1,a->data);
a=a->next;
}
else
{
ListInsert(C,i+1,b->data);
b=b->next;
}
}
}
void GetDiffElem(LinkList A,LinkList B,LinkList D)//获得线性链表D,D中元素为在A中出现但不在B中出现的元素
{
LinkList a,b;
int i=0;
a=A->next;
b=B->next;
while(a)
{
if(a->data==b->data)
{
a=a->next;
b=b->next;
}
else if(!b)
{
ListInsert(D,i+1,a->data);
a=a->next;
i++;
}
else if(a->data<b->data)
{
ListInsert(D,i+1,a->data);
a=a->next;
i++;
}
else b=b->next;
}
}
int main()
{
LinkList A,B,C,D;
int n1,n2;
printf("请输入A的数据元素个数n1:\n");
scanf("%d",&n1);
CreateList(A,n1);
printf("请输入B的数据元素个数n2:\n");
scanf("%d",&n2);
CreateList(B,n2);
CreateList(C,0);
CreateList(D,0);
GetUnionSet(A,B,C);
GetDiffElem(A,B,D);
printf("\n输出表A\n");
ListPrint(A);
printf("\n输出表B\n");
ListPrint(B);
printf("\n输出表C\n");
ListPrint(C);
printf("\n输出表D\n");
ListPrint(D);
printf("\n");
return 0;
}