线性表的基本操作实验报告.docx
《线性表的基本操作实验报告.docx》由会员分享,可在线阅读,更多相关《线性表的基本操作实验报告.docx(12页珍藏版)》请在冰豆网上搜索。
![线性表的基本操作实验报告.docx](https://file1.bdocx.com/fileroot1/2023-1/14/336984a7-b772-4918-9541-4f4f2d134687/336984a7-b772-4918-9541-4f4f2d1346871.gif)
线性表的基本操作实验报告
实验1线性表的基本操作
姓名小明
一、需求分析
1.程序的功能:
实现基本线性表的运算:
插入数据,删除数据,查找数据,求顺序表长度,遍历链表。
2.输入输出的要求:
数据必须为整数并大于0,插入数据必须为一位整数;
3.测试数据
测试数据可由使用者自己输入。
二、概要设计
1.本程序所用的抽象数据类型的定义:
由顺序表,结构体通过指针连接组成;
2.主程序的流程及各程序模块之间的层次关系。
然后根据各个选项调用所需函数
三、详细设计
1.定义相关的数据类型:
结构体链表SqList,其中包含
ElemType*elem;intlength;intlistsize;
2.写出各模块的伪码算法;
插入数据:
StatusListInsert(Sqlist&L,inti,ElemTypee)
{
int*q=&(L.elem[i-1]);
ElemType*newbase,*p;
if(i<1||i>(L.length+1))
returnERROR;
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;
}
for(p=&(L.elem[L.length-1]);p>=q;--p)
*(p+1)=*p;
*q=e;
++L.length;
returnOK;
}
删除数据:
StatusListDelete(Sqlist&L,inti,ElemTypee)
{
if(i<1||(i>L.length))
returnERROR;
ElemType*p,*q;
p=&(L.elem[i-1]);
e=*p;
q=L.elem+L.length-1;
for(++p;p<=q;++p)
*(p-1)=*p;
--L.length;
returnOK;
}
求表长:
intListLength(SqlistL)
{
returnL.length;
}
StatusGetElem(Sqlist&L,inti)
{
if(i<0||i>L.length)
exit(OVERFLOW);
returnL.elem[i-1];
}
查找数据:
StatusGetElem(Sqlist&L,inti)
{
if(i<0||i>L.length)
exit(OVERFLOW);
returnL.elem[i-1];
}
intLocationElem(SqlistL,ElemTypeelement)
{
inti=0;
for(i=0;iif(L.elem[i]==element)
printf("第%d个元素为%d.\n",i+1,element);
returni;
}
3.
画出函数的调用关系图。
四、使用说明及测试结果
1输入初始元素值:
2删除数据
删除数据1
3、插入数据
插入数据1
4、查找数据
查找数据3
5、求长度
0退出
六、源程序
#include
#include
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
#defineOVERFLOW-2
#defineLIST_INIT_SIZE5
#defineLISTINCREMENT1
typedefintStatus;
typedefintElemType;
typedefstruct
{
ElemType*elem;//存储空间基址
intlength;//当前长度
intlistsize;//当前分配的存储容量
}Sqlist;
staticSqlistL;
staticElemTypeelement;
StatusInitList(Sqlist&L)
{
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!
L.elem)exit(OVERFLOW);
L.length=0;
L.listsize=LIST_INIT_SIZE;
returnOK;
}
StatusDestroyList(Sqlist&L)
{
if(L.elem==NULL)
returnERROR;
else
free(L.elem);
returnOK;
}
StatusClearList(Sqlist&L)
{
if(L.elem==NULL)
exit(ERROR);
inti;
ElemType*p_elem=L.elem;
for(i=0;i{
*L.elem=NULL;
L.elem++;
}
L.elem=p_elem;
returnOK;
}
StatusListEmpty(SqlistL)
{
inti;
ElemType*p_elem=L.elem;
for(i=0;i{
if(*L.elem!
=0)
{
L.elem=p_elem;
returnFALSE;
}
L.elem++;
}
returnTRUE;
}
intListLength(SqlistL)
{
returnL.length;
}
StatusGetElem(Sqlist&L,inti)
{
if(i<0||i>L.length)
exit(OVERFLOW);
returnL.elem[i-1];
}
intLocationElem(SqlistL,ElemTypeelement)
{
inti=0;
for(i=0;iif(L.elem[i]==element)
printf("第%d个元素为%d.\n",i+1,element);
returni;
}
StatusListInsert(Sqlist&L,inti,ElemTypee)
{
int*q=&(L.elem[i-1]);
ElemType*newbase,*p;
if(i<1||i>(L.length+1))
returnERROR;
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;
}
for(p=&(L.elem[L.length-1]);p>=q;--p)
*(p+1)=*p;
*q=e;
++L.length;
returnOK;
}
StatusListDelete(Sqlist&L,inti,ElemTypee)
{
if(i<1||(i>L.length))
returnERROR;
ElemType*p,*q;
p=&(L.elem[i-1]);
e=*p;
q=L.elem+L.length-1;
for(++p;p<=q;++p)
*(p-1)=*p;
--L.length;
returnOK;
}
voidPrintList(SqlistL)
{
for(inti=0;iprintf("%d",L.elem[i]);
}
//***********************主函数******************************//
voidmain()
{
inti;
SqlistLa;
InitList(La);
printf("请输入%d个初始元素值:
",LIST_INIT_SIZE);
for(i=0;i<=4;i++)
{scanf("%d",&La.elem[i]);
La.length++;}
printf("存入的结果为:
");
PrintList(La);
menu:
printf("\n\n*************请选择要对线性表进行的操作:
*************\n1显示,2删除,3插入,4查找,5比较,6长度,0退出\n请选择操作序号:
");
intflag;
scanf("%d",&flag);
switch(flag)
{
case1:
printf("\n");
PrintList(La);
break;
case2:
printf("\n请输入要删除元素的位置:
");
scanf("%d",&i);
ElemTypee;
ListDelete(La,i,e);
printf("改变后的线性表:
");
PrintList(La);
break;
case3:
{printf("\n请输入要插入的元素:
");
ElemTypee;
scanf("%d",&e);
printf("请输入要插入的位置:
");
scanf("%d",&i);
ListInsert(La,i,e);
printf("改变后的线性表:
");
PrintList(La);}
break;
case4:
printf("\n请输入要查找元素的位置:
");
inti;
scanf("%d",&i);
e=GetElem(La,i);
printf("第%d个元素的值是:
%d\n",i,e);
break;
case5:
intm;
printf("\n请输入比较的元素:
");
scanf("%d",&m);
LocationElem(La,m);
break;
case6:
printf("\n线性表元素个数为:
%d\n",ListLength(La));
break;
default:
printf("\n输入的选择不存在!
\n");
break;
case0:
printf("\n谢谢使用!
\n");return;
}
gotomenu;
}