实验3 线性表的链式存储讲解Word文档格式.docx
- 文档编号:20492444
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:25
- 大小:48.37KB
实验3 线性表的链式存储讲解Word文档格式.docx
《实验3 线性表的链式存储讲解Word文档格式.docx》由会员分享,可在线阅读,更多相关《实验3 线性表的链式存储讲解Word文档格式.docx(25页珍藏版)》请在冰豆网上搜索。
//在单链表中第i个位置插入元素值为x的结点
voiddestroy()//在单链表中删除所有的结点
voidPrintList();
//遍历单链表,按序号依次输出各元素
intEmpty()//判断表是否为空
*head;
//单链表的头指针
};
(2)初始化带头结点空单链表构造函数实现
输入:
无
前置条件:
动作:
初始化一个带头结点的空链表
输出:
后置条件:
头指针指向头结点。
LinkList<
:
LinkList()
head=newNode<
head->
next=NULL;
(3)利用数组初始化带头结点的单链表构造函数实现
已存储数据的数组及数组中元素的个数
利用头插或尾插法创建带头结点的单链表
头指针指向头结点,且数组中的元素为链表中各结点的数据成员。
LinkList(datatypea[],intn)
{inti;
*s;
for(i=0;
i<
n;
i++)
s=newNode<
s->
data=a[i];
next=head->
next;
next=s;
}
(4)在带头结点单链表的第i个位置前插入元素e算法
插入位置i,待插入元素e
i的值要合法
在带头结点的单链表中第i个位置之前插入元素e
单链表中增加了一个结点
voidLinkList<
Insert(inti,datatypex)
{
*p;
intj;
p=head;
j=0;
//指针p初始化
while(p&
&
j<
i-1)
{
p=p->
//指针p后移
j++;
}//找插入点
if(!
p)
cout<
<
"
i不合法!
"
else{
Node<
data=x;
next=p->
p->
(5)在带头结点单链表中删除第i个元素算法
删除第i个结点,待存放删除结点值变量e
单链表不空,i的值要合法
在带头结点的单链表中删除第i个结点,并返回该结点的值(由e传出)。
单链表中减少了一个结点
datatypeLinkList<
Delete(inti)
{if(head->
next==NULL)
Cout<
”表为空,无法删除!
”;
i-1)
}//找到第i-1个结点
p||!
p->
next)
throw“i不合法”;
q=p->
x=q->
data;
next=q->
deleteq;
returnx;
(6)遍历单链表元素算法
单链表不空
遍历输出单链表中的各元素。
PrintList()
{Node<
p=head->
//p指向首结点
while(p)//p!
=NULL
cout<
cout<
””;
p=p->
(7)求单链表表长算法。
求单链表中元素个数。
返回元素个数
intLinkList<
Length()
Node<
*p;
p=head->
inti=0;
while(p)
p=p->
i++;
returni;
(8)判单链表表空算法
判表是否为空。
为空时返回1,不为空时返回0
Length()
next=NULL)
return1;
return0;
(9)获得单链表中第i个结点的值算法
i不空,i合法
找到第i个结点。
返回第i个结点的元素值。
Get(inti)
intj;
//计数器
j=1;
//或p=head;
i)
//工作指针p后移
if(!
“i值不合法,超过了元素的个数!
elsereturnp->
(10)删除链表中所有结点算法(这里不是析构函数,但功能相同)
单链表存在
清除单链表中所有的结点。
头指针指向空
template<
voidlinklist<
destroy()
*p;
while(head->
next!
=NULL)
p=head;
head=head->
deletep;
(11)上机实现以上基本操作,写出main()程序:
参考p72
voidmain()
inta[]={9,2,3,4,5,6},n=6;
LinkList<
int>
mylist;
for(inti=0;
i<
i++)
mylist.Insert(i,a[i]);
yichishuchushuju:
endl;
mylist.PrintList();
表长为:
mylist.Length()<
mylist.Insert(5,8);
mylist.Empty();
mylist.destroy();
粘贴测试数据及运行结果:
2、参考单链表操作定义与实现,自行完成单循环链表的类的定义与相操作操作算法。
(1)利用数组初始化带头结点的单循环链表构造函数实现
利用头插或尾插法创建带头结点的单循环链表
头指针指向头结点,且数组中的元素为链表中各结点的数据成员,尾指针指向头结点。
linklist<
linklist(datatypea[],intn)
{
node<
head=newnode<
next=head;
s=newnode<
s->
head->
(2)在带头结点单循环链表的第i个位置前插入元素e算法
在带头结点的单循环链表中第i个位置之前插入元素e
单循环链表中增加了一个结点
insert(inti,datatypeitem)
//指针p初始化
while(p->
=head&
//指针p后移
}//找插入点
i不合法!
else
node<
*s;
s=newnode<
//申请一个结点
data=item;
//将插入元素保存在P结点中
}
(3)在带头结点单循环链表中删除第i个元素算法
单循环链表不空,i的值要合法
在带头结点的单循环链表中删除第i个结点,并返回该结点的值(由e传出)。
单循环链表中减少了一个结点
datatypelinklist<
next==head)
表为空,无法删除!
*p,*q;
}
i不合法"
datatypex;
(4)遍历单循环链表元素算法
单循环链表不空
遍历输出单循环链表中的各元素。
putlist()
{node<
//p=head;
if(p->
表为空"
else
while(p!
=head)//p->
=head
data<
//p=p->
//cout<
(5)上机实现以上基本操作,写出main()程序:
inta[]={45,89,9,13,8,2},n=6;
linklist<
s;
s.insert(i,a[i]);
s.insert(1,14);
第一次遍历链表元素输出:
s.putlist();
s.Delete(3);
第二次遍历表输出;
3、采用链式存储方式,并利用单链表类及类中所定义的算法加以实现线性表La,Lb为非递减的有序线性表,将其归并为新线性表Lc,该线性表仍有序(未考虑相同时删除一重复值)的算法。
模板函数:
#include<
iostream.h>
template<
classtype>
classlinklist;
//前视定义
classnode
friendclasslinklist<
type>
typedata;
*next;
classlinklist
*head;
linklist();
//无参构造函数
linklist(typea[],intn);
//有参构造函数
voidprintlist();
//遍历链表
typeinsert(inti,typeitem);
//在第i个结点元素前插入元素item
intlength();
//求链表长度
voidsort();
//对新的链表元素排序并输出
typeget(inti);
//获得第i个结点元素
linklist()
linklist(typea[],intn)
typelinklist<
insert(inti,typeitem)
intj=0;
p)
else
//申请一个结点
//将插入元素保存在s结点中
p->
returnitem;
intlinklist<
length()
node<
p=head;
intn=0;
while(p!
n++;
returnn;
get(inti)
i值不合法!
returnp->
sort()
typetemp;
q=p->
while(q)
{
if(p->
data>
q->
data)
{
temp=p->
p->
data=q->
q->
data=temp;
}
q=q->
}
printlist()
while(p)
inta[]={1,66,0,5,2,6,7};
intb[]={3,4,6,7,8,76};
La(a,7);
Lb(b,6);
第一组元素输出:
La.printlist();
第二组元素输出:
Lb.printlist();
for(inti=2;
Lb.length()+1;
La.insert(i,Lb.get(i));
//将数组a的元素插入到b当中去
合并后的元素为:
La.sort();
//排序
合并后元素个数为:
La.length()<
选做题:
1、按一元多项式ADT的定义,实现相关操作算法:
ADTPNodeis
Data
系数(coef)
指数(exp)
指针域(next):
指向下一个结点
Operation
暂无
endADTPNode
ADTPolynomialis
Data
PNode类型的头指针。
Operation
Polynomail
初始化值:
动作:
申请头结点,由头指针指向该头结点,并输入m项的系数和指数,建立一元多项式。
DestroyPolyn
输入:
多项式已存在
消毁多项式。
PolyDisplay
多项式已存在,不为空
输出多项式各项系数与指数
AddPoly
另一个待加的多项式
一元多项式pa和pb已存在。
动作及后置条件:
完成多项式相加运算,(采用pa=pa+pb形式,并销毁一元多项式pb)
endADTPolynomial
2、实现一元多项式的减法,操作描述如下:
SubPoly
待减的多项式pb
完成多项式减法运算,即:
pa=pa-pb,并销毁一元多项式pb。
3、参考P74-P79页双向链表的存储结构定义及算法,编程实现双向链表的插入算法和删除算法。
classlinklist;
{friendclasslinklist<
typedata;
*next,*prior;
linklist();
linklist(typea[],intn);
//建立有n个元素的双向链表
~linklist(){}//析构函数,释放整个链表空间
//求双向链表的长度
typeinsert(inti,typex);
//在双向链表中第i个位置插入元素值为x的结点
typeDelete(inti);
//删除第i个位置的元素
voidprintlist();
//遍历双向链表,按序号依次输出
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验3 线性表的链式存储讲解 实验 线性 链式 存储 讲解