您好,欢迎访问三七文档
例2-1假设有两个集合A和B分别用两个线性表LA和LB表示,即:线性表中的数据元素即为集合中的成员。现要求一个新的集合A=A∪B。//////////////////////////////////////////////////////////上述问题可演绎为:要求对线性表作如下操作:扩大线性表LA,将存在于线性表LB中而不存在于线性表LA中的数据元素插入到线性表LA中去。//////////////////////////////////////////////////////////操作步骤:1.从线性表LB中依次察看每个数据元素;GetElem(LB,i)→e2.依值在线性表LA中进行查访;LocateElem(LA,e,equal())3.若不存在,则插入之。ListInsert(LA,n+1,e)//////////////////////////////////////////////////////////voidunion(List&La,ListLb){La_len=ListLength(La);//求线性表的长度Lb_len=ListLength(Lb);for(i=1;i=Lb_len;i++){GetElem(Lb,i,e);//取Lb中第i个数据元素赋给eif(!LocateElem(La,e,equal()))ListInsert(La,++La_len,e);//La中不存在和e相同的数据元素,则插入之}}//union//////////////////////////////////////////////////////////#ifndefDSH#defineDSH#defineTRUE1#defineFALSE0#defineOK1#defineERROR0#defineINFEASIBLE-1#defineOVERFLOW-2//Status是函数的类型,其值是函数结果状态代码typedefintStatus;typedefintElemType;#endif//////////////////////////////////////////////////////////#ifndefLISTH#defineLISTH#includeds.h#defineLIST_INIT_SIZE100#defineLISTINCREMENT10typedefstruct{ElemType*elem;//存储空间基址intlength;//当前长度intlistsize;//当前分配的存储容量(以sizeof(ElemType)为单位)}List;//俗称顺序表#endifStatusInitList(List&);voidCreateList(List&,int[],int);intListLength(List);voidGetElem(List,int,ElemType&);intLocateElem(List,ElemType,Status(*compare)(ElemType,ElemType));StatusListInsert(List&,int,ElemType);voidPrintList(List);////////////////////////////////////////////////////////////////#includestdio.h#includestdlib.h#includeList.hStatusInitList(List&L){//构造一个空的线性表L。L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));if(!L.elem)exit(OVERFLOW);L.length=0;L.listsize=LIST_INIT_SIZE;returnOK;}//InitListvoidCreateList(List&L,inta[],intn){//顺序输入n个数据元素,建立顺序表inti;for(i=0;in;++i)L.elem[i]=a[i];//输入元素值L.length=n;}//CreateListintListLength(ListL){returnL.length;}voidGetElem(ListL,inti,ElemType&e){e=L.elem[i-1];}intLocateElem(ListL,ElemTypee,Status(*compare)(ElemType,ElemType)){inti;int*p;i=1;//i的初值为第1元素的位序p=L.elem;//p的初值为第1元素的存储位置while(i=L.length&&!(*compare)(*p++,e))++i;if(i=L.length)returni;elsereturn0;}StatusListInsert(List&L,inti,ElemTypee){//在顺序线性表L的第i个位置之前插入新的元素e,i的合法值为1≤i≤ListLength(L)+1ElemType*newbase,*q,*p;if(i1||iL.length+1)returnERROR;//i值不合法if(L.length=L.listsize){//当前存储空间已满,增加分配newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));if(!newbase)exit(OVERFLOW);//存储分配失败L.elem=newbase;//新基址L.listsize+=LISTINCREMENT;//增加存储容量}q=&(L.elem[i-1]);//q为插入位置for(p=&(L.elem[L.length-1]);p=q;--p)*(p+1)=*p;//插入位置及之后的元素右移*q=e;//插入e++L.length;//表长增1returnOK;}//ListInsertvoidPrintList(ListL){//输出顺序表Linti;printf(\n);for(i=1;i=L.length;++i)printf(%d,L.elem[i-1]);//输入元素值printf(\n);}//////////////////////////////////////////#includestdio.h#includestdlib.h#includeList.hinta[]={3,5,8,11};intb[]={2,6,8,9,11,15,20};Statusequal(ElemType,ElemType);voidUnion(List&,List);Statusequal(ElemTypex,ElemTypey){returnx==y;}voidUnion(List&La,ListLb){//将所有在线性表Lb中但不在La中的数据元素插入到La中inti;inte;intLa_len,Lb_len;La_len=ListLength(La);Lb_len=ListLength(Lb);for(i=1;i=Lb_len;i++){GetElem(Lb,i,e);if(!LocateElem(La,e,equal))ListInsert(La,++La_len,e);}}//Unionintmain(){ListLa,Lb;InitList(La);InitList(Lb);CreateList(La,a,4);CreateList(Lb,b,7);printf(集合A:);PrintList(La);printf(集合B:);PrintList(Lb);Union(La,Lb);printf(集合AUB:);PrintList(La);printf(A与B的并集对吗?);getchar();return0;}/////////////////////////////////////////////////
本文标题:有两个集合用两个线性表LA和LB表示即线性表中的数据元素即为集合中的成员。现要求一个新的集合A=A∪
链接地址:https://www.777doc.com/doc-4291185 .html