数据结构实验报告1.docx
《数据结构实验报告1.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告1.docx(9页珍藏版)》请在冰豆网上搜索。
数据结构实验报告1
长春理工大学
数据结构与算法
实验报告
实验题目:
线性表顺序存储试验
实验时间:
实验地点:
班级:
学号:
姓名:
一、实验目的及要求
1、掌握用VisualC++6.0上机调试顺序表的基本方法
2、掌握顺序表的基本操作,插入、删除、查找等算法的实现
[基本要求]要求生成顺序表时,可以键盘上读取元素,用顺序存储结构实现存储。
二、实验意义及原理
当我们要在顺序表的第i个位置上插入一个元素时,必须先将顺序表中第i个元素之后的所有元素依次后移一个位置,以便腾空一个位置,再把新元素插入到该位置。
若是欲删除第i个元素时,也必须把第i个元素之后的所有元素前移一个位置。
三、算法分析
(1)以下为函数运行结果状态代码
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
#defineOVERFLOW-2
(2)线性表的动态分配顺序存储结构
#defineLIST_INIT_SIZE100 //线性表存储空间的初始分配量
#defineLISTINCREMENT10//线性表存储空间分配增量
typedefintStatus;//函数类型,其值为为函数结果状态代码
typedefintElemType;//假设数据元素为整型
typedefstruct
{
ElemType*elem;//存储空间基址
intlength;//当前长度
intlistsize;//当前分配的存储容量
}Sqlist;
(2)构造函数
//函数名:
InitList()
//参数:
SqListL
//初始条件:
无
//功能:
构造一个空线性表
StatusInitList(SqlistL)
{
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(L.elem==NULL)
exit(OVERFLOW);
else
{
L.length=0;
L.listsize=LISTINCREMENT;
returnOK;
}
}
(3)插入函数
//函数名:
ListInsert()
//参数:
SqListL,inti,ElemTypee
//初始条件:
线性表L已存在,1<=i<=ListLength(L)+1
//功能:
在线性表中第i个数据元素之前插入数据元素e
StatusListInsert(SqlistL,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==NULL)
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;
}
(4)删除函数
//函数名:
ListDelete()
//参数:
SqListL,inti,Elemtypee
//初始条件:
线性表L已存在,1<=i<=ListLength(L)
//功能:
将线性表L中第i个数据元素删除
StatusListDelet(SqlistL,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;
}
四、源代码
#include
usingnamespacestd;
#defineMAXSIZE20
typedefintElemType;
typedefstruct{
ElemTypedata[MAXSIZE];
intlength;
intlistsize;
}SqList;
//构造空线性表List
boolInitList(SqList&L){
for(inti=0;iL.data[i]=0;}
L.length=0;
L.listsize=MAXSIZE;
returntrue;
}
//判断线性表是否为空
boolListEmpty(SqListL){
if(L.length==0){returntrue;}
else
returnfalse;}
//用ptr返回sql4第pos个元素的值
ElemTypeGetElem(SqList&L,intpos,ElemType&ptr){
if(L.length<=0||pos<1||pos>L.length){
returnfalse;
}
else{
ptr=L.data[pos-1];
returnptr;
}
}
//查询第location位置上的元素
voidlocate(SqListL,intlocation)
{
if(L.length>=location)
cout<<"查询的元素为:
"<else
cout<<"该位置没有元素!
"<}
/*在Sq中第pos2个位置插入新的数据元素Elem,L的长度加1*/
boolListInsert(SqList&L,intpos2,ElemTypeElem)
{
//线性表空间不足,无法插入
if(L.length==MAXSIZE){
cout<<"空间不足,无法插入!
"<returnfalse;
}
if(pos2<1||pos2>L.length+1){
cout<<"插入位置错误!
"<returnfalse;
}
if(pos2<=L.length)
{
/*将要插入位置之后的数据元素向后移动一位*/
for(inti=L.length-1;i>=pos2-1;i--)
{
L.data[i+1]=L.data[i];
}
}
L.data[pos2-1]=Elem;/*将新元素插入*/
if(L.data[pos2-1]==Elem){
//cout<<"添加元素成功"<L.length++;
returntrue;
}
else{
cout<<"添加元素失败***"<returnfalse;
}
}
//删除ps的第pos个数据元素,并用pe返回其值,ps的长度减1
boolListDelete(SqList&L,intpos,ElemType*pe)
{
if(pos<1||pos>L.length){
cout<<"删除位置错误!
"<returnfalse;
}else{
*pe=L.data[pos-1];
/*将删除位置后继元素前移*/
for(inti=pos;iL.data[i-1]=L.data[i];
L.length--;
returntrue;
}
}
intListLength(SqListSq)
{
returnSq.length;
}
//主函数
intmain(){
SqListlist;
cout<<"构造线性表List"<InitList(list);//构造线性表
if(ListEmpty(list))//判断是否为空
{
cout<<"线性表为空"<}
else
cout<<"线性表不为空";
intnum;//要添加的元素的个数
cout<<"输入值的个数:
";
cin>>num;
cout<<"输入添加元素:
";
ElemTypeElem;
for(inti=1;i{
cin>>Elem;
ListInsert(list,i,Elem);
}
if(list.length<=list.listsize)
cout<<"添加元素成功!
"<if(!
ListEmpty(list))//展示表内容
{
cout<<"list:
"<for(inti=0;icout<}
cout<cout<<"请输入要查询元素的位置:
";
intele;
intpre;
cin>>ele;
locate(list,ele);
intresult;
cout<<"输入要删除元素的位置:
";
cin>>pre;
boolre=ListDelete(list,pre,&result);
cout<<"delete:
"<if(re){
cout<<"删除成功!
"<}else{
cout<<"删除失败!
"<}
if(!
ListEmpty(list))
{
cout<<"list:
"<for(inti=0;icout<}
cout<\n请输入插入位置