求集合的並,交,差集合(有序單鏈表的實踐)


  //說實話我把差集想的太復雜了  考慮了許多沒用的

  //最后卻用了一種簡單的方法解決了

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM