线性表的链式存储结构Word文档格式.docx
《线性表的链式存储结构Word文档格式.docx》由会员分享,可在线阅读,更多相关《线性表的链式存储结构Word文档格式.docx(26页珍藏版)》请在冰豆网上搜索。
具体操作实现如下:
4、选择【4】删除元素,则会生成3个了菜单。
也只有输入相应的序号才能执行相应的功能,键入其它字符都会提示非法并要求重新输入。
如选择【1】按元素删除,要求输入待删除的元素,若键入非法数据则会提示非法,键入一个数后会查找到这个数据并删除,若键入链表中不存在的数据则提示删除失败,执行完后又跳回子菜单。
如选择【2】按位置删除,输入相应的位置值,若位置值超出了链表的长度会提示错误信息,若位置在链表长度之内,则会把相应位置的元素删除,选择【3】退出删除,则退出删除并返回主菜单。
删除前,链表为:
-44,11,12,22,12;
删除后为:
-44,11,12。
具体实现如图:
5、选择【5】显示链表则会显示当前链表所有信息,包括每个结点中元素和链表结点数。
如图所示:
6、为了测试【6】排序链表的功能,因为现有的链表为-44,11,12有序链表。
不妨先按位置插入几个数使其成为无序表,再选择【6】排序链表,排序前后如图:
7、选择【7】清空链表,则会清空当前链表,清空链表后在再次创建一个链表前无法使用其它功能。
八、在主菜单的8个选项中若键入1~8之外任何其它信息则会提示选择的操作非法,并要求重新输入。
若选择【8】退出系统,会出现
,以保证不会因为意外操作面退出系统。
选择“n”则不会退出系统,选择“y”则会退出系统。
键入其它任何信息,则会提示操作非法,并要求重新选择。
具体功能实现如图:
实验总结
1.虽然实验要求在主函数中实现对各种功能函数的调用,但考虑到可能会在主函数中实现其实现其它功能,所有在写程序并没有把调用写在主函数中,而是统一写在voidMenu()函数中,再由主函数调用这个Menu函数,以实现对链表相应的操作。
2.为提高本程序的健壮性,在写程序时,我用到了intatoi(char*p)函数来将输入的合法的字符串转化成整型数据。
由于键入整型数据地方很多,所以编写了intJudgeData()函数,在每次要输入数据的地方都调用这个函数来判断输入数据的合法性;
同样在选择相应操作时,我也相应地编写了charJudgeOperation()函数以判断选择操作的合法性,在每处需要选择相应操作的地方都调用这个函数来判断选择操作的合法性。
利用这两个函数大大提高了程序的健壮性,解决了实验一中的输入不合法类型数据会进入死循环的现象。
3.通过本次实验让我对链表的创建、插入、删除、清空、排序等操作都有了进一步的了解和深入的认识。
4.本次实验和实验一和实验二比,在健壮性上有很大的提高,并且由于对charJudgeOperation()和intJudgeData()的反复调用,节省了不少代码。
5.和实验一相比,由于本次实验在输入数据的地方调用了intJudgeData()函数,因此只能将ElemType定义为int型,若定义为char类型,则运行程序不会产生预期的效果。
这一点还望老师指正!
指导教师意见
签名:
年月日
程序清单如下:
//实验二-链表.cpp:
定义控制台应用程序的入口点。
//
#include"
stdafx.h"
#include<
iostream>
stdlib.h>
string.h>
usingnamespacestd;
typedefintElemType;
structLNode
{
ElemTypedata;
LNode*next;
};
//初始化链表
voidInitList(LNode*&
HL)
HL->
next=NULL;
}
//判断输入的数据是否为整型
intJudgeData()
charc[100];
Judge:
cin>
>
c;
if(strcmp(c,"
no"
)==0)
return(-879);
elseif(c[0]=='
-'
||c[0]>
='
0'
&
c[0]<
9'
)
{
for(inti=1;
c[i]!
\0'
;
i++)
{
if(c[i]<
'
||c[i]>
{
cout<
<
"
您输入的数据非法!
endl;
请重新输入合法类型数据:
"
gotoJudge;
}
}
returnatoi(c);
}
else
cout<
gotoJudge;
//输入相应的操作
charJudgeOperation()
judge:
if(strlen(c)==1)
if(c[0]<
1'
8'
cout<
您输入的操作不合法!
请重新选择:
gotojudge;
}
gotojudge;
return(c[0]);
//为链表录入数据
voidInputList(LNode*&
inti=0;
LNode*ap,*cp;
ap=HL;
while
(1)
i++;
(如数据已录入完毕,请输入“no”)请输入第"
i<
个数据:
ElemTypeitem=JudgeData();
if(item==-879)
您录入"
i-1<
个数据完毕!
break;
else
cp=newLNode;
ap->
next=cp;
cp->
data=item;
ap=cp;
ap->
next=NULL;
//显示链表所有信息
voidDisplayList(LNode*HL)
LNode*cp=HL->
next;
while(cp!
=NULL)
cp->
data<
cp=cp->
cout<
链表中共有"
个元素!
//查找元素和位置
voidFindList(LNode*HL,ElemTypeitem,intpos)
if(pos<
-1)
位置值无效,查找失败!
return;
elseif(pos==-1)
pos=1;
while(cp->
next!
pos++;
cp=cp->
elseif(pos==0)
while(cp!
if(cp->
data==item)
break;
else
pos++;
cp=cp->
if(cp==NULL)
没有找到您想要查找的元素!
return;
inti=1;
if(i==pos)break;
elsecp=cp->
i++;
您输入的位置值已超过链表的总长度,查找失败!
查找成功!
您所查找的元素"
在链表第"
pos<
个位置!
//向链表中插入元素
voidInsertList(LNode*&
HL,ElemTypeitem,intpos)
LNode*ap,*cp,*tp;
cp=HL->
位置值无效,插入失败!
if(item<
cp->
data)break;
ap=cp;
inti=0;
if(i+1<
pos)
位置值超出链表的长度,插入失败!
tp=newLNode;
tp->
data=item;
if(pos==1)
HL->
next=tp;
tp->
next=cp;
ap->
插入成功!
您已成功把元素"
item<
插入到第"
//删除链表中的元素
voidDeleteList(LNode*&
您输入的位置值无效,删除失败!
data==item)break;
}
没有找到您要删除的元素,删除失败!
}
i++;
您输入的位置值已超过链表的长度,删除失败!
next=cp->
ElemTypetem=cp->
data;
deletecp;
删除成功!
您所要删除的元素"
tem<
已从链表中第"
个位置删除!
//清空链表
voidEmptyList(LNode*&
LNode*tem;
if(HL->
next==NULL)
链表未创建或已被清空!
tem=cp;
deletetem;
清空链表成功!
//排序链表
voidSortList(LNode*&
LNode*tem,*cp;
tem=newLNode;
tem->
InsertList(tem,cp->
data,0);
EmptyList(HL);
链表更新成功!
排序后链表如下:
HL=tem;
//操作菜单
voidMenu()
LNode*h;
h=newLNode;
InitList(h);
ElemTypeitem;
intpos;
menu:
欢迎进入链表管理系统:
1.创建链表"
2.查找元素"
3.插入元素"
4.删除元素"
5.显示链表"
6.排序链表"
7.清空链表"
8.退出系统"
请选择您想要执行的操作:
switch(JudgeOperation())
case'
:
InputList(h);
gotomenu;
2'
if(h->
{cout<
链表未创建,查找失败!
endl<
gotomenu;
Find:
查找操作有:
1.根据元素查找位置"
2.根据位置查找元素"
3.退出查找操作"
请选择相应的查找操作:
switch(JudgeOperation())
case'
cout<
请输入你要查找的元素:
item=JudgeData();
FindList(h,item,0);
gotoFind;
请输入您要查找的位置(查看尾元素请键入-1):
pos=JudgeData();
FindList(h,0,pos);
3'
gotomenu;
default:
您选择的操作非法!
链表未创建,插入失败!
Insert:
插入操作有:
1.按有序插入"
2.按位置插入"
3.退出插入操作"
请选择相应的操作:
请输入要插入的元素:
InsertList(h,item,0);
gotoInsert;
请输入要插入的位置:
请输入要插入的元素(在末尾插入请键入-1):
InsertList(h,item,pos);
default:
4'
链表未创建,删除失败!
Delete:
删除操作有:
1.按元素删除"
2.按位置删除"
3.退出删除操作"
case'
请输入您想要删除的元素:
item=JudgeData();
DeleteList(h,item,0);
gotoDelete;
请输入您想要删除元素的位置(删除末尾元素请键入-1):
pos=JudgeData();
DeleteList(h,0,pos);
gotomenu;
default:
5'
链表未创建,请先创建!
DisplayList(h);
6'
链表未创建,排序失败!
SortList(h);
7'
EmptyList(h);
case1:
您是否要退出链表管理系统?
(y/n):
charc[100];
cin>
if(strlen(c)==1)
if(c[0]=='
n'
{
}
elseif(c[0]!
y'
c[0]!
您输入的操作不合法,请重新选择!
gotocase1;
else
gotocase1;
int_tmain(intargc,_TCHAR*argv[])
Menu();
return0;