c语言链表集合求并集用字母表示,两个集合求并集(用链表的方式)

#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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值