求集合的并,交,差集合(有序单链表的实践)
Posted mykonons
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求集合的并,交,差集合(有序单链表的实践)相关的知识,希望对你有一定的参考价值。
//说实话我把差集想的太复杂了 考虑了许多没用的
//最后却用了一种简单的方法解决了
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct node
{
//char data;
// int count;
int data;
struct node *next;
} lnode,*linklist;
linklist creat()
{
linklist l,p,r,s;
int n;
int i;
//char d,temp;
l=(linklist)malloc(sizeof(lnode));
// l->count=0;
if( l==NULL)
{
printf("内存分配失败");
exit(-1);
}
l->next=NULL;
p=l;
printf("请输入链表值的个数:");
scanf("%d",&n);
printf("请依次输入链表的值:");
for(i=0;i<n;i++)
{
s=(linklist)malloc(sizeof(lnode));
if( s==NULL)
{
printf("内存分配失败");
exit(-1);
}
// s->count++;
scanf("%d",&s->data);
p->next=s;
s->next=NULL;
p=s;
}
return l;
}
int empty(linklist l)
{
if(l->next==NULL)
{
printf("空");
return 1;
}
else
return 0;
}
void tra(linklist l)
{
linklist p;
p=l->next;
while(p)
{
// printf("%c ",p->data);
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
int len(linklist l)
{
linklist p;
int j=0;
p=l->next;
while(p)
{
// printf("%c ",p->data);
j++;
p=p->next;
}
return j;
}
int sort(linklist l)
{
linklist p,q;
int i,j;
int temp;
for(i=0,p=l->next;i<len(l)-1;i++,p=p->next)//记住不要写p->count 因为p->count==1
{
for(j=i+1,q=p->next;j<len(l);j++,q=q->next)
if(p->data > q->data)
{
temp=q->data;
q->data=p->data;
p->data=temp;
}
}
return 1;
}
void bing(linklist l,linklist p)//q始终连接小的值 如果有一个表中元素已经都比较过则将q指向到别的表的剩余元素
{
linklist r,s,t,q;
t=(linklist)malloc(sizeof(lnode));
t->next=NULL;
q=t;
r=l->next;
s=p->next;
while(r!=NULL&&s!=NULL)
{
if(r->data < s->data)
{
q->next=r;
q=r;
r=r->next;
}
else
{
q->next=s;
q=s;
s=s->next;
}
}
if(r==NULL)
{
q->next=s;
}
else if(s==NULL)
{
q->next=r;
}
sort(t);
printf("并集的结果");
tra(t);
}
void jiao(linklist l,linklist p)//元素相等则让q指向随表一个表中的相等元素的位置 记得指向后将q指针置空,否则会输出那个表的剩余元素
{ linklist r,s,t,q;
t=(linklist)malloc(sizeof(lnode));
t->next=NULL;
q=t;
r=l->next;
s=p->next;
while(r!=NULL&&s!=NULL)
{
if(r->data < s->data)
{
r=r->next;
}
else if(r->data == s->data)
{
q->next=s;
q=s;
q->next=NULL;
r=r->next;
s=s->next;
}
else
{
s=s->next;
}
}
sort(t);
printf("交集的结果");
tra(t);
}
void cha(linklist l,linklist p)//差集c=a-b 有a集合的元素,无b中的元素
{ //有相等的元素就新建一个节点,并将r的值赋给他
linklist r,s,t,q,q1;
t=(linklist)malloc(sizeof(lnode));
t->next=NULL;
q=t;
r=l->next;
s=p->next;
while(r!=NULL)
{
if(r->data < s->data)
{ q1=(linklist)malloc(sizeof(lnode));
q1->data=r->data;
q->next=q1;
q=q1;
r=r->next;
}
else if(r->data > s->data)
{
q1=(linklist)malloc(sizeof(lnode));
q1->data=r->data;
q->next=q1;
q=q1;
s=s->next;
}
else { //考虑l表中的最后三位
r=r->next;
s=s->next;
}
}
q1->next=NULL;
sort(t);
printf("请输出表一的差集(l-p)");
tra(t);
}
int main()
{
linklist l,s,p,r,q;
int i,j,k;
printf("链表1\n");
l=creat();
sort(l);
tra(l);
printf("链表2\n");
p=creat();
sort(p);
tra(p);
printf("请输入操作:0-2\n");
scanf("%d",&k);
switch(k)
{
case 0 :bing(l,p);break;
case 1 :jiao(l,p);break;
case 2 :cha(l,p);break;
default :printf("选错了"); break;
}
//bing(l,p);
//jiao(l,p);
//cha(l,p);
return 0;
}
以上是关于求集合的并,交,差集合(有序单链表的实践)的主要内容,如果未能解决你的问题,请参考以下文章
带头结点且递增有序的单链表AB(AB中元素个数分别为mn)分别存储了一个集合。设计算法,求AB的差集 (仅在A中出现不在B中出现),并存在A中,要求保持递增有序性