资源描述:
《合并两个非递减有序线性表》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、/*实验一(顺序表):设有非递减有序线性表LA=(3,5,8,11)和LB=(2,6,8,9,11,15,20),若LA和LB分别表示两个集合A和B,求新集合A=AUB(‘并’操作,相同元素不保留);预测输出:LA=(3,5,8,11,2,6,9,15,20)*///以下是求集合A=AUB的算法/*statusmerge(sqlist&la,sqlistlb){//将lb中和la中元素不同的数据元素归并至la中len=la.length;//la中元素的个数q=la.elem+len;//q为插入位置pa=la.elem;pb
2、_last=lb.elem+lb.length-1;//lb中表尾元素的地址for(pb=lb.elem;pb<=pb_last;pb++){for(;pa<=la.elem+len-1&&*pa<*pb;pa++);//查找*pb在la中的插入位置if(pa>la.elem+len-1
3、
4、*pa>*pb)//若表中不存在和*pb相等的元素,则插入{if(la.length>=la.listsize)//若容量不够,增加分配{newbase=(int*)realloc(la.elem,(la.listsize+LISTINCR
5、EMENT)*sizeof(int));if(!newbase)exit(OVERFLOW);la.elem=newbase;la.listsize+=LISTINCREMENT;q=la.elem+la.length;//q为插入位置}//endif*q++=*pb;(la.length)++;}//endif}//endforreturnOK;}//merge*///以下是程序#include#include#include#defineLISTINCREMENT10
6、#defineOK1#defineERROR0#defineOVERFLOW-1/*类型定义*/typedefstruct{int*elem;intlength;intlistsize;}sqlist;typedefintstatus;/*操作*/statuscreat(sqlist&l){/*建立含有n个数据元素的顺序表*/inti,n;printf("请输入表中数据元素的个数:");scanf("%d",&n);while(n<=0){printf("数值太小,请重新输入!");scanf("%d",&n);}l.leng
7、th=n;//表长为元素个数l.elem=(int*)malloc(n*sizeof(int));if(!l.elem)exit(OVERFLOW);l.listsize=n;printf("请输入%d个元素:",n);for(i=0;i8、,*pb,*newbase,*pb_last,len,*q;len=la.length;//la中元素的个数q=la.elem+len;pa=la.elem;pb_last=lb.elem+lb.length-1;//lb中表尾元素的地址for(pb=lb.elem;pb<=pb_last;pb++){for(;pa<=la.elem+len-1&&*pa<*pb;pa++);//查找*pb在la中的插入位置if(pa>la.elem+len-1
9、
10、*pa>*pb)//若表中不存在和*pb相等的元素,则插入{if(la.len
11、gth>=la.listsize)//若容量不够,增加分配{newbase=(int*)realloc(la.elem,(la.listsize+LISTINCREMENT)*sizeof(int));if(!newbase)exit(OVERFLOW);la.elem=newbase;la.listsize+=LISTINCREMENT;q=la.elem+la.length;//q为新的插入位置}//endif*q++=*pb;(la.length)++;}//endif}//endforreturnOK;}voidpri
12、nt(sqlistl){//输出顺序表l中的数据元素inti;for(i=0;i<=l.length-1;i++)printf("%5d",l.elem[i]);printf("");}voiddestroy(sqlist&l){free(l.elem);l.elem=N