实验3线性表的链式存储.docx

上传人:b****2 文档编号:1333425 上传时间:2022-10-20 格式:DOCX 页数:21 大小:121.35KB
下载 相关 举报
实验3线性表的链式存储.docx_第1页
第1页 / 共21页
实验3线性表的链式存储.docx_第2页
第2页 / 共21页
实验3线性表的链式存储.docx_第3页
第3页 / 共21页
实验3线性表的链式存储.docx_第4页
第4页 / 共21页
实验3线性表的链式存储.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

实验3线性表的链式存储.docx

《实验3线性表的链式存储.docx》由会员分享,可在线阅读,更多相关《实验3线性表的链式存储.docx(21页珍藏版)》请在冰豆网上搜索。

实验3线性表的链式存储.docx

实验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)利用数组初始化带头结点的单循环链表构造函数实现

输入:

已存储数据的数组及数组中元素的个数

前置条件:

动作:

利用头插或尾插法创建带头结点的单循环链表

输出:

后置条件:

头指针指向头结点,且数组中的元素为链表中各结点的

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 人力资源管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1