q=(linklist)malloc(sizeof(linknode));//开辟新的结点空间并转化为linklist指针型
cin>>q->data;
q->link=p->link;//将前面一个结点的指向(及NULL)赋给新开辟的结点的指向
p->link=q;//将插入点前面一个结点指向新开辟的的结点
p=q;//将指明的最后一个一个结点向后移1位到最后一位,以便后面接着输入
}
删除结点子函数:
voiddelate(linklist&l){//删除单链表数据
linklistp;intm,n,i=0;
cout<<"请输入想要删除的结点位置"<cin>>m;
p=l;//将头结点赋给转移指针p
while(p&&ip=p->link;//当在单链表中间已查到删除结点或p=NULL时跳出循环
i++;
}
if(p==NULL){//当p=NULL跳出循环时,表明链表中没有该结点
cout<<"该结点不存在,删除错误"<}
n=p->link->data;//找到删除接结点将数据取出并显示出来(找结点时是找的前一个结点)
cout<<"被删除的结点元素为:
"<p->link=p->link->link;//将删除结点的前后结点链接起来
}
链表的删除,插入操作是类似的,要考虑到加入或减少一个结点后,前后结点的链接关系,以及删除或插入的是最后一个结点时,新空间的开辟与结点收尾等问题。
其中删除功能的一部分就是查找功能,显示功能也是从链表的头结点遍历至最后一个,依次输出。
(4)实验结果与分析
3 心得体会
本次数据结构实习我收获颇丰,以前学过c语言与c++也有经常上机,但以往都是偏向于程序整体的算法设计,没有像这次的实习这样是着重在线性表,链表结构的算法设计上面。
这次上机实习,让我更加熟练了结构体及结构体指针的用法,线性表的设计等等,同时在这次实习中,引用,指针,地址这三个的用法曾一度让我混淆,在查阅书籍后才得以解决,也希望老师在课堂上有时间时给我们详细讲解一下,指针,地址,引用三者的使用。
附录:
顺序表源代码:
#include
usingnamespacestd;
#definemaxsize50
typedefintTypeData;
typedefstruct{
TypeDatadata[maxsize];
intn;
}SeqList;
voidmakeSeq(SeqList&L)//输入线性表数据
{
intm,n,k;
cout<<"请输入线性表长度"<cin>>m;
for(n=0;n{
cout<<"请输入线性表数据"<cin>>[n];
}
=m;
cout<<"您输入的线性表为:
"<for(k=0;k{
cout<<[k]<<"";
}
cout<}
voidshowSeq(SeqListL)//输出线性表数据
{
inta=0;
while(a<
{
cout<<[a]<<"";
a++;
}
cout<}
voidinsert(SeqList&L)//插入数据
{
inta,b,c,k;
cout<<"请输入插入的数及其插入的位置"<cin>>a>>b;
if(b<=0||b>+1)){cout<<"不能在该位置插入"<k=[b-1];[b-1]=a;c=;=+1;
while(c>b)
{
[c]=[c-1];
c--;
}
[b]=k;
}
voiddelate(SeqList&L)//删除数据
{
intwei;
cout<<"请输入想要删除数据的位置"<cin>>wei;
if(wei<1||wei>{cout<<"不能在该位置删除"<while(wei<
{
[wei-1]=[wei];
wei++;
}
=;
}
voidfind(SeqListL)//查找数据
{
inta;
cout<<"请输入您想查找数的位置"<cin>>a;
if(a<=0||a>){cout<<"不能在该位置插入"<cout<<"该位置的数据为:
"<<""<<[a-1]<}
voidmain()
{
SeqListL;
intxuanze;
makeSeq(L);
while
(1)
{
cout<<"请选择功能"<cout<<"插入1"<cout<<"删除2"<cout<<"查找3"<cout<<"显示4"<cout<cin>>xuanze;
switch(xuanze)
{
case1:
insert(L);break;
case2:
delate(L);break;
case3:
find(L);break;
case4:
showSeq(L);break;
default:
break;
}
}
}
单链表源代码:
#include
usingnamespacestd;
typedefintDataType;
typedefstructnode{
DataTypedata;
structnode*link;
}linknode,*linklist;
linklistchushihua()
{
linklistL;
L=(linklist)malloc(sizeof(linknode));
L->link=NULL;
cout<<"开辟空间成功,头结点建立"<returnL;
}
voidshuru(linklist&l)
{
inta,k=0;
cout<<"请输入要存入的结点个数"<cin>>a;
linklistp,q;
p=l;
while(p->link!
=NULL)
{
p=p->link;
k++;
}
for(inti=0;i{
cout<<"请输入数据"<q=(linklist)malloc(sizeof(linknode));
cin>>q->data;
q->link=p->link;
p->link=q;
p=q;
}
}
voidshow(linklistl)
{
cout<<"链表数据为:
"<linklistp;
p=l->link;
while(p!
=NULL)
{
cout<data<<"";
p=p->link;
}
cout<}
voidfind(linklistl)
{
intm,i=0;
cout<<"请输入查找的结点"<cin>>m;
linklistp;
p=l->link;
while(p&&i{
p=p->link;
i++;
}
if(!
p){cout<<"链表没有这么长,查找错误"<cout<<"查找结点的数据位:
"<data<}
voidinsert(linklistl)
{
linklistp,q;intm,n,i=0;
cout<<"请输入您要插入的结点位置及插入的数据"<cin>>m>>n;
p=l;
while(p&&i{
p=p->link;
i++;
}
if(p==NULL)
{
cout<<"不能在该位置插入,插入错误"<}
q=(linklist)malloc(sizeof(linknode));
q->data=n;
q->link=p->link;p->link=q;
}
voiddelate(linklist&l)
{
linklistp;intm,n,i=0;
cout<<"请输入想要删除的结点位置"<cin>>m;
p=l;
while(p&&i{
p=p->link;
i++;
}
if(p==NULL)
{
cout<<"该结点不存在,删除错误"<}
n=p->link->data;
cout<<"被删除的结点元素为:
"<p->link=p->link->link;
}
voidmain()
{
linklistL;intselect;
L=chushihua();
while
(1)
{
cout<<"请选择功能"<cout<<"添加链表数据1"<cout<<"插入链表数据2"<cout<<"删除链表数据3"<cout<<"查找链表数据4"<cout<<"显示链表数据5"<cout<cin>>select;
switch(select)
{
case1:
shuru(L);break;
case2:
insert(L);break;
case3:
delate(L);break;
case4:
find(L);break;
case5:
show(L);break;
default:
break;
}
}
}