《数据结构线性表的顺序表示和实现.docx》由会员分享,可在线阅读,更多相关《数据结构线性表的顺序表示和实现.docx(3页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、数据结构实验报告实验一 线性表的顺序表示和实现实验人:学号: Xb09620125 时间:实验目的1 .掌握线性表的动态分配顺序存储结构.掌握线性表合并算法。一、 实验内容已知顺序线性表La和Lb的元素按值非递减排列,归并La和Lb得到新的 顺序线性表Lc, Lc的元素也按值非递减排列。(算法2.7)实验步骤:1 .创建线性表La和Lbo.合并La和Lb得到Lc。2 .输出 La、Lb、Leo算法说明先建立线性表La与Lb,然后合并两线性表。二、 测试结果六、 分析与探讨合并两线性表时,数据元素按非递减排列。七、 附录:源代码源代码列在附录中,要求程序风格清晰易理解,有充分的注释。有意义的注释
2、行不少于30%0#defineTRUE1#defineFALSE0#defineOK1#defineERROR0#defineINFEASIBLE -2数据结构实验报告#define OVERFLOW -2/Status是函数的类型,其值是函数结果状态代码typedef int Status;typedefintElemType; 元素类型定义为整型#include#define LISTJNIT_SIZE 100 存储空间的初始分配量#define LISTINCREMENT 10 /存储空间的分配增量typedef struct ElemType *elem; 指向存储空间的基地址int
3、length;线性表的当前长度int listsize;当前分配的存储容量SqList;StatusInitList_Sq(SqList&L) / 算法 2.3构造一个空的线性表LoL.elem = new(ElemTypeLIST_INIT_SIZE*sizeof(ElemType);if(!L.elem) return OVERFLOW; / 存储分配失败L.length = 0;/空表长度为0L.listsize = LIST_INIT_SIZE; / 初始存储容量 return OK; / InitList_SqStatus DestroyList_Sq(SqList &L)if (L
4、.elem) delete(L.elem);释放线性表的存储空间L.elem=NULL;return OK;/Destroy List_SqElemType*realloc(SqListL) 再申请 LISTINCREMENT 个空间ElemType *p,*q,*r;p = new(ElemType (L. listsize+LI STINCREM ENT) *sizeof(ElemType);if(!p) return NULL; q=p; r=L.elem;for(int i= 1 ;i=L.length;i+) *q=*r; q+; r+;delete L.elem;return p;
5、)StatusListInsert_Sq(SqList&L,inti,ElemTypee) / 算法 2.4/在顺序线性表L的第i个元素之前插入新的元素e, i的合法值为 liListLength_Sq(L)+lElemType *p;if(i L.length+l) return ERROR; /i 值不合法if(L.length = L.listsize) /当前存储空间已满,增加容量 ElemType *newbase = realloc(L);if (inewbase) return ERROR; / / 存储分配失败L.elem = newbase;/ 新基址L.listsize +
6、= LISTINCREMENT; / 增加存储容量数据结构实验报告ElemType*q =&(L.elemi-1 ); / q 为插入位置for (p = &(L.elemL.length-l); p=q; p) *(p+l) = *p;/插入位置及之后的元素右移*q = e; / 插入 e+L.length; / 表长增 1 return OK; / ListInsert_SqStatus ListInsert(SqList &L,ElemTypee) if(!L.length)L.elemO=e;int i=L.length;while(e0)L. elemi=L. elem i-1;i-
7、;L.elemi=e;L.length+;return OK;)StatusMergeList_Sq(SqListLa, SqListLb, SqList&Lc) / 算法 2.7/已知顺序线性表La和Lb的元素按值非递减排列。/归并La和Lb得到新的顺序线性表Lc, Lc的元素也按值非递减排列。ElemType *pa,*pb,*pc,*pa_last,*pb_last;使pa、pb分别指向La和Lb的第一个元素pa=La.elem; pb = Lb.elem;为Lc申请空间Lc.listsize = Lc. length = La. length+Lb. length;pc = Lc.el
8、em = new(ElemTypeLc.listsize*sizeof(ElemType);if (ILc.elem)return OVERFLOW; 存储分配失败使pa_last、pbast分别指向La和Lb的最后一个元素pa_last = La. elem+La. length-1;pb_last = Lb.elem+Lb.length-1;while (pa = pa_last & pb = pb_last) 归并if (*pa = *pb) *pc+ = *pa+; else *pc+ = *pb+;while (pa = pa_last) *pc+ =*pa+; / La 的乘U余元
9、素 while (pb = pb_last) *pc+ =*pb+; / 插入 Lb 的乘U余元素 return(OK);l; / MergeListvoid ListTraverse_Sq(SqList L)int i;for(i= 1 ;i=L.length;i+) coutL,elemi-lH n;coutendl;数据结构实验报告voidmain()int i;建立两个元素按值非递减排列的顺序线性表La和Lb,并将它们合并为一个有序顺序 表Lc显示La、Lb和Lc的内容SqList La,Lb,Lc;ElemTypezl,z2;InitList_Sq(La);coutvv”读入3个元素并插入到顺序表La中vvendl;fbr(i=l;izl;ListInsert(La,zl);coutvv”顺序表La中所有元素如下:“vvendl;ListTraverse_Sq(La);InitList_Sq(Lb);cout”读入3个元素并插入到顺序表Lb中”endl;for(i=l;iz2; ListInsert(Lb,z2);coutvv”顺序表Lb中所有元素如下:vvendl;ListTraverse_Sq(Lb);MergeList_Sq(La, Lb, Lc);coutvv”顺序表Lc中所有元素如下:“endl;ListTraverse_Sq(Lc);
限制150内