#include
#include
struct LNode
{
int data;
struct LNode *next;
};
typedef struct LNode LinkList;//表的头指针类型//定义的结构体别名为指针类型
LinkList *CreateListF(int a[], int n); //把结构体指针定义到创建函数中int ListLength(LinkList L);//求表的长度int GetElem(LinkList *p, int i, int *e); //要用指针才能找到下一个地址int LocateElem(LinkList L, int x);
int ListInsert(LinkList *L, int x, int l);
LinkList *Union(LinkList *La, LinkList *Lb); //参数一个是指针, 一个不是指针。。。
LinkList *CreateListF(int *a, int n)//创建一个单链表{
LinkList *L, *s, *s1;
int i;
L = NULL;
for(i=0; i
{
s=(LinkList *)malloc(sizeof(LinkList));//创建新结点 if(L == NULL) //创建纯在严重逻辑错误,上一个开辟的结点没存任何数据,新开辟的结点和上个结点对指 L = s;
else
s1->next = s;
s1 = s;
s->data = a[i];
}
s1->next = NULL;
s = NULL;
return L;
}
/*int ListLength(LinkList L)//求表的长度 求表长度多此一举,前面创建就能得到表长
{
int i=0;
LinkList p=L->next;
while(p!=NULL)
{
i++;
p=p->next;
}
return i;
}
int GetElem(LinkList *p, int i, int *e) //得到第i结点元素
{
int j = 0;
--i; //注意边界值应该为0;
//LinkList *p;
//p=L->next; 你直接指向下一个结点,不考虑第一个?
if(i < 1||i > 4)
return 0;
while(j < i)
{
p=p->next;
j++;
}
*e = p->data; //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
{
p= p->next;
j++;
}
s->next=p->next;
p->next=s;
return 1;
}*/
LinkList *Union(LinkList *La, LinkList *Lb) //集合去重,遍历整个表{
LinkList *p, *p1, *p2, *head, *temp;
head = p = p2 = La;
while(La != NULL)
{
p1 = La;
La = La->next;
}
p1->next = Lb;
while(p != NULL)
{
while(p2 != NULL)
{
if(p2->data == p->data && p != p2)
{
temp->next = p2->next;
free(p2);
p2 = temp->next;
}
else
{
temp = p2;
p2 = p2->next;
}
}
p = p->next;
p2 = p;
}
return head;
}
void print(LinkList *p)
{
while(p != NULL)
{
printf("%d", p->data);
p = p->next;
}
printf("\n");
}
int main(void)
{
int a[60], b[30];
int i, e;
LinkList *headA = NULL;
LinkList *headB = NULL;
printf("请输入A:");
for(i=0; i < 10 ; i++) //逻辑错误,'\0'只存在字符串,假定链表长度为10好了, 这里也不能直接定结构体数组 scanf("%d", &a[i]);
headA = CreateListF(a, 10);
print(headA);
//你都直接输入了成员值, 没必要再创建了。你的意图为创建链表
printf("请输入B:");
for(i=0; i<5; i++)
scanf("%d", &b[i]);
headB = CreateListF(b, 5);
print(headB);
//GetElem(headA, 5, &e);//假设取表A,第5个元素//printf("取到第5个元素为:%d\n", e); headA = Union(headA, headB);
printf("集合A和集合B并集: \n");
print(headA);
return 0;
}