林泽全16号实验一报告.docx
- 文档编号:30618224
- 上传时间:2023-08-18
- 格式:DOCX
- 页数:17
- 大小:74.33KB
林泽全16号实验一报告.docx
《林泽全16号实验一报告.docx》由会员分享,可在线阅读,更多相关《林泽全16号实验一报告.docx(17页珍藏版)》请在冰豆网上搜索。
林泽全16号实验一报告
数据结构实验一实验报告
一、目标与要求
实现不带头结点形式的单链表。
二、工具/准备工作
安装有VisualC++6.0等集成开发环境软件的计算机。
三、实验分析
在几乎所有数据结构与算法的教材中都在线性链表中使用头结点,其原因是使用了头结点编程更简洁,效率更高,如果我们具体实现不带头结点形式的单链表,则理解将更加深入,对提高算法领悟力有所帮助。
一个线性表的不带头结点的单链表中没有数据的时候,这时便没有结点,也就是first=NULL。
对于不带头结点的单链表,在具体实现时,可仿照带头结点的单链表,定义表SimpleLinkListNodeWithoutHeadNode。
第一个元素的前驱结点为头结点,对所有元素都有都非空的前驱结点,因此可作统一处理,而对于不带头结点的单链表,第一个元素的前驱为空,其他元素则有非空的前驱,对于插入、删除等操作都需要对第一个元素单独进行讨论,算法要复杂些。
四、实验步骤
(1)建立工程simple_lk_list_without_head_node。
(2)将软件包中的utility.h和node.h复制到simple_lk_list_without_head_node文件夹中,并将utility.h和node.h加入到工程中。
(3)建立头文件simple_lk_list_without_head_node.h,声明不带头结点的单链表类,并实现相关的成员函数。
具体内容如下:
#ifndef__SIMPLE_LK_LIST_WITHOUT_first_NODE_H__
#define__SIMPLE_LK_LIST_WITHOUT_first_NODE_H__
#include"node.h"
#include"utility.h"
//无头结点的简单线性链表类
template
classSimpleLinkListWithoutHeadNode
{
protected:
//链表实现的数据成员:
Node
//辅助函数
Node
voidInit();//初始化线性表
public:
//抽象数据类型方法声明及重载编译系统默认方法声明:
SimpleLinkListWithoutHeadNode();//无参数的构造函数
virtual~SimpleLinkListWithoutHeadNode();//析构函数
intLength()const;//求线性表长度
boolEmpty()const;//判断线性表是否为空
voidClear();//将线性表清空
voidTraverse(void(*Visit)(constElemType&))const;//遍历线性表
StatusCodeGetElem(intposition,ElemType&e)const;//求指定位置的元素
StatusCodeSetElem(intposition,constElemType&e);//设置指定位置的元素值
StatusCodeDelete(intposition,ElemType&e);//删除元素
StatusCodeInsert(intposition,constElemType&e);//插入元素
SimpleLinkListWithoutHeadNode(constSimpleLinkListWithoutHeadNode
SimpleLinkListWithoutHeadNode
};
//简单线性链表类的实现部分
template
Node
:
GetElemPtr(intposition)const
{
//操作结果:
返回指向第position个结点的指针
Node
intcurPosition=1;//tmpPtr所指结点的位置
while(tmpPtr!
=NULL&&curPosition { //顺时针向后查找,直到tmpPtr指向第position个结点 tmpPtr=tmpPtr->next; curPosition++; } if(tmpPtr! =NULL&&curPosition==position) { //查找成功 returntmpPtr; } else { //查找失败 returnNULL; } } template voidSimpleLinkListWithoutHeadNode : Init() { //操作结果: 初始化线性表 first=NULL;//空链表指向首元素结构的指针为空 } template SimpleLinkListWithoutHeadNode : SimpleLinkListWithoutHeadNode() { //操作结果: 构造一个空链表 Init(); } template SimpleLinkListWithoutHeadNode : ~SimpleLinkListWithoutHeadNode() { //操作结果: 销毁线性表 Clear();//清空线性表 } template intSimpleLinkListWithoutHeadNode : Length()const { //操作结果: 返回线性表元素个数 intcount=0;//计数器 for(Node =NULL;tmpPtr=tmpPtr->next) { //用tmpPtr依次指向每个元素 count++;//对线性表的每个元素进行计数 } returncount; } template boolSimpleLinkListWithoutHeadNode : Empty()const { //操作结果: 如线性表为空,则返回true,否则返回false returnfirst==NULL; } template voidSimpleLinkListWithoutHeadNode : Clear() { //操作结果: 清空线性表 ElemTypetmpElem;//临时元素值 while(Length()>0) { //线性表非空,则删除第1个元素 Delete(1,tmpElem); } } template voidSimpleLinkListWithoutHeadNode : Traverse(void(*Visit)(constElemType&))const { //操作结果: 依次对线性表的每个元素调用函数(*Visit) for(Node =NULL;tmpPtr=tmpPtr->next) { //用tmpPtr依次指向每个元素 (*Visit)(tmpPtr->data);//对线性表的每个元素调用函数(*Visit) } } template StatusCodeSimpleLinkListWithoutHeadNode : GetElem(intposition,ElemType&e)const { //操作结果: 当线性表存在第position个元素时,用e返回其值,函数返回ENTRY_FOUND,否则函数返回NOT_PRESENT if(position<1||position>Length()) { //position范围错 returnNOT_PRESENT;//元素不存在 } else { //position合法 Node tmpPtr=GetElemPtr(position);//取出指向第position个结点的指针 e=tmpPtr->data;//用e返回第position个元素的值 returnENTRY_FOUND; } } template StatusCodeSimpleLinkListWithoutHeadNode : SetElem(intposition,constElemType&e) { //操作结果: 将线性表的第position个位置的元素赋值为e,position的取值范围为1<=position<=Length(),position合法时函数返回SUCCESS,否则返回RANGE_ERROR if(position<1||position>Length()) { //position返回错 returnRANGE_ERROR; } else { //position合法 Node tmpPtr=GetElemPtr(position);//取出指向第position个结点的指针 tmpPtr->data=e;//设置第position个元素的值 returnSUCCESS; } } template StatusCodeSimpleLinkListWithoutHeadNode : Delete(intposition,ElemType&e) { //操作结果: 删除线性表的第position个位置的元素,并用e返回其值,position的取值范围为1<=position<=Length(),position合法时函数返回SUCCESS,否则返回RANGE_ERROR if(position<1||position>Length()) { //position范围错 returnRANGE_ERROR; } else { //position合法 Node if(position>1) { //删除非第1个元素 tmpPtr=GetElemPtr(position-1);//取出指向第position-1个结点的指针 Node tmpPtr->next=nextPtr->next;//删除结点 e=nextPtr->data;//用e返回被删结点元素值 deletenextPtr;//释放被删结点 } else { //删除第1个元素 tmpPtr=first;//暂存first first=first->next;//first指向后继 deletetmpPtr;//释放被删除结点 } returnSUCCESS; } } template StatusCodeSimpleLinkListWithoutHeadNode : Insert(intposition,constElemType&e) { //操作结果: 在线性表的第position个位置前插入元素e,position的取值范围为1<=position<=Length(),position合法时函数返回SUCCESS,否则返回RANGE_ERROR if(position<1||position>Length()+1) { //position范围错 returnRANGE_ERROR;//位置不合法 } else { //position合法 Node if(position>1) { //插入元素不为第1个元素 Node //取出指向第position-1个结点的指针 newPtr=newNode tmpPtr->next=newPtr;//将newPtr插入到链表中 } else { //插入元素为第1个元素 newPtr=newNode first=newPtr;//newPtr为新的第1个元素的结点 } } } template SimpleLinkListWithoutHeadNode : SimpleLinkListWithoutHeadNode(constSimpleLinkListWithoutHeadNode { //操作结果: 由线性表copy构造新线性表——复制构造函数 intcopyLength=copy.Length();//copy的长度 ElemTypee; Init();//初始化线性表 for(intcurPosition=1;curPosition<=copyLength;curPosition++) { //复制数据元素 copy.GetElem(curPosition,e);//取出第curPosition个元素 Insert(Length()+1,e);//将e插入到当前线性表 } } template SimpleLinkListWithoutHeadNode : operator=(constSimpleLinkListWithoutHeadNode { //操作结果: 将线性表copy赋值到当前线性表——赋值运算符 if(©! =this) { intcopyLength=copy.Length();//copy的长度 ElemTypee; Clear();//清空当前线性表 for(intcurPosition=1;curPosition<=copyLength;curPosition++) { //复制数据元素 copy.GetElem(curPosition,e);//取出第curPosition个元素 Insert(Length()+1,e);//将e插入到当前线性表 } } return*this; } #endif (4)建立源程序文件main.cpp,实现main()函数,并且实现具体代码如下: #include"utility.h"//实用程序软件包 #include"simple_lk_list_without_head_node.h"//无头结点的简单线性链表类 intmain() { charc='0'; SimpleLinkListWithoutHeadNode doublee; intposition; while(c! ='7') { cout< cout< cout< cout< cout< cout< cout< cout< "; cin>>c; switch(c) { case'1': cout< "; cin>>e; while(e! =0) { la.Insert(la.Length()+1,e);//输入e cin>>e; } break; case'2': lb=la;//测试赋值运算符 lb.Traverse(Write break; case'3': cout< "; cin>>position; if(la.GetElem(position,e)==NOT_PRESENT) cout<<"元素不存储."< else cout<<"元素: "< break; case'4': cout< "; cin>>position; cout< "; cin>>e; if(la.SetElem(position,e)==RANGE_ERROR) cout<<"位置范围错."< else cout<<"设置成功."< break; case'5': cout< "; cin>>position; if(la.Delete(position,e)==RANGE_ERROR) cout<<"位置范围错."< else cout<<"被删除元素值: "< break; case'6': cout< "; cin>>position; cout< "; cin>>e; if(la.Insert(position,e)==RANGE_ERROR) cout<<"位置范围错."< else cout<<"插入成功: "< break; } } system("pause");//调用库函数system() return0;//返回值0,返回操作系统 } (5)编译及运行不带头结点的单链表测试程序。 五、测试与结论 测试时,应注意尽量覆盖算法的各种情况。 从屏幕显示结果,可知本程序满足实验目标与要求。 六、实验总结 算法中SimpleLinkListWithoutHeadNode是一种简单的实现方式,读者较易理解,但算法效率很低,我们也可以在不带头结点的单链表结构中保存当前位置和元素个数以提高算法效率。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 林泽全 16 实验 报告