2数据结构实验2顺序表.docx

上传人:b****7 文档编号:10242089 上传时间:2023-02-09 格式:DOCX 页数:20 大小:20.95KB
下载 相关 举报
2数据结构实验2顺序表.docx_第1页
第1页 / 共20页
2数据结构实验2顺序表.docx_第2页
第2页 / 共20页
2数据结构实验2顺序表.docx_第3页
第3页 / 共20页
2数据结构实验2顺序表.docx_第4页
第4页 / 共20页
2数据结构实验2顺序表.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

2数据结构实验2顺序表.docx

《2数据结构实验2顺序表.docx》由会员分享,可在线阅读,更多相关《2数据结构实验2顺序表.docx(20页珍藏版)》请在冰豆网上搜索。

2数据结构实验2顺序表.docx

2数据结构实验2顺序表

实验报告

院(系):

信息科学与技术学院课程名称:

数据结构日期:

班级

学号

实验室

专业

姓名

计算机号

实验名称

实验2顺序表的操作

成绩评定

所用软件

VC

教师签名

1.掌握线性表的基本概念

2.掌握顺序表的建立、插入和删除等方法。

3.掌握顺序表的基本算法。

1.复习书上有关内容。

2.阅读实验步骤中的函数,写出函数功能。

3.写出实验步骤2、3、4的源程序。

(本次实验需4学时)

第一部分(2学时)

1.分析下列程序并上机运行,写出各子函数功能并写出运行结果。

#defineMAXSIZE100

typedefintelemtype;

typedefstruct

{elemtypeelem[MAXSIZE];

intlast;

}sqlist;

sqlist*init_sqlist()

{sqlist*L;

L=(sqlist*)malloc(sizeof(sqlist));

L->last=-1;returnL;

}

voidcreatsqlist(sqlist*L)

{inti;

printf("%d",L->last);

scanf("%d",&(*L).last);

for(i=0;i<=(*L).last;i++)

scanf("%d",&(*L).elem[i]);

}

intLocation_sqlist(sqlist*L,intx)

{inti=0;

while(i<=L->last&&L->elem[i]!

=x)

i++;

if(i>L->last)return-1;

elsereturni;

}

intInsList(sqlist*L,inti,intx)

