顺序表.docx
《顺序表.docx》由会员分享,可在线阅读,更多相关《顺序表.docx(13页珍藏版)》请在冰豆网上搜索。
顺序表
成绩评定
教师签名
嘉应学院计算机学院
《数据结构》实验报告
课程名称:
数据结构
开课学期:
2016-2017学年第1学期
班级:
1401
指导老师:
钟治初
实验题目:
顺序表
学号:
141110043
姓名:
苏永达
提交时间:
2016年10月27日
一、实验要求
1、假设顺序表L是递增有序的,表中有些数据是相同的,设计算法删除表中重复的元素,使得表中的元素值各不相同。
2、假设用有序表表示集合,设计算法,实现集合的并,交,差运算。
3、设计算法,将顺序表中元素值最大的两个数据放在最前面,元素值最小的两个数据放在最后面。
二、实验过程中遇到的问题
调试过程中主要遇到哪些问题?
是如何解决的?
删除多余元素——将i和j搞混,导致计数啥乱了;误将==写成=,结果根本就没有运行删除算法;在每次删除之后没有j--,结果当重复多个元素之后,只能删除一个元素,后来明白,每删除一个元素,j--,才能使j指向再次重复的元素。
合并函数——开始的时候自己使用for循环,不能正确的指定循环条件,即使指定了,不知道为何不能循环for语句。
即使依依比较了两个两个线性表的元素,若两个表的元素书,数目不等,当一个表结束后不知道如何处理剩余的一个表(循环条件找不对)。
后来使用使用while语句,就正确的编写了程序,使用while的过程中,由于i和j搞乱过也导致不能正确运行。
三、实验内容:
顺序表置空
#include
#definemaxlen20
typedefstruct{
intdata[maxlen];
intlast;
}Sequenlist;
voidSqLsetnull(Sequenlist*L){
L->last=-1;}
voidmain()
{Sequenlistl;
SqLsetnull(&l);
}
顺序表求表长
#include
#definemaxlen20
typedefstruct{
intdata[maxlen];
intlast;
}Sequenlist;
intsqllength(Sequenlist*l)
{return(l->last+1);}
voidmain()
{Sequenlistl;
inti;
for(i=0;i<10;i++)
scanf("%d",&l.data[i]);
l.last=i-1;
printf("%d",sqllength(&l));
}
按序号取元素程序
#include
#definemaxlen20
typedefstruct{
intdata[maxlen];
intlast;
}sequenlist;
intsqlget(sequenlist*l,inti)
{
intx;
if(i<1||i>l->last+1)
printf("超出范围");
else
x=l->data[i-1];
returnx;
}
voidmain()
{
sequenlistl;
inti,j;
for(i=0;i<10;i++)
scanf("%d",&l.data[i]);
l.last=i-1;
printf("请输入序号\n");
scanf("%d",&j);
printf("%d",sqlget(&l,j));
}
按值查找程序
#include
#definemaxlen20
typedefstruct{
intdata[maxlen];
intlast;
}Sequenlist;
voidsqllocate(Sequenlist*l,intx)
{
inti,z=0;
for(i=0;ilast+1;i++)
if(l->data[i]==x){
printf("%d",i+1);
z=1;}
if(z==0)
printf("%d",-1);
}
voidmain()
{
Sequenlistl;
inti,n;
for(i=0;i<5;i++)
scanf("%d",&l.data[i]);
l.last=i-1;
printf("请输入要查找的数\n");
scanf("%d",&n);
sqllocate(&l,n);
}
判表满程序
#include
#definemaxlen10
typedefstruct{
intdata[maxlen];
intlast;
}Sequenlist;
intsqlempty(Sequenlist*l)
{
if(l->last+1>=maxlen)
return
(1);
else
return(0);
}
voidmain()
{
Sequenlistl;
inti,n;
for(i=0;i<5;i++)
scanf("%d",&l.data[i]);
l.last=i-1;
printf("%d",sqlempty(&l));
}
顺序表插入程序
#include
#definemaxlen20
typedefstruct{
intdata[maxlen];
intlast;
}Sequenlist;
intsqlempty(Sequenlist*l)
{
if(l->last+1>=maxlen)
return
(1);
else
return(0);
}
intsqlinsert(Sequenlist*l,inti,intx)
{
intj;
if(sqlempty(l)==1)
{printf("overflow");
return(0);
}
elseif((i<1)||(i>l->last+2))
{
printf("error");
return(0);
}
else{
for(j=l->last;j>=i-1;j--)
l->data[j+1]=l->data[j];
l->data[i-1]=x;
l->last=l->last+1;
return
(1);
}
}voidmain()
{
Sequenlistl;
inti,n,m;
for(i=0;i<5;i++)
scanf("%d",&l.data[i]);
l.last=i-1;
printf("请输入插入的位置和元素\n");
scanf("%d%d",&m,&n);
sqlinsert(&l,m,n);
for(i=0;i<6;i++)
printf("%d",l.data[i]);
}
删除元素程序
#include
#definemaxlen20
typedefstruct{
intdata[maxlen];
intlast;
}sequenlist;
intsqldelete(sequenlist*l,inti)
{
intj;
if(l->last<0)
{
printf("顺序表为空");
return0;
}
elseif((i<1)||(i>l->last+1))
{
printf("参数出错");
return0;
}
else
{
for(j=i;j<=l->last+1;j++)
l->data[j-1]=l->data[j];
l->last--;
return1;
}
}
voidmain()
{
sequenlistl;
inti,n;
for(i=0;i<5;i++)
scanf("%d",&l.data[i]);
l.last=i-1;
printf("请输入删除的位置\n");
scanf("%d",&n);
printf("%d",sqldelete(&l,n));
}
五.程序运行结果
求表长
按序号取元素
按值查找
判表满
顺序表插入
删除元素
四、实验总结
本次实验主要考查的的是顺序表的应用及编写,而其他的很多功能都是原来练习过的,相对来说比较容易。
但是完成本次实验收获还是很多的,不仅仅实在新知识上的加深,进一步了解顺序表;同时也巩固了原来c程序中很多基本语法。
由于本次实验的类型与原来的课程设计很像,所以我在本次试验中加入了一些新的实现方式,还有就是尽量多的覆盖原来学到的知识点,并将其应用到本次实验中。
但是本次程序由于时间关系,只简单实现了相关的功能,在程序很多的细节方面并没有得到完善,最重要的就是用户在输入过程中,要是没有按照规则输入产生的错误处理,以及更好的循环操作等等,都需要进一步的完善。
但话说回来,这些都只是原来做过的工作,目的只在于完善一个程序,而对本次试验需要练习的内容没有太大冲突,所以在本次程序中,只有很少的报错和循环功能,望理解。