c语言单链表–实现集合的所有操作(交集,并集,差集)
单链表我之前怎么想都想不通,后来编程,写着写着感觉恍然大悟,特别简单,以下是代码区:不会的小伙伴加油!
#include<stdio.h>
#include<stdlib.h>
/*
插入一个数到集合指定位置
按值删除集合中的元素
按值在集合中进行查找
清空集合
求两个集合的交集
求两个集合的并集
求两个集合的差集
输出集合
*/
typedef struct Lnode{
int data;
struct Lnode *next;
}Lnode, *LinkList;
void menu()
{
printf( "0)输入表一表二数据\n"
"1)插入一个数到表一指定位置\n"
"2)按值删除表一中的元素\n"
"3)按值在表一中进行查找\n"
"4)清空表一表二集合\n"
"5)求两个集合的交集\n"
"6)求两个集合的并集\n"
"7)求两个集合的差集\n"
"8)输出集合\n");
}
//实现创建一个头结点
void Init(LinkList *L)
{
*L = (LinkList)malloc(sizeof(Lnode));
if(!(*L))
{
printf("创建头节点失败\n");
exit(1);
}
else
(*L)->next = NULL;
}
//实现集合元素的输入
void Input(Lnode **L) //给集合输入数据采用单链表尾插法
{
Lnode *p,*temp;
p = (LinkList)malloc(sizeof(Lnode));
if(p==NULL)
{
printf("内存分配失败\n");
exit(1);
}
printf("请输入整数:\n");
scanf("%d",&(p->data));
if(*L != NULL)
{
temp = *L;
//定位单链表的尾部位置
while(temp->next != NULL)
{
temp = temp->next;
}
//插入数据
temp->next = p;
p->next = NULL;
}
else
{
*L=p;
p->next=NULL;
}
}
//实现任意位置插入
int Insert(LinkList L,int i)
{
LinkList p,q;
if(i==0)
{
printf("位序不合法\n");
return 0;
}
p=L->next;
int j=0;
while(p && j<i-1)
{
p=p->next;
j++;
}
if(!p)
return 0;
else
{
q=(LinkList)malloc(sizeof(Lnode));
if(q==NULL)
return 0;
printf("输入插入的内容:\n");
scanf("%d",&(q->data));
q->next = p->next;
p->next = q;
}
}
int Delete(LinkList L,int n)
{
LinkList previous;
LinkList target;
previous=L;
while(previous->next&&previous->next->data!=n)
{
previous=previous->next;
}
if(previous->next==NULL)
{
printf("未找到该元素\n");
return ;
}
else
{
target = previous->next;
previous->next = target->next;
free(target);
}
}
void Output(Lnode *L)
{
int i=1;
Lnode *p;
p=L->next;
if(p==NULL)
{
printf("无数据\n");
}
while(p!=NULL)
{
printf("[%d]:\t",i++);
printf("%d\n",p->data);
p=p->next;
}
}
//销毁单链表
void DestroyList(LinkList *L)
{
LinkList q;
while (*L)
{
q = (*L)->next;
free(*L); //释放头结点
*L = q; //L指向原首元节点,实现头结点
}
}
//将单链表重置为空表
void ClearList(LinkList L)
{
LinkList p = L->next; //p指向第一个结点
L->next = NULL; //头结点指针域为空
DestroyList(&p); //销毁p所指向的单链表
}
void SearchList(LinkList L,int target)
{
int i=1;
Lnode *p;
p=L->next;
while(p)
{
if(p->data==target)
{
break;
}
p = p->next;
i++;
}
if(p)
{
printf("您找的元素是:%d,查找的元素位序是%d,\n",target,i);
}
else
{
printf("没有此元素\n");
}
}
//求两个集合的交集
LinkList Intersection(LinkList L1, LinkList L2,int i)
{
LinkList s;
Init(&s);
LinkList Lp,Lq;
Lp=L1->next;
while(Lp)
{
Lq = L2->next;
while(Lq)
{
if(Lp->data==Lq->data)
{
LinkList inter = (LinkList)malloc(sizeof(Lnode));//头插法插入
inter->data = Lp->data;
inter->next = s->next;
s->next = inter;
}
Lq=Lq->next;
}
Lp=Lp->next;
}
if(i)
Output(s);
return s;
}
//求两个集合的并集
LinkList Union(LinkList L1,LinkList L2,int i)
{
LinkList s;
Init(&s);
LinkList p1,p2;
p1=L1->next;
p2=L2->next;
while(p1)
{
LinkList inter = (LinkList)malloc(sizeof(Lnode));//头插法插入
inter->data = p1->data;
inter->next = s->next;
s->next = inter;
p1 = p1->next;
}
while(p2)
{
p1 = s->next;
while(p1)
{
if(p1->data != p2->data)
{
p1 = p1->next;
}
else
{
break;
}
}
if(!p1)
{
LinkList inter = (LinkList)malloc(sizeof(Lnode));//头插法插入
inter->data = p2->data;
inter->next = s->next;
s->next = inter;
}
p2 = p2->next;
}
if(i)
Output(s);
return s;
}
void DiffenceList(LinkList L1, LinkList L2)
{
LinkList s1,s2,s,p,q;
s1 = Union(L1,L2,0);
s2 = Intersection(L1,L2,0);
p=s1->next;
while(p)
{
q=s2->next;
while(q)
{
if(q->data != p->data)
q=q->next;
else
break;
}
if(!q)
{
LinkList inter = (LinkList)malloc(sizeof(Lnode));//头插法插入
inter->data = p->data;
inter->next = s->next;
s->next = inter;
}
p=p->next;
}
Output(s);
}
void main()
{
int i=0;
int input;
int flag;
LinkList L1=NULL,Ltarget1;
LinkList L2=NULL,Ltarget;
Init(&L1);
Init(&L2);
int n;
while(1)
{
menu();
printf("请输入功能数字:\n");
scanf("%d",&flag);
switch(flag)
{
case 0:
printf("表一\n");
printf("输入元素个数\n");
scanf("%d",&n);
while(i<n)
{
Input(&L1);
i++;
}
Output(L1);
printf("表二\n");
printf("输入元素个数\n");
scanf("%d",&n);
i=0;
while(i<n)
{
Input(&L2);
i++;
}
Output(L2);
break;
case 1:
//插入一个元素到表一指定位置
printf("插入一个元素到表一指定位置\n");
printf("请输入插入的位序:");
scanf("%d",&n);
Insert(L1,n);
Output(L1);
break;
case 2:
//按值删除集合中的元素
printf("删除表一中的元素\n");
printf("请输入要删除的整数:");
scanf("%d", &n);
Delete(L1,n);
Output(L1);
break;
case 3:
//按值在集合中进行查找
printf("请输入查找的元素:");
scanf("%d",&input);
SearchList(L1,input);
Output(L1);
break;
case 4:
ClearList(L1);
ClearList(L2);
break;
case 5:
//求两个集合的交集
printf("两个集合的交集:\n");
Intersection(L1,L2,1);
break;
case 6:
//求两个集合的并集
printf("两个集合的并集:\n");
Union(L1,L2,1);
break;
case 7:
//求两个集合的差集
printf("两个集合的差集:\n");
DiffenceList(L1,L2);
break;
case 8:
//输出
printf("输出完整表一/二(1 or 2):");
scanf("%d",&input);
if(input==1)
Output(L1);
if(input==2)
Output(L2);
break;
}
}
}