您好,欢迎访问三七文档
《数据结构》实验报告实验序号:2实验项目名称:顺序表的操作学号姓名专业、班级实验地点指导教师实验时间一、实验目的及要求1.掌握线性表的顺序存储类型;2.熟练掌握顺序表的基本操作和具体的函数实现。二、实验设备(环境)及要求微型计算机;windows操作系统;MicrosoftVisualStudio6.0集成开发环境。三、实验内容与步骤1.设A、B均为用数组实现的List类型的顺序表,试设计一个函数Alternate(A,B),从表A中第1个元素开始,交替地用表A和表B中元素组成一个新表。2.顺序表表示和实现线性表的如下:#defineLIST_INIT_SIZE10#defineLISTINCREMENT5typedefstruct{ElemType*elem;intlength;intListSize;}sqlist;intInitList_sq(sqlist*l)/*initialthelistl*/{l-elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));if(!l-elem){printf(无法分配空间!);return1;}else{l-length=0;l-ListSize=LIST_INIT_SIZE;printf(ok);return0;}}intListInsert_Sq(sqlist*L,inti,ElemTypee){ElemType*q,*p;if(i1||iL-length+1)return1;if(L-length=L-ListSize){ElemType*newbase;newbase=(ElemType*)realloc(L-elem,(L-ListSize+LISTINCREMENT)*sizeof(ElemType));if(!newbase)return1;L-elem=newbase;L-ListSize+=LISTINCREMENT;}q=&(L-elem[i-1]);for(p=&(L-elem[L-length-1]);p=q;--p)*(p+1)=*p;*q=e;++L-length;return0;}【要求】1、实现顺序表的插入、删除、按值查找等操作;2、假设构建的是非递减顺序表,设计算法实现从该有序顺序表中删除所有其值重复的元素,使得表中所有元素的值均不同。四、实验结果与数据处理1:2:五、分析与讨论五、教师评语签名:日期:成绩附源程序清单:1.#includestdio.h#includestdlib.h#defineLIST_INIT_SIZE100//数组最大值#defineINIT_ERROR-1//初始化出错判断用typedefstructtadDATALIST//顺序表结构体{intnLength;//长度intanData[LIST_INIT_SIZE];//数组int*pElem;}List,*pList;ListC;//A和B组合后的新数组intInitList(pListD){intnLength=0;intnInput=0;charcOverSign;//读取所有整数,输入回车结束输入while(1){if(scanf(%d,&nInput)!=1)//对于非法出入给出判断{printf(非法输入!!!\n);returnINIT_ERROR;}D-anData[nLength]=nInput;//赋值nLength++;if((cOverSign=getchar())=='\n')//按下回车键,结束输入{returnnLength;//返回长度}}}intAlternate(pListanData_A,pListanData_B){C.nLength=0;//初始化新数组的长度为0intnIndex1=0;intnIndex2=0;while((nIndex1anData_A-nLength)&&(nIndex2anData_B-nLength))//当有一个数组到达长度限制后,退出执行后两个while语句中的一个{C.anData[C.nLength]=anData_A-anData[nIndex1];//先把A的第一个元素给cnIndex1++;C.nLength++;C.anData[C.nLength]=anData_B-anData[nIndex2];//接着把B的第一个元素给CnIndex2++;C.nLength++;}while(nIndex1anData_A-nLength){C.anData[C.nLength]=anData_A-anData[nIndex1];nIndex1++;C.nLength++;}while(nIndex2anData_B-nLength){C.anData[C.nLength]=anData_B-anData[nIndex2];nIndex2++;C.nLength++;}return0;}intmain(){intnIndex=0;ListA;//创建结构体的对象ListB;printf(输入顺序表A的元素,以回车结束输入:);if((A.nLength=InitList(&A))==INIT_ERROR)//判断是否初始化出错{printf(初始化出错!!!\n);return0;}printf(输入顺序表B的元素,以回车结束输入:);//判断是否初始化出错if((B.nLength=InitList(&B))==INIT_ERROR){printf(初始化出错!!!\n);return0;}/*printf(%d\n,A.nLength);printf(%d\n,B.nLength);for(nIndex=0;nIndexA.nLength;nIndex++){printf(%d,A.anData[nIndex]);}printf(\n);for(nIndex=0;nIndexB.nLength;nIndex++){printf(%d,B.anData[nIndex]);}printf(\n);*/Alternate(&A,&B);//合成新数组printf(新的顺序表C为:);for(nIndex=0;nIndexC.nLength;nIndex++){printf(%d,C.anData[nIndex]);}printf(\n);return0;}2.#includestdio.h#includestdlib.h#defineLIST_INIT_SIZE100//顺序表初始化大小#defineLIS_TINCREMENT_SIZE50//空间不够时,增加大小#defineINIT_ERROR-1#defineINIT_SUCCESS0#defineERROR-1#defineSUCCESS0typedefstructtagDataList//顺序表结构体封装数据{int*pBaseAddr;//基地址intnlength;//长度intnListSize;//分配大小}SqList,*pSqList;intInitList(pSqListList)//顺序表初始化函数{intnInput;charcOverSign;List-pBaseAddr=(int*)malloc(LIST_INIT_SIZE*sizeof(int));//开辟空间大小if(!List-pBaseAddr)//判断是否开辟成功{returnINIT_ERROR;}List-nlength=0;//长度初始化为0List-nListSize=LIST_INIT_SIZE;//读取所有整数,输入回车结束输入while(1){if(scanf(%d,&nInput)!=1)//对于非法出入给出判断{printf(非法输入!!!\n);returnINIT_ERROR;}List-pBaseAddr[List-nlength]=nInput;//赋值List-nlength++;//自增if((cOverSign=getchar())=='\n')//按下回车键,结束输入{returnINIT_SUCCESS;}}}intSqListInsert(pSqListList)//插入数据函数{intnIndex;intnVar;int*npNewBaseAddr=NULL;//新基地址int*npInsertPlace=NULL;//要插入的位置int*npTemp=NULL;//中间过渡变量printf(请输入要插入的位置和要插入的数:);scanf(%d%d,&nIndex,&nVar);if(nIndex0||nIndexList-nlength+1)//判断是否在范围内{printf(要插入的位置不在顺序表的范围!!!\n);returnERROR;}if(List-nlength=List-nListSize)//当超出初始化分配空间大小时,分配更大空间{printf(空间不够,重新分配大空间!!!\n);npNewBaseAddr=(int*)realloc(List-pBaseAddr,(LIS_TINCREMENT_SIZE+LIST_INIT_SIZE)*sizeof(int));if(!npNewBaseAddr)//判断重新分配是否成功{printf(重新分配空间失败!!!\n);returnERROR;}List-pBaseAddr=npNewBaseAddr;//把重新分配的基地址给原先的List-nListSize+=LIS_TINCREMENT_SIZE;}npInsertPlace=&(List-pBaseAddr[nIndex-1]);//记录要插入的位置的地址for(npTemp=&(List-pBaseAddr[List-nlength-1]);npTemp=npInsertPlace;npTemp--){*(npTemp+1)=*npTemp;//把相对于插入位置后面的数据往右边移动一个单位}*npInsertPlace=nVar;//把要插入的值赋值给相应位置List-nlength++;returnSUCCESS;}intSqListDelete(pSqListList)//删除数据{intnIndex;int*npDeletePlace=NULL;int*npTemp=NULL;printf(请输入你要删除的位置:);scanf(%d,&nIndex);if(nIndex0||nIndexList-nlength)//判断位置是否合法{printf(要删除的位置不在顺序表的范围!!!\n);returnERROR;}npDeletePlace=&(List-pBaseAddr[nIndex-1]);//记录位置npTemp=List-pBaseAddr+List-nlength-1;//空间大小for(++npDeletePlace;npDeletePlace=npTemp;++npDeletePlace){*(npDeletePlace-1)=*npDeletePlace;//相应元素往左边移动一个单位}List-nlength--;//自减returnSUCCESS;}intSqListFindVar(pSqListList,intnVar)//按值查找函数{intnIndex;intnSign=0;int*npFindPlace=NULL;int*npTemp=NULL;for(nIndex=0;nIndexList-nlength;nIndex++){if(nVar==List-pBaseAddr[nIndex])//找到就给出提示{printf(你要的数在第%d个位置,该数为:%d!!!\n,nIndex+1,List-pBaseAddr[nInde
本文标题:数据结构实验2
链接地址:https://www.777doc.com/doc-4308640 .html