实验3线性表的链式存储.docx
- 文档编号:1333425
- 上传时间:2022-10-20
- 格式:DOCX
- 页数:21
- 大小:121.35KB
实验3线性表的链式存储.docx
《实验3线性表的链式存储.docx》由会员分享,可在线阅读,更多相关《实验3线性表的链式存储.docx(21页珍藏版)》请在冰豆网上搜索。
实验3线性表的链式存储
实验报告三线性表的链式存储
班级:
2010251姓名:
李鑫学号:
20103277专业:
信息安全
一、实验目的:
(1)掌握单链表的基本操作的实现方法。
(2)掌握循环单链表的基本操作实现。
(3)掌握两有序链表的归并操作算法。
二、实验内容:
(请采用模板类及模板函数实现)
1、线性表链式存储结构及基本操作算法实现
[实现提示](同时可参见教材p64-p73页的ADT描述及算法实现及ppt)函数、类名称等可自定义,部分变量请加上学号后3位。
也可自行对类中所定义的操作进行扩展。
所加载的库函数或常量定义:
(1)单链表存储结构类的定义:
//文件包含在LinList.h中
template
classLinkList;
template
classNode
{
friendclassLinkList
private:
Node
datatypedata;
};
template
classLinkList
{
public:
LinkList();//建立只有头结点的空链表
LinkList(datatypea[],intn);//建立有n个元素的单链表
~LinkList(){};//析构函数,释放整个链表空间
intLength();//求单链表的长度
datatypeGet(inti);//取单链表中第i个结点的元素值
intLocation(datatypex);//求单链表中值为x的元素序号
voidInsert(inti,datatypex);//在单链表中第i个位置插入元素值为x的结点
datatypeDelete(inti);//在单链表中删除第i个结点
voidPrintList();//遍历单链表,按序号依次输出各元素
boolIsEmpty();//是否为空,空返回1,否则返回0
voidDeleteAll();//删除所有的元素
private:
Node
};
(2)初始化带头结点空单链表构造函数实现
输入:
无
前置条件:
无
动作:
初始化一个带头结点的空链表
输出:
无
后置条件:
头指针指向头结点。
template
LinkList
:
LinkList()
{
head=newNode
head->next=NULL;
}
(3)利用数组初始化带头结点的单链表构造函数实现
输入:
已存储数据的数组及数组中元素的个数
前置条件:
无
动作:
利用头插或尾插法创建带头结点的单链表
输出:
无
后置条件:
头指针指向头结点,且数组中的元素为链表中各结点的数据成员。
template
LinkList
:
LinkList(datatypea[],intn)
{
head=newNode
head->next=NULL;
Node
for(inti=0;i { s=newNode s->data=a[i]; s->next=head->next; head->next=s; } } (4)在带头结点单链表的第i个位置前插入元素e算法 输入: 插入位置i,待插入元素e 前置条件: i的值要合法 动作: 在带头结点的单链表中第i个位置之前插入元素e 输出: 无 后置条件: 单链表中增加了一个结点 template voidLinkList : Insert(inti,datatypex) { Node while(p&&j { p=p->next; j++; } if(! p)throw"i不合法"; else { Node s->data=x; s->next=p->next; p->next=s; } } (5)在带头结点单链表中删除第i个元素算法 输入: 删除第i个结点,待存放删除结点值变量e 前置条件: 单链表不空,i的值要合法 动作: 在带头结点的单链表中删除第i个结点,并返回该结点的值(由e传出)。 输出: 无 后置条件: 单链表中减少了一个结点 template datatypeLinkList : Delete(inti) { Node p=head;intj=0; while(p&&j { p=p->next; j++; } if(! p||! p->next) { throw"i不合法"; } else { Node datatypex; q=p->next; x=q->data; p->next=q->next; deleteq; returnx; } } (6)遍历单链表元素算法 输入: 无 前置条件: 单链表不空 动作: 遍历输出单链表中的各元素。 输出: 无 后置条件: 无 template voidLinkList : PrintList() { Node p=head; if(! p->next) cout<<"表为空"; else { while(p->next) { p=p->next; cout< } } /*Node while(p) { cout< p=p->next; }*/ } (7)求单链表表长算法。 输入: 无 前置条件: 无 动作: 求单链表中元素个数。 输出: 返回元素个数 后置条件: 无 template intLinkList : Length() { Node inti=0; p=head->next; while(p) { i++; p=p->next; } returni; } (8)判单链表表空算法 输入: 无 前置条件: 无 动作: 判表是否为空。 输出: 为空时返回1,不为空时返回0 后置条件: 无 template boolLinkList : IsEmpty() { if(head->next==NULL)return1;//if(! head->next)return1; return0; /*if(this->Length()==0) { return1; } */ } (9)获得单链表中第i个结点的值算法 输入: 无 前置条件: i不空,i合法 动作: 找到第i个结点。 输出: 返回第i个结点的元素值。 后置条件: 无 template datatypeLinkList : Get(inti) { Node intj=1; while(p&&j { p=p->next; j++; } if(! p)throw"i不合法"; elsereturnp->data;//p->next->data;错误 } (10)删除链表中所有结点算法(这里不是析构函数,但功能相同) 输入: 无 前置条件: 单链表存在 动作: 清除单链表中所有的结点。 输出: 无 后置条件: 头指针指向空 template voidLinkList : DeleteAll() { /*Node while(head->next) { p=head->next; head->next=p->next; deletep; }*/ Node p=head; while(p) { q=p; p=p->next; deleteq; } head->next=NULL; } (11)上机实现以上基本操作,写出main()程序: 参考p72 voidmain() { ints[]={10,9,8,7,6,5,4,3,2,1};intn=10; cout<<"构造函数插入元素: "< LinkList mylist1.PrintList(); cout< cout<<"删除全部元素后为: "< mylist1.DeleteAll(); mylist1.PrintList(); cout< "< LinkList cout< "< for(inti=0;i<10;i++) mylist.Insert(i,s[i]); //mylist.Insert(0,10); //mylist.Insert(1,9); mylist.PrintList(); cout< cout<<"表长为: "< cout<<"得到第3个元素为: "< cout<<"删除第7个元素为: "< cout<<"单链表为: "; mylist.PrintList(); cout< cout<<"第5个元素后插入99后单链表为: "; mylist.Insert(5,99); cout< mylist.PrintList(); cout< } 粘贴测试数据及运行结果: 2、参考单链表操作定义与实现,自行完成单循环链表的类的定义与相操作操作算法。 (1)利用数组初始化带头结点的单循环链表构造函数实现 输入: 已存储数据的数组及数组中元素的个数 前置条件: 无 动作: 利用头插或尾插法创建带头结点的单循环链表 输出: 无 后置条件: 头指针指向头结点,且数组中的元素为链表中各结点的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 线性 链式 存储