




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【问题描述】 编制一个能演示执行集合的并、交和差运算的程序【基本要求】 (1)集合的元素限定为小写字母字符 a.z (2 )演示程序以用户和计算机对话的方式执行【测试数据】【实现提示】 以有序链表表示集合【代码过程】 1。先定义 集合的数据类型 notes.h /notes.htypedef struct LNode. ElemType data; LNode *next;*Link, *Position;typedef struct. Link head,tail; int len;LinkSet; / 2。以后要用的一些常量放在 constValues.h #include#include #include /函数结果状态代码#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2 #define ElemType int /存放数据的类型typedef int Status; /函数的返回值 / 3。集合实现函数 setsFun.h/*/* 函数定义 */Status InitSets(LinkSet &ls). /初始化 集合 ls.head = (Link) malloc( sizeof(Link); ls.tail = (Link) malloc( sizeof(Link); if(!ls.head | !ls.tail) exit(OVERFLOW); /如果分配失败 ls.head-next = ls.tail-next = NULL; /头、尾指针为空 ls.len = 0; /长度为0 return OK;Status CreateNode(Link &link,ElemType e). /创建一节点,内容为e link = (Link) malloc( sizeof(Link); if(!link) exit(OVERFLOW); link-data = e; /值设定 link-next = NULL; /指向空 return OK;Position PriorInsertNode(LinkSet &ls,Link &link). /找出节点link要插入到ls的前一个节点 if(!ls.head-next) return ls.head; Link h1 = ls.head-next, h2 = h1-next; /h1:前一节点,h2:前一节点的后一节点 if(link-data data) return ls.head; /如果比第一个节点小,返回头指针 while(h1 & h2). if(h1-data data) & h2-data (link-data) ) /如果h1 & data = (link-data) | h2-data =(link-data) ) return NULL; /如果重复,返回NULL else /否则,顺次往后挪一个节点 h1=h2,h2=h1-next; return h1;Status Append(LinkSet &ls, Link &link). /向集合末尾追加节点 if(ls.head-next = NULL) ls.head-next = link; else ls.tail-next-next = link; ls.tail-next = link; ls.len +; return OK;Status InsertNode(LinkSet &ls, Link &link). /向集合中插入节点 Position p = PriorInsertNode(ls,link); if(!p) return ERROR; /如果集合中已有相应元素 link-next = p-next; if(!p-next) ls.tail-next = link; /如果前一节点为尾节点,修改tail p-next = link; ls.len+; return OK;Position PriorNode(LinkSet &ls, Link &link). /返回集合中 该节点的前一节点,不存在返回NULL int j=0; Link pre,h = ls.head; while(h-next & jnext; j+; if(j=0) return NULL; return pre;Status PrintSets(LinkSet &ls). /打印集合 Link h=ls.head-next; printf( ); while(h). printf(%c ,h-data); h = h-next; printf( ); return OK;Position GetHead(LinkSet &ls). /获得集合的头节点 return ls.head;Position NextPos(Link &link). /获得当前节点的下一个节点 return link?link-next:link;Status Empty(LinkSet &ls). /空为真 return ls.head-next=NULL;ElemType GetCurElem(Link &link). /获得当前节点的数据 return link-data;int Compare(Link &la, Link &lb). /判断两个节点的大小 return la-data - lb-data;int Compare(ElemType e1, ElemType e2). /比较两个数字的大小 return e1-e2; Status DelFirst(LinkSet &ls,Link &q). /已知h为线性链表的头节点,删除表中的第一个节点,并以q返回 Link h = ls.head; if(!h-next) return ERROR; q = h-next; h-next = h-next-next; q-next=NULL; ls.len-; return OK;Status FreeNode(Link &l)./释放节点,有问题 free(l); return OK;Status UnionSets(LinkSet lsa, LinkSet &lsb, LinkSet &lsc). /已知集合ls1,ls2的元素按值非递减排列 /将集合ls1,ls2的并集到ls3 if( !InitSets(lsc) ) return ERROR; Link node; Link ha = lsa.head, hb=lsb.head; /找到两节点的头指针 Link pa = NextPos(ha), pb = NextPos(hb); while( !Empty(lsa) & !Empty(lsb) ). int result = Compare(pa,pb); /比较两节点大小 if( result0). /向lsc插入lsb的相关节点 DelFirst(lsb,node);Append(lsc,node); pb = NextPos(hb); else. DelFirst(lsb,node); pb = NextPos(hb);/如果两 节点相同,删除lsb中重复的节点,即以lsa为标准 while(!Empty(lsa). DelFirst(lsa,node);Append(lsc,node); while(!Empty(lsb). DelFirst(lsb,node);Append(lsc,node); return OK;Status IntersectionSets(LinkSet &lsa,LinkSet &lsb, LinkSet &lsc). /已知集合ls1,ls2的元素按值非递减排列 /将集合ls1,ls2的交集到ls3 if( !InitSets(lsc) ) return ERROR; Link node; Link ha = lsa.head, hb=lsb.head; Link pa = NextPos(ha), pb = NextPos(hb); while( !Empty(lsa) & !Empty(lsb) ). int result = Compare(pa,pb); if( result0). DelFirst(lsb,node); pb = NextPos(hb); else. DelFirst(lsb,node); Append(lsc,node);pb = NextPos(hb); DelFirst(lsa,node);pa = NextPos(ha); while(!Empty(lsa). DelFirst(lsa,node);Append(lsc,node); return OK;Status DifferenceSets(LinkSet &lsa,LinkSet &lsb, LinkSet &lsc). /已知集合ls1,ls2的元素按值非递减排列 /ls3 = ls1 - ls2 if( !InitSets(lsc) ) return ERROR; Link node; Link ha = lsa.head, hb=lsb.head; Link pa = NextPos(ha), pb = NextPos(hb);/,pb2 = NextPos(pb1); while( !Empty(lsa) & !Empty(lsb) ). int result = Compare(pa,pb); if( result0). DelFirst(lsb,node); pb = NextPos(hb); else. DelFirst(lsa,node); pa = NextPos(ha); DelFirst(lsb,node); pb = NextPos(hb); return OK;Status CopySets(LinkSet lsa, LinkSet lsb). /将集合lsa拷贝到lsb中 InitSets(lsb); Link la = lsa.head-next, lb = lsb.head-next; while(la). Link node; CreateNode(node,la-data); lb=node; lsb.len+; la = la-next; lb = lb-next; lsb.tail = lb; return OK;/ 4。测试 test.cpp#include constValues.h /常量头 文件#include notes.h /节点定义 头文件#include setsFun.h /集合操作函数 头文件/*/* 测试 */void Initialization(). printf(* ); printf(*MakeSet1-1 MakeSet1-2 Union-u Intersection-i Difference-d Quit-q * ); printf(* );void main(). LinkSet set1,set2,set3,seta,setb; InitSets(set1),InitSets(set2); /初始化集合 while(1). Initialization(); printf(集合Set1:); PrintSets(set1); /打印集合set1 printf(集合Set2:); PrintSets(set2); /打印集合set1 printf(请键入操作代码:); fflush(stdin); /清空缓冲区 char oper = getchar(); char setsContent200; switch(oper) . case 1: /集合set1 赋值 printf(请输入集合Set1的内容:); fflush(stdin); gets(setsContent); InitSets(set1); SetSets(set1,setsContent); break; case 2: /集合set1 赋值 printf(请输入集合Set1的内容:); fflush(stdin); gets(setsContent); InitSets(set2); SetSets(set2,setsContent); break; case u: case U: /求并 InitSets(set3); CopySets(set1,seta); /因为求并的算法是添加一个节点,删除set1,set2中对应的节点, CopySets(set2,setb); /所以要复制一份 UnionSets(seta,setb,set3); /下同 printf(set1 U set2=: ); PrintSets(set3); fflush(stdin); getchar(); break; case i: case I: /求交 InitSets(set3); CopySets(set1,seta); CopySets(set2,setb); IntersectionSets(seta,setb,set3); printf(set1 交 set2=: ); PrintSets(set3); fflush(stdin); getchar(); break; case d: case D
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 装修材料订购合同范本
- 线上家具安装合同范本
- 私人铺头出租合同范本
- 砖厂供应煤炭合同范本
- 酒水分销合作合同范本
- 粉店加盟协议合同范本
- 酒店位合同协议书范本
- 物料设计制作合同范本
- 电脑配件服务合同范本
- 购买拆迁厂房合同范本
- GB/T 6093-2001几何量技术规范(GPS)长度标准量块
- GB/T 22751-2008台球桌
- 中国近代史试题库
- 电路学课件:1-6 电压源和电流源
- 奥的斯GeN2-故障查找手册-1-CN
- 村民森林防火承诺书
- 税法(第三版)项目一任务三增值税应纳税额的计算
- 系统数据导出确认单
- Q∕SY 01004-2016 气田水回注技术规范
- TSG Z8002-2022 特种设备检验人员考核规则
- QC∕T 900-1997 汽车整车产品质量检验评定方法
评论
0/150
提交评论