两个集合求并集(用链表的方式)
#include<stdio.h>#include<stdlib.h>
struct LNode
{
int data;
struct LNode *next;
};
typedef struct LNode *LinkList;//表的头指针类型
void CreateListF(LinkList L, int a[], int n);
int ListLength(LinkList L);//求表的长度
int GetElem(LinkList L, int i, int *e);
int LocateElem(LinkList L, int x);
int ListInsert(LinkList *L, int x, int l);
void Union(LinkList *La, LinkList Lb);
void CreateListF(LinkList L, int a[], int n)//创建一个单链表
{
LinkList s;
int i;
L=(LinkList *)malloc(sizeof(LinkList));//创建头结点
L->next=NULL;
for(i=0; i<n; i++)
{
s=(LinkList *)malloc(sizeof(LinkList));//创建新结点
s->data=a[i];
s->next=L->next;
L->next=s;
}
}
int ListLength(LinkList L)//求表的长度
{
int i=0;
LinkList p=L->next;
while(p!=NULL)
{
i++;
p=p->next;
}
return i;
}
int GetElem(LinkList L, int i, int *e)
{
int j=1;
LinkList p;
p=L->next;
if(i<1||i>ListLength(L))
return 0;
while(j<i)
{
p=p->next;
j++;
}
e=p->data;
return (1);
}
int LocateElem(LinkList L, int x)//判断运算
{
int i=1;
struct LNode *p;
p=L->next;
while(p!= NULL &&p->data!=x)
{
p=p->next;
i++;
}
if(p==NULL)
return (0);
else return(i);
}
int ListInsert(LinkList *L, int x, int i)
{
int j=1;
LinkList p=L, s;
s=(LinkList *)malloc(sizeof(LinkList));
s->data=x;
s->next=NULL;
if(i<1||i>ListLength(L)+1)
return 0;
while(j<i)
{
p= p->next;
j++;
}
s->next=p->next;
p->next=s;
return 1;
}
void Union(LinkList *La, LinkList Lb)
{
int e;
int La_len, Lb_len;
int i;
La_len=ListLength(La);
Lb_len=ListLength(Lb);
for(i=1; i<=Lb_len; i++)
{
GetElem(Lb, i, e);
if(!LocateElem(La, e))
ListInsert(La, ++La_len, e);
}
}
int main(void)
{
struct LNode A[60];
struct LNode B[30];
int i, a;
printf("请输入A:");
for(i=0; A[i].data!='\0' ; i++)
{scanf("%d", &A[i].data);}
printf("请输入B:");
for(i=0; i<3; i++)
{scanf("%d", &B[i].data);}
printf("A是:");
CreateListF(A, A->data, 3);
CreateListF(B, B->data, 3);
Union(A, B);
for(i=0; i<6; i++)
{printf("%d", A[i].data);}
return 0;
}
大神们帮我看看我哪里错了