实验一 数据结构 线性表报告
- 格式:doc
- 大小:113.00 KB
- 文档页数:5
线性表实验报告
班级号:T1123-03姓名: 实验方式:上机 成绩:
教师批阅处:
一、实验名称:
线性表基本操作的编程实现
二、实验方式:上机操作
三、实验目的:
线性表基本操作的编程实现,掌握线性表的建立、遍历、插入、删除、读取等基本操作
的编程实现,也可以进一步编程实现逆序等操作,存储结构可以采用顺序存储结构和链表存
储结构之一,可以依次完成主要功能来体现功能的正确性,用菜单进行管理完成大部分功能,
要求可以重复运行。鼓励学生利用基本操作进行一些更实际的应用型程序设计。
四、实验内容
1.掌握线性表的建立、遍历、插入、删除等基本操作的功能编程实现;
2.要求理解线性表主要功能的构成,学会用菜单进行管理多项功能,学会重复运行的机
制;为了体现功能的通用性,要学会编制数据输入函数和遍历函数。编程能力强的学生可以
改进数据输入的方法,可以用下面多种方式之一或同时提供。(1)键盘输入 (2)内部预
置数据 (3)计算机自动随机给出 (4)文件读入。存储结构最好是链表存储结构;
3.编程能力强的学生可以进一步编程实现查找、逆序、排序等操作;
4.继续拓展改进的功能或细节有:存储结构修改为循环链表、双向链表、双向循环链表、
静态链表等;
5.鼓励学生利用基本操作进行一些更实际的应用型程序设计;
6.对于熟练使用对象程序设计的学生鼓励使用多态来构建更通用的数据结构程序。
五、程序设计
1.线性表的建立
通过键盘输入建立线性表。先申请一个空间,然后在循环内逐个输入数据,在输入数据
前,先确定表的长度,如果长度小于或等于所规定的长度,便执行输入:
returninfo linklist::create(int number)
{
count=number;
cout<<"请输入数据:";
node *searchp=new node;
searchp=headp;
for(int i=0;i
node *newnodep=new node;
cin>>newnodep->data;
newnodep->next=NULL;
searchp->next=newnodep;
searchp=searchp->next;
}
return success;
}
2.线性表的遍历
定义一个指针,把头结点指向它,输出结束的标志是这个指针指向的是空结点:
returninfo linklist::traverse(void)
{
node * searchp;
if(empty())
return underflow;
searchp=headp->next;
cout<<"线性表中的全部数据为:";
while(searchp!=NULL)
{
cout<<" "<
searchp=searchp->next;
}
cout<
}
3.线性表的插入 }while(position>count+1); 图 1 功能菜单界面 图 2 输入操作界面 图 3 插入操作界面 图 5 删除操作界面
插入数据的前提是已经输入了数据,所以利用empty()判断是否为空表,若是则提示先
输入数据。插入时,利用指针完成插入,先提示插入的位置(位置不能超出表的长度范围),
所以当输入插入位置时,首先判断所输入的位置的合法性,如果合法则往下运行,否则一直
循环;输入位置正确时插入新的数据(直接利用老师提供的代码):
returninfo linklist::inser(int position,const int &item)
{
if(position<=0 || position>=count+2)
return range_error;
node * newnodep=new node,* searchp=headp->next,* followp=headp;
for(int i=1; i
followp=searchp;
searchp=searchp->next;
}
newnodep->data=item; //给数据赋值
newnodep->next=followp->next; //注意此处的次序相关性
followp->next=newnodep;
count++; //计数器加一
return success;
}
/*判断插入位置是否超出范围*/
if(listonface.empty())
cout<<"你尚未输入数据,不能插入数据!"<
{
do
{
cout<<"请输入要插入数据的位置:";
cin>>position;
if(position>count+1)
cout<<"抱歉!你输入的插入位置超出了范围!"<
cout<<"请输入要插入的数据:";
cin>>item;
returnvalue=listonface.inser(position,item);
cout<<"插入数据完成!"<
4.线性表的删除
和插入数据一样,要删除数据,首先得有数据,所以先判断是否为空表,然后提示要删
除的数据的位置,通过输入的位置寻找,返回该位置指向的指针,通过指针完成删除操作(利
用老师提供的代码):
returninfo linklist::delet(int position) //删除一个结点
{
if(empty())
return underflow;
if(position<=0||position>=count+1)
return range_error;
node *searchp=headp->next,*followp=headp; //这里两个指针的初始值设计
一前一后
for(int i=1; i
followp=searchp;
searchp=searchp->next;
}
followp->next=searchp->next; //删除结点的实际语句
delete searchp; //释放该结点
count--; //计数器减一
return success;
}
六、程序调试与结果
1.主界面
2.输入操作
3.插入操作
4.删除操作
七、实验总结
本次实验是对链表的基本操作,由于这部分是我学得最差的一部分,我就参
考课本提供的程序,经过两天的课余时间和一次实验课的时间,我编写完成了具
有插入和删除等基本操作的线性表。鉴于能力问题,没有扩展排序、倒序、修改
和文件保存等功能。在这次实验中,除了学到了链表的插入和删除外,我还学到
了一种很好的调试程序的方法:在程序的最后输入“*/”,然后转到程序的前面,
在合适的位置再输入“/*”,然后就对前面一小部分进行调试,改完一小部分后
就把“/*”往后移,直到最后都没错误为止。
同时,通过这次实验,我察觉到了自己对链表,不管是知识还是实际操作,
都是太差了,脑子里根本就没有链表的知识结构,离开课本就不能编程了。所以,
从这以后,要加强对链表的知识学习,掌握最基本的知识和操作,多多练习,争
取赶上大部队的步伐。
最后,我要感谢XXX同学对我的帮助,感谢他耐心为我讲解,为我修改程
序!