2个集合的交差并补代码.docx
- 文档编号:29744374
- 上传时间:2023-07-26
- 格式:DOCX
- 页数:12
- 大小:16.45KB
2个集合的交差并补代码.docx
《2个集合的交差并补代码.docx》由会员分享,可在线阅读,更多相关《2个集合的交差并补代码.docx(12页珍藏版)》请在冰豆网上搜索。
2个集合的交差并补代码
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//函数结果状态代码
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
//#defineOVERFLOW-2因为在math.h中已定义OVERFLOW的值为3,故去掉此行typedefintStatus;//Status是函数的类型,其值是函数结果状态代码,如OK等typedefintBoolean;//Boolean是布尔类型,其值是TRUE或FALSE
typedefintElemType;
/*线性表的单链表存储结构*/
typedefstructLNode
{
chardata;
structLNode*next;
}LNode,*LinkList;
LinkListh;
/*带有头结点的单链表的基本操作*/
voidInitList(LinkList*L)
{/*操作结果:
构造一个空的线性表L*/
*L=(LinkList)malloc(sizeof(LNode));/*产生头结点,并使L指向此头结点*/
if(!
*L)/*存储分配失败*/
exit(OVERFLOW);
(*L)->next=NULL;/*指针域为空*/
}
voidDestroyList(LinkList*L)
{/*初始条件:
线性表L已存在。
操作结果:
销毁线性表L*/
LinkListq;
while(*L)
q=(*L)->next;
free(*L);
*L=q;
}
}
voidClearList(LinkListL)/*不改变L*/
{/*初始条件:
线性表L已存在。
操作结果:
将L重置为空表*/
LinkListp,q;
p=L->next;/*p指向第一个结点*/
while(p)/*没到表尾*/
{
q=p->next;
free(p);
p=q;
}
L->next=NULL;/*头结点指针域为空*/
}
StatusListEmpty(LinkListL)
{/*初始条件:
线性表L已存在。
操作结果:
若L为空表,则返回TRUE,否则返回FALSE*/
if(L->next)/*非空*/
returnFALSE;
else
returnTRUE;
}
StatusListInsert(LinkListL,inti,ElemTypee)/*不改变L*/
{/*在带头结点的单链线性表L中第i个位置之前插入元素e*/
intj=0;
LinkListp=L,s;
while(p&&j { p=p->next; j++; } if(! p||j>i-1)/*i小于1或者大于表长*/ returnERROR; s=(LinkList)malloc(sizeof(structLNode));/*生成新结点*/ s->data=e;/*插入L中*/ s->next=p->next; p->next=s; returnOK; } StatusListDelete(LinkListL,inti,ElemType*e)/*不改变L*/ {/*在带头结点的单链线性表L中,删除第i个元素,并由e返回其值*/ intj=0; LinkListp=L,q; while(p->next&&j { p=p->next; j++; } if(! p->next||j>i-1)/*删除位置不合理*/ returnERROR; q=p->next;/*删除并释放结点*/ p->next=q->next; *e=q->data; free(q); returnOK; } voidListPrint(LinkListL)/*依次输出链表中的元素*/ { LinkListp=L->next; if(! p) printf("空集\n"); while(p) { printf("%c",p->data); p=p->next; } printf("\n"); } voidListSort(LinkListL) { LinkListfirst;/*为原链表剩下用于直接插入排序的节点头指针*/ LinkListt;/*临时指针变量: 插入节点*/ LinkListp;/*临时指针变量*/ LinkListq;/*临时指针变量*/ first=L->next;/*原链表剩下用于直接插入排序的节点链表*/ L->next=NULL;/*只含有一个节点的链表的有序链表。 */ while(first! =NULL)/*遍历剩下无序的链表*/ { /*插入排序*/ for(t=first,q=L;((q! =NULL)&&(q->data /*退出for循环,就是找到了插入的位置*/ first=first->next;/*无序链表中的节点离开,以便它插入到有序链表中。 */if(q==L)L=t;/*插在第一个节点之前*/ elsep->next=t;/*p是q的前驱*/ t->next=q;/*完成插入动作*/ } } voidqingchu(LinkListLa)/*清除链表中相同的元素*/ { chari,j; LinkListp,q; La->next; p=La; q=p->next; while(q) {i=p->data; j=q->data; if(i==j) {q=p->next;/*删除并释放结点*/ p->next=q->next; free(q); } p=p->next; q=p->next; } } voidzengtian(LinkListLa)/*向集合中添加元素*/ {chara; printf("请输入要增添的元素,加0结束\n"); scanf("%c",&a); while(a! ='0') { if((a>='a'&&a<='z')||(a>='A'&&a<='Z')) { ListInsert(La,1,a);scanf("%c",&a);}}getchar(); /*消除空格*/ ListSort(La); ListPrint(La);} voidJiaoji(LinkListLa,LinkListLb,LinkListLc){/*求两集合的交集,将结果存入另一个链表中*/chari,j; LinkListp,q; La->next; Lb->next; p=La; q=Lb; while(p&&q) { i=p->data; j=q->data; if(i p=p->next; if(i==j) {ListInsert(Lc,1,i);p=p->next;q=q->next;} if(i>j) q=q->next; } ListSort(Lc); printf("A∩B="); ListPrint(Lc); } voidbingji(LinkListLa,LinkListLb,LinkListLc){chari,j;/*求两集合的并集*/ LinkListp,q; La->next; Lb->next; p=La; q=Lb; while(p&&q) { i=p->data; j=q->data; if(i {ListInsert(Lc,1,i);p=p->next;} if(i==j) {ListInsert(Lc,1,i);p=p->next;q=q->next;} if(i>j) {ListInsert(Lc,1,j);q=q->next;} } while(p){i=p->data;ListInsert(Lc,1,i);p=p->next;} while(q){j=q->data;ListInsert(Lc,1,j);q=q->next;}ListSort(Lc); printf("A∪B="); ListPrint(Lc); } voidchaji(LinkListLa,LinkListLb,LinkListLc) {chari,j; LinkListp,q; La->next; Lb->next; p=La; q=Lb; while(p&&q) {i=p->data; j=q->data; if(i {ListInsert(Lc,1,i);p=p->next;} if(i==j) p=p->next; if(i>j) q=q->next; } while(p){i=p->data;ListInsert(Lc,1,i);p=p->next;}ListSort(Lc); ListPrint(Lc); } voidmain() {chara; charb;charc; LinkListL1,L2,L3,L4,L5,L6; InitList(&L1); InitList(&L2); InitList(&L3);/*构建需要的链表*/ InitList(&L4); InitList(&L5); InitList(&L6); printf("************************************\n");printf("欢迎使用集合交并差运算程序\n"); printf("************************************\n"); printf("请输入A集合的元素,加0结束\n"); scanf("%c",&a); while(a! ='0') { if((a>='a'&&a<='z')||(a>='A'&&a<='Z')) { ListInsert(L1,1,a); scanf("%c",&a); } } getchar(); ListSort(L1); qingchu(L1); ListPrint(L1); printf("请输入B集合的元素,加0结束\n"); scanf("%c",&b); while(b! ='0') { if(b>='a'&&b<='z'||b>='A'&&b<='Z') { ListInsert(L2,1,b);scanf("%c",&b); } } getchar(); ListSort(L2); qingchu(L2); ListPrint(L2); printf("请选择你要的操作\n"); printf("1.清空A集合\n"); printf("2.清空B集合\n"); printf("3.添加元素至A集合\n"); printf("4.添加元素至B集合\n"); printf("5.A∩B\n"); printf("6.A∪B\n"); printf("7.A-B\n"); printf("8.B-A\n"); printf("0.结束\n"); do {scanf("%c",&c); getchar(); switch(c) { case'1': ClearList(L1);break;case'2': ClearList(L2);break;case'3': zengtian(L1);break;case'4': zengtian(L2);break;case'5': Jiaoji(L1,L2,L4);break;case'6': bingji(L1,L2,L3);break;case'7': chaji(L1,L2,L5);break;case'8': chaji(L2,L1,L6);break;default: printf("欢迎使用\n"); } } while(c! ='0');}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 集合 交差 代码