实验二报告线性表的链式存储Word文档格式.docx
- 文档编号:22031226
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:14
- 大小:83.95KB
实验二报告线性表的链式存储Word文档格式.docx
《实验二报告线性表的链式存储Word文档格式.docx》由会员分享,可在线阅读,更多相关《实验二报告线性表的链式存储Word文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
程序以模板形式实现,先定义类CircList,在类外定义相应功能的实现。
getData函数实现对应出列编号的返回,再由Josephus函数调用输出,输出后删除该结点,再重新定义一个新结点作为下一个结点,从新定义的结点开始利用循环找到出圈人位置的结点,输出该结点的信息,再在链表中删除该结点,接着从删除的结点的后面重复此步骤,直到链表中剩下一个结点时停止循环,再把链表中的最后一个结点删除。
按循环时输出的的顺序输出所有出列的编号。
4、程序清单
1~2:
#include<
iostream>
usingnamespacestd;
constintMax=100;
typedefstructLNode//定义存储结构
{
chardata;
structLNode*next;
}LNode,*LinkList;
//建立单链表
intinitlist(LinkList&
a)
LinkLists;
s=newLNode;
//if(!
s)
//return0;
a=s;
s->
next=NULL;
return0;
}
//输入数据
intIndata(LinkList&
intn;
cin>
>
n;
if(n<
0||n>
Max)
{
cout<
<
"
你输入的长度不正确,请重新输入:
"
;
Indata(a);
}
else
cout<
请输入链表元素:
charb;
LinkLists,p;
p=a;
for(inti=1;
i<
=n;
i++)
cin>
b;
s=newLNode;
s->
data=b;
p->
next=s;
p=s;
}
//求链表的长度
intlength(LinkLista)
LinkListp;
inti;
for(i=0;
p->
next!
=NULL;
p=p->
next;
returni;
//遍历链表
intPrintList(LinkLista)
if(length(a)==0)exit
(1);
for(p=a->
p=p->
next)
data<
'
'
data;
//按位查找元素
charGet(LinkLista,inti)
LinkListp=a;
intj;
for(j=1;
j<
=i;
j++)
returnp->
//修改链表元素
intExchange(LinkLista,inti,chark)
p->
data=k;
//在指定位置插入元素
intInsert(LinkList&
a,inti,chark)
i;
next=p->
//删除指定位置的元素
intDelete(LinkList&
a,inti)
LinkLists,p=a;
s=p->
next->
deletes;
voidmain()
voidmenu();
menu();
initlist(s);
inth=1;
while(h)
intk;
k;
switch(k)//多分支选择结构
{
case1:
//输入数据
{
cout<
输入链表长度:
Indata(s);
endl;
cout<
链表为:
PrintList(s);
menu();
}break;
case2:
//按位查找元素
请输入要查找元素的位置:
cin>
if(i<
=0||i>
length(s))
{
cout<
你的输入有误,请重新输入:
cin>
}
该位置的元素是:
<
Get(s,i)<
case3:
//修改链表元素
请输入要修改元素的位置和改成的元素:
;
i>
if(i<
0||i>
你的输入的位置有误,请重新输入位置:
}
Exchange(s,i,b);
修改后的链表:
PrintList(s);
case4:
//在指定位置插入元素
请输入插入位置和元素:
Insert(s,i,b);
插入后的链表:
新链表总长度:
length(s);
case5:
//删除指定位置的元素
请输入删除元素的位置:
你输入的位置有误,请重新输入:
Delete(s,i);
删除后的链表:
default:
//结束程序
程序结束,请按任意键退出!
exit
(1);
}
//菜单函数
voidmenu()
-------菜单--------"
1.初始化链表"
2.按位查找元素"
3.修改指定位置元素"
4.在指定位置插入元素"
5.删除指定位置的元素"
6.退出程序"
-------------------"
请选择:
输出结果:
1.初始化链表
2.查找元素
3.修改指定位置元素
4.插入元素
5.删除指定位置的元素
6.结束程序
3:
#include<
template<
classT>
classCircList
public:
CircList(Tvalue,intk);
//构造函数
CircList(Td=0,CircList<
T>
*next=NULL):
data(d),link(next){}//结点构造函数
TgetData()const{returncurrent->
};
//返回当前结点值
voidFirster(){current=first;
}//设置当前指针为头指针
voidNext(){current=current->
link;
}//将当前指针指向当前结点的后继
voidInsert(constT&
value);
//插入新结点
voidDelete();
//删除当前结点
voidJosephus(intn,intm);
//约瑟夫问题的解决,按顺序输出出列编号
private:
CircList<
*first,*current,*last;
Tdata;
*link;
//循环链表的构造
CircList<
:
CircList(Tvalue,intk)
first=last=newCircList<
(value);
first->
link=first;
current=NULL;
//插入新结点
voidCircList<
Insert(constT&
value)
if(current==NULL)
current=first->
link=newCircList<
(value,first);
else{
CircList<
*newnode=newCircList<
(value,current->
link);
if(current->
link=first)last=newnode;
current->
link=newnode;
current=current->
//删除当前结点,进入下一个结点
Delete()
*p=first,*q=last;
while(p->
data!
=getData()){q=p;
current=q->
link=p->
if(p==first)first=current;
if(p==last)last=q;
//约瑟夫问题的解决,按顺序输出出列编号
Josephus(intn,intm)
Firster();
cout<
出列的顺序:
for(inti=0;
{
for(intj=0;
m-1;
Next();
if(i!
=n)
cout<
getData()<
Delete();
}
int>
clist(1,10000);
intn,m;
输入队列总人数:
cin>
输入出列的数字:
m;
for(inti=2;
clist.Insert(i);
clist.Josephus(n,m);
4、心得体会
这两个实验,均是对链表实现的应用,主要是对单链表和单循环链表基本操作的运用,实现时特别要注意的是链表存储结构的结点的使用,通过这两个实验的实践操作,我发现结点的运用是相对较难的部分,使用时需要特别小心。
通过这两个实验,我对链表的运用有了更深一层的认识,但还是感觉底气足,还需更加努力去学习。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 报告 线性 链式 存储