{

intk;

if((i<1)||(i>L->last+2))

{printf("LocateError!

");return(0);}/*位置i值不合法*/

if(L->last>=MAXSIZE-1)

{printf("Filled!

");return(0);}

for(k=L->last;k>=i-1;k--)

L->elem[k+1]=L->elem[k];/*插入位置后的元素依次右移*/

L->elem[i-1]=x;/*插入x*/

L->last++;/*表长加1*/

return

(1);

}

voidmain()

{inti;

sqlist*a;

clrscr();

a=init_sqlist();

creatsqlist(a);

printf("%d\n",Location_sqlist(a,3));

for(i=0;i<=a->last;i++)printf("%d",a->elem[i]);

if(InsList(a,2,78))printf("\nOK!

");/*执行函数调用*/

elseprintf("\nERROR!

");

for(i=0;i<=a->last;i++)printf("%d",a->elem[i]);

}

2.下列函数的功能是在顺序表中删除第i个元素,请编制主函数进行函数调用,上机调试运行。

i#include

#include

#defineERROR0

#defineMAXSIZE100

typedefintelemtype;

typedefstruct

{elemtypeelem[MAXSIZE];

intlast;

}SeqList;

intDelList(SeqList*L,inti,elemtype*e)

/*在顺序表L中删除第i个数据元素,并用指针参数e返回其值。

i的合法取值为1≤i≤L.last+1*/

{

intk;

if((i<1)||(i>L->last+1))

{

printf("删除位置不合法!

");

return(ERROR);

}

*e=L->elem[i-1];/*将删除的元素存放到e所指向的变量中*/

for(k=i;i<=L->last;k++)

L->elem[k-1]=L->elem[k];/*将后面的元素依次前移*/

L->last--;

return

(1);

}

main()

{

intn,x;

SeqList*t;

SeqList*e;

printf("请输入数组:

\n");

for(n=0;n<(*t)->last;n++)

{

scanf("%d",&(*t)->elem[n]);

}

printf("请输入要删除的位置:

\n");

scanf("%d",&x);

x=DelList(t,x,e);

if(x)

{

for(n=0;n<=t->last;n++)

{

printf("%d\n",t->elem[i]);

}

}

else

printf("\n");

}

3.阅读下列函数,写该函数的功能,再编制主函数进行函数调用,写出运行结果。

#defineMAXSIZE100

#include"stdio.h"

#include"stdlib.h"

typedefintelemtype;

typedefstruct

{elemtypeelem[MAXSIZE];

intlast;

}sqlist;

sqlist*init_sqlist()

{sqlist*L;

L=(sqlist*)malloc(sizeof(sqlist));

L->last=-1;returnL;

}

voidcreatsqlist(sqlist*L)

{inti;

printf("请输入线性表的长度");

scanf("%d",&i);

L->last=i-1;

printf("请输入线性表中的各元素值,注意:

必须有序");

for(i=0;i<=L->last;i++)

scanf("%d",&(*L).elem[i]);

}

voidmerge(sqlist*LA,sqlist*LB,sqlist*LC)

{

inti,j,k;

i=0;j=0;k=0;

while(i<=LA->last&&j<=LB->last)

if(LA->elem[i]<=LB->elem[j])

{

LC->elem[k]=LA->elem[i];

i++;

k++;

}

else

{

LC->elem[k]=LB->elem[j];

j++;

k++;

}

while(i<=LA->last)/*当表LA有剩余元素时,则将表LA余下的元素赋给表LC*/

{

LC->elem[k]=LA->elem[i];

i++;

k++;

}

while(j<=LB->last)/*当表LB有剩余元素时,则将表LB余下的元素赋给表LC*/

{

LC->elem[k]=LB->elem[j];

j++;

k++;

}

LC->last=LA->last+LB->last+1;

}

4.若顺序表a中的数据元素按升序排列,要求将x插入到顺序表中的合适位置,以保证表的有序性,试给出其程序,并上机调试运行。

提示:

(1)设顺序表中原有数据个数为10个,依次是{1,3,5,7,12,45,67,89,92,99}。

(2)设需要插入的数据x值为25。

(3)注意表长的变化。

(4)有序表的插入,需要分两步完成:

第一步确定插入位置,第二步在插入位置上插入指定的数据。

 

5.将顺序表(a1,a2,...,an)重新排列为以a1为界的两部分:

a1前面的值均比a1小,a1后面的值都比a1大(这里假设数据元素的类型具有可比性,不妨设为整型)

基本思路:

从第二个元素开始到最后一个元素,逐一向后扫描:

(1)当前数据元素aI比a1大时,表明它已经在a1的后面,不必改变它与a1之间的位置,继续比较下一个。

(2)当前结点若比a1小,说明它应该在a1的前面,此时将它上面的元素都依次向下移动一个位置,然后将它置入最上方。

源程序如下:

#defineMAXSIZE100

#include"stdio.h"

#include"stdlib.h"

typedefintelemtype;

typedefstruct

{elemtypeelem[MAXSIZE];

intlast;

}sqlist;//顺序表结构体类型的定义

sqlist*init_sqlist()//顺序表的初始化

{sqlist*L;

L=(sqlist*)malloc(sizeof(sqlist));

L->last=-1;returnL;

}

voidcreatsqlist(sqlist*L)//顺序表的建立

{inti;

printf("请输入顺序表中最后一个元素的下标\n");

scanf("%d",&(*L).last);

printf("请输入%d个元素\n",L->last+1);

for(i=0;i<=(*L).last;i++)

scanf("%d",&(*L).elem[i]);

}

voidpart(sqlist*L)//顺序表的拆分

{inti,j;

elemtypex,y;

x=L->elem[0];/*将基准置入x中*/

for(i=1;i<=L->last;i++)

if(L->elem[i]

{y=L->elem[i];

for(j=i-1;j>=0;j--)/*移动*/

L->elem[j+1]=L->elem[j];

L->elem[0]=y;

}

}

voiddayin(sqlist*a)

{inti;

for(i=0;i<=a->last;i++)

printf("%d",a->elem[i]);//顺序表的输出

printf("\n");

}

voidmain()/*顺序表的主函数*/

{inti;

sqlist*a;

a=init_sqlist();//调用函数对顺序表的初始化

creatsqlist(a);//建立顺序表

printf("建立的顺序表为:

\n");

dayin(a);//输出顺序表

part(a);//顺序表的拆分

printf("拆分后的顺序表为:

\n");

dayin(a);//输出拆分后的线性表

}

6.编写程序从一给定的顺序表A中删除值在x,y(x<=y)之间的所有元素。

提示:

1)方法:

逐一比较每个元素的值,若元素值在X,Y之间,则删除。

2)主函数的编写可模仿第一题

7.编写程序,将给定的顺序表逆置。

例如:

顺序表中的元素为:

247191238

逆置后为:

831291742

**(选做)8.程序阅读题,下列程序是有关顺序表的有关操作,请阅读,然后再上机运行。

#defineLIST_INIT_SIZE8//线性表存储空间的初始分配量

#defineLISTINCREMENT10//线性表存储空间的分配增量

#defineOVERFLOW-2

#defineERROR0

#defineOK1

#defineTRUE1

#defineFALSE0

typedefintStatus;

typedefintElemType;

typedefstruct{

ElemType*elem;//存储空间基址

intlength;//当前长度

intlistsize;//当前分配的存储容量(以sizeof(ElemType)为单位)

}SqList;//俗称顺序表

typedefSqListOdSqList;//有序顺序表

StatusInitList(OdSqList&);//结构初始化

voidDestroy(OdSqList&);//销毁有序顺序表

voidClearList(OdSqList&);//清空有序表

StatusListEmpty(OdSqList);//判有序表为空

intListLength(OdSqList);//求表长

intLocateElem(OdSqList,ElemType);//查找

voidListInsert(OdSqList&,ElemType);//插入元素

StatusListDelete(OdSqList&,int,ElemType&);//删除元素

intListDeletem(OdSqList&L,ElemTypee);

//删除所有值为e的元素,返回删除的元素个数

intListDeletemn(OdSqList&,ElemType,ElemType);//删除所有值界于mink~maxk的元素,并返回删除的元素个数

voidListTraverse(OdSqList);//遍历非递减有序线性表

#include

#include

StatusInitList(OdSqList&L){

//构造一个空的线性表

L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));

if(!

L.elem)

exit(OVERFLOW);

L.length=0;

L.listsize=LIST_INIT_SIZE;

returnOK;

}//InitList

voidListTraverse(OdSqListL){

//遍历线性表

inti;

printf("listsizeis%d.\n",L.listsize);

printf("listlengthis%d.\n",L.length);

printf("thelistis:

(");

for(i=1;i<=L.length;i++)

printf("%d",L.elem[i-1]);

printf(")\n");

}

intLocateElem(OdSqListL,ElemTypee){

//在顺序表中查询第一个满足判定条件的数据元素,若存在,则返回它的位序,否则返回0

inti;

i=1;//i的初值为第1元素的位序

ElemType*p;

p=L.elem;//p的初值为第1元素的存储位置

while(i<=L.length&&*p++!

=e)++i;

if(i<=L.length)returni;

elsereturn0;

}

voidListInsert(OdSqList&L,ElemTypee){

//在顺序表L中保序插入新的元素e

ElemType*newbase,*p,*q;

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[0]);//q指示第1个元素位置

for(p=&(L.elem[L.length-1]);p>=q&&*p>e;--p)

*(p+1)=*p;//插入位置及之后的元素右移

*(p+1)=e;//插入e

++L.length;//表长增1

}

StatusListDelete(OdSqList&L,inti,ElemType&e){

ElemType*p,*q;

if((i<1)||(i>L.length))returnERROR;//删除位置不合法

p=&(L.elem[i-1]);//p为被删除元素的位置

e=*p;//被删除元素的值赋给e

q=L.elem+L.length-1;//表尾元素的位置

for(++p;p<=q;++p)*(p-1)=*p;

//被删除元素之后的元素左移

--L.length;//表长减1

returnOK;

}

voidDestroy(OdSqList&L){

//销毁有序顺序表

free(L.elem);

}

voidClearList(OdSqList&L){

//清空有序表

L.length=0;

}

StatusListEmpty(OdSqListL){

//判有序表为空

if(L.length==0)

returnTRUE;

elsereturnFALSE;

}

intListLength(OdSqListL){

//求表长

returnL.length;

}

intListDeletem(OdSqList&L,ElemTypee){

//删除所有值为e的元素,返回删除的元素个数

ElemType*p,*q,*r;

inti=0;//删除的元素个数

p=&L.elem[0];//扫描指针

for(q=&L.elem[L.length-1];*p

if(p<=q&&*p==e){

i++;

for(r=p+1;*r==e&&r<=q;r++,i++);

if(r<=q)

for(;r<=q;r++,p++)

*p=*r;

}

L.length-=i;

returni;

}

intListDeletemn(OdSqList&L,ElemTypemink,ElemTypemaxk){

//删除所有值界于mink~maxk的元素,并返回删除的元素个数

ElemType*p,*q,*r,temp;

inti=0;

if(maxk

temp=maxk;

maxk=mink;

mink=temp;

}

p=&L.elem[0];

for(q=&L.elem[L.length-1];*p

//p指针指向第1个大于等于mink的元素

if(p<=q&&*p<=maxk){//若*p小于等于maxk

i++;

for(r=p+1;*r<=maxk&&r<=q;r++,i++);//r指针指向第1个大于maxk的元素

if(r<=q)

for(;r<=q;r++,p++)

*p=*r;}

L.length-=i;

returni;

}

voidmain(){

OdSqListL;

intk;

chari;

ElemTypee,mink,maxk;

printf("OdSqListisinit……\n");

i=InitList(L);

ListTraverse(L);

while

(1){

printf("\n\npleaseselect:

\n");

printf("1------insert\n");

printf("2------traverse\n");

printf("3------deletei\n");

printf("4------deletek\n");

printf("5------deletemink-maxk\n");

printf("6------locate\n");

printf("7------isempty\n");

printf("8------length\n");

printf("9------clearlist\n");

printf("0------quit\n");

scanf("%d",&k);

switch(k){

case1:

printf("pleaseinpute:

");

scanf("%d",&e);

ListInsert(L,e);

ListTraverse(L);

scanf("%c",&i);

printf("pleasepressanykeytocontinue……");

scanf("%c",&i);

break;

case2:

ListTraverse(L);

scanf("%c",&i);

printf("pleasepressanykeytocontinue……");

scanf("%c",&i);

break;

case3:

while

(1){

printf("pleaseinputdeletei:

");

scanf("%d",&i);

if(ListDelete(L,i,e)==ERROR)

printf("deletepositoniserror!

\n");

else{

printf("Deletedelemis%d\n",e);

break;}

}

ListTraverse(L);

scanf("%c",&i);

printf("pleasepressanykeytocontinue……");

scanf("%c",&i);

break;

case4:

printf("pleaseinputdeletee:

");

scanf("%d",&e);

ListTraverse(L);

printf("%delemisdeleted.\n",ListDeletem(L,e));

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1