软件实验报告顺序表的基本操作Word文档格式.docx
《软件实验报告顺序表的基本操作Word文档格式.docx》由会员分享,可在线阅读,更多相关《软件实验报告顺序表的基本操作Word文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
它的顺序存储结构是将线性表的元素按其逻辑次序依次存放在一组地址连续的存储单元。
优势
劣势
1、只要确定了线性表的起始地址,线性表中任一数据元素都可以随机存取。
2、线性表的某些操作易于实现。
1、在作插入或删除操作时,需移动大量的元素。
2、在给长度变化较大的线性表预先分配空间时,必须按最大空间分配,使存储空间不能得到充分利用。
3、表的容量难以扩充。
五、顺序线性表的基本操作
(结构体定义的对象为全局变量)
1、build_sqlisttp()。
建立一线性表。
2、print_sqlisttp()。
打印线性表。
3、length_sqlisttp()。
求表长,求出线性表中数据元素个数。
4、insert_sqlisttp(inti,intx)。
插入操作,若1<
=i<
=length_sqlisttp()+1,则在线性表中的第i个位置上插入元素x,运算结果使得线性表的长度增加1,否则空操作。
5、delete_sqlisttp(inti)。
删除操作,若1<
=length_sqlisttp()则在线性表中的第i个位置上数据元素,使得线性表的长度减去1,否则空操作。
6、find_sqlisttp(intx)。
定位函数,查找x在线性表中位置,有多少x输出多少位置,否则输出未找到。
7、left_right(intx)。
求前驱后继函数。
若elem的值大于1,则x有前驱,否则为空元素。
若elem的值小于length_sqlisttp(),则x有后驱,否则为空元素。
8、print_line()。
打印分割线,美化编程环境。
六、顺序线性表基本操作的实施步骤
1、插入算法:
●若i值合法,将第n至第i个元素后移一个存储位置
●将x插入到第i个位置
●线性表长度加一
2、删除算法:
●若i值合法,将第i+1至第n个位置上的元素依次向前移一个存储位置
●线性表长度减一
3、查找位置算法:
●判断被查找的值是否在线性表中
●不在,输出未找到。
在,输出其在线性表中所有位置
4、线性表长度算法:
●判断线性表是否为空
●空,输出线性表未构建。
不空输出last+1,即线性表长度
5、线性表前驱和后继算法
●判断被查的前驱后继是否存在
●存在,输出其所有前驱后继。
不存在,输出被查元素不存在
七、实验过程
1、程序流程图:
2、程序:
#include"
stdio.h"
stdlib.h"
#definemaxlen100
structsqlisttp
{
intlast;
intelem[maxlen];
}v={0};
voidprint_line(void)
for(inti=0;
i<
=41;
i++)
printf("
%c"
14);
\n"
);
}
voidinstructions()
print_line();
请输入您的选择:
"
若输入1,则构建一线性表。
若输入2,则在线性表中插入一数据。
若输入3,则在线性表中删除一数据。
若输入4,则判断线性表是否为空或输出线性\n表的长度。
若输入5,则输出被查找元素在线性表中位置。
若输入6,则输出被查找元素的前驱和后继元\n素。
若输入7,则结束操作。
}
voidprint_sqlisttp()
inti;
for(i=0;
=v.last-1;
{
if(i%5==0)printf("
printf("
%10d"
v.elem[i]);
}
voidbuild_sqlisttp()
请在对线性表初始化前,先输入其数据个数:
inti,j;
scanf("
%d"
&
j);
线性表的数据个数为%d个。
\n具体数据为:
j);
=j-1;
{
scanf("
v.elem[i]);
v.last++;
voidinsert_sqlisttp(inti,intx)
intk;
if(i<
0||i>
v.last)
插入位置不适合!
elseif(v.last>
maxlen-1)
线形表已满!
else
for(k=v.last;
k>
=i-1;
k--)
v.elem[k+1]=v.elem[k];
v.elem[i]=x;
打印新的线性表:
"
print_sqlisttp();
voiddelete_sqlisttp(inti)
v.last-1)
删除的位置不合适!
else
for(k=i+1;
k<
=v.last;
k++)
v.elem[k-1]=v.elem[k];
v.last--;
print_sqlisttp();
voidfind_sqlisttp(intx)
intj(0),i;
{if(x==v.elem[i])
if(j==0)
所查找的数据在线性表中的位置如下:
}
%d"
i+1);
j++;
if(j==0)
对不起,在线性表中未找到%d。
x);
\n\n"
voidlength_sqlisttp()
if(v.last!
=0)
线性表的长度为:
%d\n"
v.last);
注意,线性表还未初始化!
voidleft_right(intx)
所查找的内容如下:
if(i!
=0&
&
i!
=v.last-1)
数据%d在线性表%d位置处的前驱和后继数据为%d,%d"
x,i+1,v.elem[i-1],v.elem[i+1]);
if(i==0)
数据%d在线性表%d位置处的后继数据为%d,无前驱"
x,i+1,v.elem[i+1]);
if(i==v.last-1)
数据%d在线性表%d位置处的前驱数据为%d,无后继"
x,i+1,v.elem[i-1]);
对不起,在线性表中未找到数据%d。
intmain()
intchoice,i(0),x(0);
instructions();
?
\n%d"
choice);
while(choice!
=7)
switch(choice)
case1:
build_sqlisttp();
打印线性表:
break;
case2:
请输入插入的位置:
i);
请输入插入的数值:
x);
插入的位置为%d,插入的数值为%d。
i,x);
insert_sqlisttp(i-1,x);
case3:
请输入删除的位置:
删除的位置为%d。
i);
delete_sqlisttp(i-1);
case4:
length_sqlisttp();
break;
case5:
printf("
请输入查找的元素:
scanf("
查找的元素为%d。
find_sqlisttp(i);
break;
case6:
请输入查找的数据:
left_right(i);
default:
选择错误!
运行结束!
***********宓氏出品,必属精品!
***********\n"
system("
pause"
return0;
3、运行结果:
4、程序设计注意事项:
在编关于顺序线性表的程序时,需要先确定maxlen取值(100),last的取值范围(0~99),i即用户输入的范围(1~100),判断用户输入的值及范围是否合适或线性表已满。
然后再确定删除值之后的数据如何移动,形参前是否需要&
(若结构体定义的对象为全局变量则自定义的函数中无结构体形参,若结构体定义的对象不为全局变量则自定义的函数中结构体形参需加&
),前驱后继元素在线性表中何位置才会出现。
Switch语句的用法及注意事项。
哪些变量需要初始化(v.last=0)。
最后则为建立一个方便用户,结构清晰的操作平台。
程序就基本完成了。
八、实验小结
顺序线性表是一种相对简单易懂的线性数据结构,了解线性表中数据被插入删除位置后的移动方式及last所能进行的操作(线性表的长度,线性表是否为空等等),程序基本就完成了。
虽然编写容易且寻值比链式快捷,但若线性表中数据过多,插入删除操作后的数据移动将耗大量运算时间,这是它一大缺陷。
而且它的空间利用率较差,这是它第二大缺陷。
还有它扩充表的容积,这是它的第三大缺陷。
所以,线性表中引入了链式存储结构,我将在下次实验中论述。