实验报告 顺序表实验.docx
《实验报告 顺序表实验.docx》由会员分享,可在线阅读,更多相关《实验报告 顺序表实验.docx(29页珍藏版)》请在冰豆网上搜索。
![实验报告 顺序表实验.docx](https://file1.bdocx.com/fileroot1/2023-5/16/ef36d0e4-a5f3-4e2a-b68a-25344e6b0924/ef36d0e4-a5f3-4e2a-b68a-25344e6b09241.gif)
实验报告顺序表实验
《数据结构》实验报告
1.上机题目:
顺序表实验
2.需求分析
实现顺序表的建立、输出、查找、插入、删除、合并几项功能。
明确说明程序的开发环境和功能要求。
针对主要功能,给出如下说明:
(1)输入参数的格式和合法取值范围
输入参数范围输入格式
菜单选择数字0—6,getche()接受键盘上对应的按钮
数据输入0—9999scanf(“%s”,data)
程序是否执行yngetche()接受键盘上对应按键
(2)输出的格式
输出参数输出格式
文字输出printf(“******”);
数据输出printf(“%d”,data[i])
(3)测试数据
能够完成顺序表的建立、输出、查找、插入、删除、合并几项功能。
********************************
*1.建立一个顺序表*
*2.输出一个顺序表*
*3.在顺序表中查找*
*4.向顺序表中插入一个元素*
*5.删除顺序表中的一个元素*
*6.将两个顺序表合并*
*0.退出*
********************************
(4)开发环境
Vc6.0
3.详细设计
(1)确定存储结构,并给出所用数据类型的数据结构定义
采用顺序表存储的线性表。
利用内存中的一片起始位置确定的连续存储区域来存放表中的所以元素。
可以根据需要对表中的任何数据元素进行访问,元素的插入,删除可以在表中任何位置进行。
typedefstruct{
ElemTypedata[MAXSIZE];
intlength;
}SqList;
(2)给出所用数据类型中每个操作的伪码算法
A.初始化建立的顺序表
VoidInitList(SqList&L)
置L.length为0
B.建立新的顺序表
VoidCreatSqlist(SqList&L,intn)
开辟一个数据结构空间,容量是MAXSIZE
ifstr是四位正整数
记录
else
重新输入正确值
C.输出顺序表
intOutput(SqListL)
ifL.length等于0
return0
else
return1
D.在顺序表中按位置取值
intGetElem(SqListL,inti)
if取值不在线性表范围内
return-9999;
else
returnL.data[i];
E.在顺序表中按位置取值
intLocateElem(SqListL,ElemTypex)
Whilex=L.data[k]
if(kreturnk;
else
return-1;
F.在i处插入元素
intInsert(SqList&L,ElemTypex,inti)
if不在k的范围内插入
return0;
else
在i处插入元素
return1;
G.在i处删除元素
intDelete(SqList&L,inti)
ifi不在L.length范围内
return0;
else
删除i处的元素
return1;
H.合并lalb两个顺序表
VoidMergeList(SqListla,SqListlb,SqList&lc)
la,lb升序排序
la先存在lc
lb再存在lc
4.调试分析
(1)调试过程中主要遇到哪些问题?
是如何解决的?
A.在程序结束时
如果按书上的代码
printf("继续执行吗Y
(1)/N(0):
");
scanf("%d",&k);
if(!
k)
return;
只要不输入0都会继续执行代码,
所以我想让此时的程序只识别y和n两个按键
通过查找y的键盘值是0x0079
N的键盘值是0x006e
通过key=getche(),判断key的值来决定标志位的值来。
提高了人性化。
B.输入数据过程中,实现了正整数输入,小数和字母均报错,且重新输入。
所以我加了限制,不允许小数,负数输入。
对于负数,小数,字母,大于4位的数输入情况如下:
只有正整数通过
C.若没有建立顺序表时,若执行2-6菜单则会
在进行菜单2时,直接跳到了最后一行程序,而且不显示任何东西,进行菜单3时,由于顺序表是空的,返回值-1,执行菜单4时,程序停止了。
我将接受菜单的程序
while(k)
{
printf("请选择0--6:
");
scanf("%d",&m);
getchar();
switch(m)
{
case0:
return;
case1:
{
中的scanf("%d",&m);改为m=getche();直接读键盘值,
m=getche();
printf("\n");
if(m<=0x0030&&m>=0x0036)
m=0x0037;
switch(m)
{
case0x0030:
break;
这样就解决了这一问题。
在每次进入case后进行一次判定,若表为空则报错。
解决后的截图。
(2)经验和体会
程序很快写完了,但是发现书上有许多不完善的地方,和一些错误,在不按正确输入格式输入时,会出现程序死了的情况。
在改进这些方面我花费了许多时间。
书上对于查找这个功能是按两个菜单分配的,我觉得这样不妥,我把他们和在一个菜单,然后在设计两个子菜单分别按值查找序号,和按序号查找值,我觉得这样更完美一些。
对于输入数字部分,我暂时有限定要求,只让输入4位数的值,可以设计成8为等,但是不让小数,负数,字母通过,在书本程序中一旦出现了小数,负数,字母程序就跑飞了。
所以我在接受数据时,就按照字符串接受,计算长度,计算数值,这样就解决了只让4为正整数通过的要求。
在写程序方面,我始终认为要静下心来,这样才能写出符合要求的程序,才能写出好程序。
不能浮躁。
5.测试结果
采用测试数据,列出实际的输入、输出结果。
菜单1:
菜单2:
菜单3:
a.按元素查,从0计数。
a.按元素查,表中没有要查的值。
b.按顺序查值。
菜单4:
插值
菜单5:
删除
菜单6:
插入另一个表
6.附件
/*************************************************
Copyright(C),dsj
Filename:
顺序表实验
Author:
duanshaojieVersion:
1.0Date:
2010.10.10
Description:
采用顺序表存储方式,完成建立、输出、查找、插入、删除、合并
*************************************************/
#include
#include
#include
#include
#include
#include
#defineMAXSIZE100
typedefintElemType;
typedefstruct//定义顺序表结构体
{
ElemTypedata[MAXSIZE];
intlength;
}SqList;
/*************************************************
Function:
顺序表初始化
Description:
将长度置零
*************************************************/
voidInitList(SqList&L)
{
L.length=0;
}
/*************************************************
Function:
建立顺序表
Description:
建立一个新的表
*************************************************/
voidCreatSqlist(SqList&L,intn)
{
inti,k=0,j=0,x=1;
intflag=0;//设置整数判别的标志位
for(i=0;i{
charstr[4];
char*ptr=str;
printf("*");
printf("请输入No.%d元素的数值(四位正整数,回车键结束操作):
",i+1);
scanf("%s",str);
while(*ptr)//检验输入的是否是整数
{
if(!
isdigit(*ptr++))//调用了isdigit()函数
{
flag=1;
break;//一个非数字的输入、输入错误
}
}
if(flag==0)//是整数时
{
while(str[j]!
='\0')
{
j++;
k++;
}
k--;
L.data[i]=0;
for(j=k;j>-1;j--)
{
L.data[i]+=(str[j]-'0')*x;
x*=10;
}
x=1;
if(L.data[i]<0||L.data[i]>9999||int(L.data[i])!
=L.data[i]||L.data[i]<0)
{
i=i-1;
printf("请重新输入正确数据!
\n");
}
}
else//不是整数时
{
i=i-1;
printf("请重新输入正确数据!
\n");
}
for(j=4;j>0;j--)
{
str[j]='\0';
}
k=0;
}
L.length=n;
getchar();
}
/*************************************************
Function:
//函数名称
Description:
//函数功能、性能等的描述
*************************************************/
/*voidBubbleSort(SqList*L)//冒泡排序
{
inti,j;
ElemTypet;
SqList*p=L;
for(j=0;jlength-1;j++)
for(i=0;ilength-j-1;i++)
if(p->data[i]>p->data[i+1])
{
t=p->data[i];
p->data[i]=p->data[i+1];
p->data[i+1]=t;
}
}*/
/*************************************************
Function:
输出函数
Description:
将表输出
*************************************************/
intOutput(SqListL)//输出表
{
inti;
printf("顺序表为:
\n");
for(i=0;i{
if(i%5==0)//按每行5个输出
printf("|\n\n");
printf("|");
printf("%6d",L.data[i]);
}
printf("|");
if(L.length==0)
return0;
else
return1;
}
/*************************************************
Function:
查找函数
Description:
按位置查找表中值
*************************************************/
intGetElem(SqListL,inti)
{
if(i<0||i>=L.length)
return-9999;
else
returnL.data[i];
}
/*************************************************
Function:
查找函数
Description:
按序列查值
*************************************************/
intLocateElem(SqListL,ElemTypex)
{
intk=0;
while(k=x)
k++;
if(kreturnk;
else
return-1;
}
/*************************************************
Function:
插入函数
Description:
按位置插入值
*************************************************/
intInsert(SqList&L,ElemTypex,inti)
{
intk;
if(i<0||i>L.length||L.length==MAXSIZE)
return0;
else
{
for(k=L.length;k>=i;k--)
L.data[k]=L.data[k-1];
L.data[i]=x;
L.length=L.length+1;
}
return1;
}
/*************************************************
Function:
删除函数
Description:
删除相应序列的值
*************************************************/
intDelete(SqList&L,inti)
{
intk;
if(i<0||i>=L.length)
return0;
else
{
for(k=i;kL.data[k]=L.data[k+1];
L.length--;
}
return1;
}
/*************************************************
Function:
//合并函数
Description:
//将la,lb合并在lc中
*************************************************/
voidMergeList(SqListla,SqListlb,SqList&lc)
{
inti=0,j=0,k=0;
while(ilc.data[k++]=la.data[i++];
while(jlc.data[k++]=lb.data[j++];
lc.length=k;
/*while(iif(la.data[i]lc.data[k++]=la.data[i++];
elseif(la.data[i]>lb.data[j])
lc.data[k++]=lb.data[j++];
else
{
lc.data[k++]=lb.data[j++];
i++;
}
while(ilc.data[k++]=la.data[i++];
while(jlc.data[k++]=la.data[j++];
lc.length=k;
*/
}
/*************************************************
Function:
星号函数
Description:
*************************************************/
voidtitle(void)
{
inti;
for(i=0;i<10;i++)
printf("");
for(i=0;i<32;i++)
printf("*");
printf("\n");
}
/*************************************************
Function:
菜单函数
Description:
六个菜单栏
*************************************************/
voidmainpp(void)
{
inti;
title();
for(i=0;i<10;i++)printf("");printf("*");
printf("1.建立一个顺序表");
for(i=0;i<10;i++)printf("");printf("*");printf("\n");
for(i=0;i<10;i++)printf("");printf("*");
printf("2.输出一个顺序表");
for(i=0;i<10;i++)printf("");printf("*");printf("\n");
for(i=0;i<10;i++)printf("");printf("*");
printf("3.在顺序表中查找");
for(i=0;i<10;i++)printf("");printf("*");printf("\n");
for(i=0;i<10;i++)printf("");printf("*");
printf("4.向顺序表中插入一个元素");
for(i=0;i<2;i++)printf("");printf("*");printf("\n");
for(i=0;i<10;i++)printf("");printf("*");
printf("5.删除顺序表中的一个元素");
for(i=0;i<2;i++)printf("");printf("*");printf("\n");
for(i=0;i<10;i++)printf("");printf("*");
printf("6.将两个顺序表合并");
for(i=0;i<8;i++)printf("");printf("*");printf("\n");
for(i=0;i<10;i++)printf("");printf("*");
printf("0.退出");
for(i=0;i<8;i++)printf("");printf("*");printf("\n");
title();
}
voidmain()
{
intt,n=0,m,k=1,x,z,i;
intflagg=1,key;
SqListl,la,lc;
InitList(l);
while(flagg)//Y/N的标志位
{
mainpp();
printf("请选择0--6:
\n");
title();
printf("请输入:
");
m=getche();
printf("\n");
if(m<=0x0030&&m>=0x0036)//键盘上0-6的按键ASCII码
m=0x0037;
switch(m)
{
case0x0030:
break;
case0x0031:
{
printf("输入元素值,构建顺序表:
\n");
printf("请输入顺序表元素的个数(范围为0~100):
");
scanf("%d",&n);
CreatSqlist(l,n);
Output(l);
break;
}
case0x0032:
{
t=Output(l);
if(t==0)
{
printf("请先建立一个顺序表!
");
break;
}
printf("\n");
break;
}
case0x0033:
{
t=Output(l);
if(t==0)
{
printf("请先建立一个顺序表!
");
break;
}
printf("\na:
查找元素值:
");
printf("\nb:
查找序列号:
\n");
printf("aorb?
");
z=getch();//对查找进行分类了选a还是b
if(z=='a')
{
printf("\na:
请输入要查找的元素值(从0号开始计数):
");
scanf("%d",&x);
k=LocateElem(l,x);
if(k==-1)
printf("该元素在顺序表中不存在!
\n");
else
printf("\