链表基本操作.docx
- 文档编号:28685256
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:16
- 大小:16.81KB
链表基本操作.docx
《链表基本操作.docx》由会员分享,可在线阅读,更多相关《链表基本操作.docx(16页珍藏版)》请在冰豆网上搜索。
链表基本操作
题目一链表基本操作
一、数据结构与核心算法的设计描述
1、单链表的最大长度
#defineMAXSIZE100
2、单链表的结点类型定义
/*定义elemtype为int类型*/
typedefintelemtype;
/*单链表的结点类型*/
typedefstructSTD
{
elemtypeelem;
STD*next;
}list,*linklist;
3、初始化单链表
/*函数功能:
对链表进行初始化。
参数:
链表(linklistL)。
成功初始化返回1,否则返回0*/
intinit(linklist&L)
{
L=(linklist)malloc(sizeof(list));}
6、判断链表是否为空
/*函数功能:
判断链表是否为空。
参数;链表(linklistL)。
链表为空时返回0,不为空返回1*/
intisempty(linklistL)
{
if(L->next)"
usingnamespacestd;
intmain()
{
charYES;
linklistL;
inta,b,c;
zhujiemian();
cin>>a;
cout< do { switch(a) { case1: if(init(L)==1) cout<<"初始化成功! "< else cout<<"初始化失败! "< break; case2: if(makeempty(L)==1) cout<<"链表已清空! "< else cout<<"链表清空失败! "< break; case3: b=getlength(L); cout<<"链表的长度为: "< break; case4: if(isempty(L)==1) cout<<"链表不空! "< else cout<<"链表为空! "< break; case5: if(isfull(L)==1) cout<<"链表不满! "< else cout<<"链表已满! "< break; case6: show(L); break; case7: cout<<"您要查找的元素: "; cin>>b; if(find(L,b)==1) cout<<"链表中有元素"< else cout<<"链表没中有元素"< break; case8: cout<<"您要查找的元素为: "< cin>>b; if(location(L,b)==0) cout<<"没有您要查找的元素"< else cout<<"您查找的元素"< "< break; case9: do{ cout<<"输入你要插入的位置和元素"< cin>>b>>c; while(b<=0||b>getlength(L)+1) { cout<<"插入位置错误! 请重新插入! "< cin>>b>>c; } if(insert(L,b,c)==0) cout<<"您插入的位置不对,插入失败! "< else cout<<"插入成功! "< cout<<"是否继续插入元素(Y/y继续),其他键停止插入\n"; cin>>YES; }while(YES=='Y'||YES=='y'); break; case10: do{ if(getlength(L)==0) { cout<<"链表为空无法删除! "< break; } cout<<"输入你要删除元素的位置: "< cin>>b; while(b<=0||b>getlength(L)) { cout<<"输入错误! 请重新输入! "< cin>>b; } if(deleteelem(L,b)==0) cout<<"您删除的位置不对,删除失败! "< else cout<<"删除成功! "< cout<<"是否继续删除元素(Y/y继续),其他键停止删除\n"; cin>>YES; }while(YES=='Y'||YES=='y'); break; default: break; } system("pause"); system("cls"); zhujiemian(); cin>>a; cout< }while(a>0&&a<=10); return0; } 题目二约瑟夫环问题 一、循环链表的结点类型定义 /*单链表的结点类型*/ typedefstructnode { intnumber;/*人的序号*/ intcipher;/*密码*/ structnode*next;/*指向下一个节点的指针*/ }List,*ListLink; 二、循环链表的初始化 /*函数功能: 初始化n个元素的循环链表。 参数;链表(linklistL),元素个数(intn) 通过后插法对无头结点的链表初始化。 */ voidInitList(ListLink&L,intn) { intm,i; cout<<"输入第1个人的密码: "; cin>>m; L=newList; L->number=1; L->cipher=m; L->next=L; for(i=2;i<=n;i++) { ListLinklpp; cout<<"输入第"< "; cin>>m; lpp=newList; lpp->number=i; lpp->cipher=m; lpp->next=L->next; L->next=lpp; L=L->next; } cout< L=L->next; } 三、循环链表的长度 /*函数功能: 求循环链表的长度。 参数;链表(linklistL) 通过各个扫描求循环链表长度*/ intListLength(ListLinkL) { ListLinklpp; if(L==NULL) { cout<<"链表是空的."; return0; } inti=1; lpp=L->next; while(lpp! =L) { i++; lpp=lpp->next; } returni; } 四、显示循环链表 /*函数功能: 循环链表的显示。 参数;链表(linklistL)。 通过各个扫描各个节点输出各个节点的密码*/ voidListTraverse(ListLinkL) { ListLinklpp; lpp=L; inti=1; cout<<"输入第1个人的密码: "< lpp=lpp->next; while(lpp! =L) { i++; cout<<"输入第"< "< lpp=lpp->next; } cout< } 五、约瑟夫环实现 /*函数功能: 实现所有人的出列次序。 参数;链表(linklistL),密码(intm)。 每次要找到出列者的前驱,把出列者删除*/ voidListTraverse(ListLinkL) { ListLinklpp; lpp=L; inti=1; cout<<"输入第1个人的密码: "< lpp=lpp->next; while(lpp! =L) { i++; cout<<"输入第"< "< lpp=lpp->next; } cout< } intListLength(ListLinkL) { ListLinklpp; if(L==NULL) { cout<<"链表是空的."; return0; } inti=1; lpp=L->next; while(lpp! =L) { i++; lpp=lpp->next; } returni; } voidshixian(ListLink&L,intm) { ListLinklpp=L; ListLinkl; while(lpp->next! =L) lpp=lpp->next; for(intn=ListLength(L);n>0;n--) { cout<<"密码为: "< cout<<"出列人的编号是: "; for(inti=1;i<=m%n-1;i++) lpp=lpp->next; cout< m=lpp->next->cipher; l=lpp->next; lpp->next=l->next; deletel; } } 函数调用及主函数设计: intmain() { intm,n; ListLinkL; cout<<"输入人数(一个大于0小于30的数)和密码(一个大于0的数): "< cin>>n>>m; while(n<0||n>30||m<0) { cout<<"输入的数字不符合要求,请重新输入: "< cin>>n>>m; } cout<<"请输入"< "< InitList(L,n); cout< "< ListTraverse(L); cout< "< shixian(L,m); return0; } 总结: main函数先调用初始化循环链表的的函数voidinit(linklist&L,intn),然后将循环链表输出voidshow(linklistL),最后调用可以使人出列的函数voidJoseph(linklist&L,intm)。 本程序可以很好地运行,具有一定的除错能力,输入数据时可以对其进行判断,减少程序出现bug的可能性。 通过对本实验的操作,我熟悉了循环链表的基本操作,而且对循环链表的基本操作有了很好的掌握。 程序清单 #include"iostream" #include"" usingnamespacestd; typedefstructnode { intnumber;/*人的序号*/ intcipher;/*密码*/ structnode*next;/*指向下一个节点的指针*/ }List,*ListLink; voidInitList(ListLink&L,intn) { intm,i; cout<<"输入第1个人的密码: "; cin>>m; L=newList; L->number=1; L->cipher=m; L->next=L; for(i=2;i<=n;i++) { ListLinklpp; cout<<"输入第"< "; cin>>m; lpp=newList; lpp->number=i; lpp->cipher=m; lpp->next=L->next; L->next=lpp; L=L->next; } cout< L=L->next; } voidListTraverse(ListLinkL) { ListLinklpp; lpp=L; inti=1; cout<<"输入第1个人的密码: "< lpp=lpp->next; while(lpp! =L) { i++; cout<<"输入第"< "< lpp=lpp->next; } cout< } intListLength(ListLinkL) { ListLinklpp; if(L==NULL) { cout<<"链表是空的."; return0; } inti=1; lpp=L->next; while(lpp! =L) { i++; lpp=lpp->next; } returni; } voidshixian(ListLink&L,intm) { ListLinklpp=L; ListLinkl; while(lpp->next! =L) lpp=lpp->next; for(intn=ListLength(L);n>0;n--) { cout<<"密码为: "< cout<<"出列人的编号是: "; for(inti=1;i<=m%n-1;i++) lpp=lpp->next; cout< m=lpp->next->cipher; l=lpp->next; lpp->next=l->next; deletel; } } intmain() { intm,n; ListLinkL; cout<<"输入人数(一个大于0小于30的数)和密码(一个大于0的数): "< cin>>n>>m; while(n<0||n>30||m<0) { cout<<"输入的数字不符合要求,请重新输入: "< cin>>n>>m; } cout<<"请输入"< "< InitList(L,n); cout< "< ListTraverse(L); cout< "< shixian(L,m); return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基本 操作