|
|
#2
xichong2010-03-26 20:50
#include <stdio.h>
#include <stdlib.h> typedef struct LNode { int data; struct LNode *next; }LNode,*Linklist; void initial(Linklist L) { Linklist p; p=(Linklist)malloc(sizeof(LNode)); if(!p) exit(0); L=p; L->next=NULL; } void creatlist(Linklist L) { Linklist p,q; int m; q=L; printf("请输入若干个正整数,输入非正整数时结束:\n"); while(1) { scanf("%d",&m); if(m>0) { p=(Linklist)malloc(sizeof(LNode)); p->data=m; q->next=p; q=p; } else break; } p->next=NULL; } void displaylist(Linklist L) { Linklist p=L; for(p=L->next;p!=NULL;p=p->next) printf("%d ",p->data); printf("\n"); } void function5(LNode d,LNode e,Linklist f)//求链表D与E的交集 { Linklist pd=&d,pe=&e,p,q; q=f; pd=pd->next; for(;pd!=NULL;pd=pd->next) { pe=&e; pe=pe->next;//pro:每次进入内循环pe的指针需要指到链表第一个结点 常见错误:在外循环外面就pe=pe->next,而在内循环中省了初始值for(;pe!=NULL;pe=pe->next) for(;pe!=NULL;pe=pe->next) if(pd->data==pe->data) { p=(Linklist)malloc(sizeof(LNode)); p->data=pd->data; q->next=p; q=p; } } p->next=NULL; printf("输出链表D与E的交集的元素:\n"); displaylist(f); } void function7(LNode d,LNode e,Linklist f)//求链表D与E的并集****************************** { Linklist pd,pe,pf,pd_last; int flag; pf=f; pf->next=d.next; while(pf->next!=NULL)//pf指到链表D的末尾 pf=pf->next; pd_last=pf; for(pe=e.next;pe!=NULL;pe=pe->next) { flag=0; pd=&d; do { pd=pd->next; if(pd->data==pe->data)//将指定的E链表中的值与D链表中的每个值比 { flag=1; break; } }while(pd!=pd_last); if(flag==0) { pf->next=pe; pf=pe; } } pf->next=NULL; printf("输出链表D与E的并集的元素:\n"); displaylist(f); } void function8(Linklist d,LNode e)// { Linklist pd,pg,p,q; LNode g; int flag,i,k; function5(*d,e,&g); for(pg=g.next;pg!=NULL;pg=pg->next) { flag=1; k=0;//****************************** for(pd=d->next;pd!=NULL;pd=pd->next) { if(pg->data==pd->data) { flag=0; break; } k++;//*******放在if语句后 } if(!flag)//删除操作 { for(p=d,i=0;i<k;i++)// p=p->next; pd=p;//pro:记录下前驱指针 q=pd->next; pd->next=q->next; } } printf("输出链表D与E的补集的元素:\n"); displaylist(d); } void main() { LNode D,E,F; initial(&D); creatlist(&D); printf("输出链表D中的元素:\n"); displaylist(&D); initial(&E); creatlist(&E); printf("输出链表E中的元素:\n"); displaylist(&E); initial(&F); function5(D,E,&F); initial(&D); creatlist(&D); printf("输出链表D中的元素:\n"); displaylist(&D); initial(&E); creatlist(&E); printf("输出链表E中的元素:\n"); displaylist(&D); initial(&F); function7(D,E,&F); initial(&D); creatlist(&D); printf("输出链表D中的元素:\n"); displaylist(&D); initial(&E); creatlist(&E); printf("输出链表E中的元素:\n"); displaylist(&D); function8(&D,E); } |
问题如下:
利用单链表存储集合(集合中不存在重复元素)。
基本要求
实现以下基本操作:
(1) 从键盘输入集合值,建立集合。
(2) 求集合的并、交和差,并输出结果。
