实验3线性表的链式存储.docx
《实验3线性表的链式存储.docx》由会员分享,可在线阅读,更多相关《实验3线性表的链式存储.docx(21页珍藏版)》请在冰豆网上搜索。
![实验3线性表的链式存储.docx](https://file1.bdocx.com/fileroot1/2022-10/20/c8c78877-bb3e-4dc3-a688-5727a25057f4/c8c78877-bb3e-4dc3-a688-5727a25057f41.gif)
实验3线性表的链式存储
实验报告三线性表的链式存储
班级:
2010251姓名:
李鑫学号:
20103277专业:
信息安全
一、实验目的:
(1)掌握单链表的基本操作的实现方法。
(2)掌握循环单链表的基本操作实现。
(3)掌握两有序链表的归并操作算法。
二、实验内容:
(请采用模板类及模板函数实现)
1、线性表链式存储结构及基本操作算法实现
[实现提示](同时可参见教材p64-p73页的ADT描述及算法实现及ppt)函数、类名称等可自定义,部分变量请加上学号后3位。
也可自行对类中所定义的操作进行扩展。
所加载的库函数或常量定义:
(1)单链表存储结构类的定义:
//文件包含在LinList.h中
template
classLinkList;
template
classNode
{
friendclassLinkList;
private:
Node*next;
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*head;//单链表的头指针
};
(2)初始化带头结点空单链表构造函数实现
输入:
无
前置条件:
无
动作:
初始化一个带头结点的空链表
输出:
无
后置条件:
头指针指向头结点。
template
LinkList:
:
LinkList()
{
head=newNode;
head->next=NULL;
}
(3)利用数组初始化带头结点的单链表构造函数实现
输入:
已存储数据的数组及数组中元素的个数
前置条件:
无
动作:
利用头插或尾插法创建带头结点的单链表
输出:
无
后置条件:
头指针指向头结点,且数组中的元素为链表中各结点的数据成员。
template
LinkList:
:
LinkList(datatypea[],intn)
{
head=newNode;
head->next=NULL;
Node*s;
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*p=head;intj=0;
while(p&&j
{
p=p->next;
j++;
}
if(!
p)throw"i不合法";
else
{
Node*s=newNode;
s->data=x;
s->next=p->next;
p->next=s;
}
}
(5)在带头结点单链表中删除第i个元素算法
输入:
删除第i个结点,待存放删除结点值变量e
前置条件:
单链表不空,i的值要合法
动作:
在带头结点的单链表中删除第i个结点,并返回该结点的值(由e传出)。
输出:
无
后置条件:
单链表中减少了一个结点
template
datatypeLinkList:
:
Delete(inti)
{
Node*p;
p=head;intj=0;
while(p&&j{
p=p->next;
j++;
}
if(!
p||!
p->next)
{
throw"i不合法";
}
else
{
Node*q;
datatypex;
q=p->next;
x=q->data;
p->next=q->next;
deleteq;
returnx;
}
}
(6)遍历单链表元素算法
输入:
无
前置条件:
单链表不空
动作:
遍历输出单链表中的各元素。
输出:
无
后置条件:
无
template
voidLinkList:
:
PrintList()
{
Node*p;
p=head;
if(!
p->next)
cout<<"表为空";
else
{
while(p->next)
{
p=p->next;
cout<data<<"";
}
}
/*Node*p=head->next;
while(p)
{
cout<data<<"";
p=p->next;
}*/
}
(7)求单链表表长算法。
输入:
无
前置条件:
无
动作:
求单链表中元素个数。
输出:
返回元素个数
后置条件:
无
template
intLinkList:
:
Length()
{
Node*p;
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*p=head->next;
intj=1;
while(p&&j
{
p=p->next;
j++;
}
if(!
p)throw"i不合法";
elsereturnp->data;//p->next->data;错误
}
(10)删除链表中所有结点算法(这里不是析构函数,但功能相同)
输入:
无
前置条件:
单链表存在
动作:
清除单链表中所有的结点。
输出:
无
后置条件:
头指针指向空
template
voidLinkList:
:
DeleteAll()
{
/*Node*p;
while(head->next)
{
p=head->next;
head->next=p->next;
deletep;
}*/
Node*p,*q;
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<<"构造函数插入元素:
"<LinkListmylist1(s,10);
mylist1.PrintList();
cout<cout<<"删除全部元素后为:
"<mylist1.DeleteAll();
mylist1.PrintList();
cout<"<LinkListmylist;
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)利用数组初始化带头结点的单循环链表构造函数实现
输入:
已存储数据的数组及数组中元素的个数
前置条件:
无
动作:
利用头插或尾插法创建带头结点的单循环链表
输出:
无
后置条件:
头指针指向头结点,且数组中的元素为链表中各结点的