线性表的操作上机实验.docx
《线性表的操作上机实验.docx》由会员分享,可在线阅读,更多相关《线性表的操作上机实验.docx(12页珍藏版)》请在冰豆网上搜索。
![线性表的操作上机实验.docx](https://file1.bdocx.com/fileroot1/2023-8/3/4c3eb1db-e8a1-4ec7-8f64-4f89a46b81cd/4c3eb1db-e8a1-4ec7-8f64-4f89a46b81cd1.gif)
线性表的操作上机实验
实验一线性表的基本操作
一、上机目的:
1、掌握使用TurboC2.0,或VC上机调试线性表的基本方法;
2、掌握顺序表的存储结构形式及其描述和基本运算的实现。
3、熟练掌握动态链表结构及有关算法的设计。
4、掌握线性表的基本操作:
插入、删除、查找以及线性表合并等运算在顺序存储结构和链接存储结构上的算法思想和实现。
二、上机要求:
1、认真阅读和掌握本上机的程序。
2、上机运行本程序。
3、保存和打印出程序的运行结果,并结合程序进行分析。
4、写出头插法、尾插法建单链表的程序,上机运行。
三、上机内容:
线性表(包括顺序结构、链式结构)基本操作:
创建、插入、删除、查找等操作的实现;两个有序(包括顺序结构、链式结构)合并成一个有序表。
四、实验代码(详细设计):
#include
usingnamespacestd;
#definetrue1
#definefalse0
#defineok1
#defineerror0
#defineoverflow-2
typedefintStatus;
typedefintElemType;
typedefstructLNode//存储结构
{ElemTypedata;
structLNode*next;
}LNode,*LinkList;
voidCreateList(LinkList&L,intn)//尾插法创建单链表
{LinkListp;
L=newLNode;
L->next=NULL;//建立一个带头结点的单链表
LinkListq=L;//使q指向表尾
for(inti=1;i<=n;i++)
{p=newLNode;
cin>>p->data;
p->next=NULL;
q->next=p;
q=p;}
}
StatusGetElem(LinkListL,inti,ElemType&e)//取第i个元素
{LinkListp=L->next;
intj=1;
while(p&&j
{p=p->next;
++j;}
if(!
p||j>i)returnerror;//第i个元素不存在
e=p->data;
returnok;
}
StatusLinkInsert(LinkList&L,inti,ElemTypee)//插入
{LinkListp=L;
intj=0;
while(p&&j{p=p->next;
++j;}//寻找第i-1个结点
if(!
p||j>i-1)
returnerror;//i小于1或者大于表长加1
LinkLists=newLNode;//生成新结点
s->data=e;
s->next=p->next;//插入L中
p->next=s;
returnok;
}
StatusListDelete(LinkList&L,inti,ElemType&e)//删除
{LinkListp=L;
LinkListq;
intj=0;
while(p->next&&j{//寻找第i个结点,并令p指向其前驱
p=p->next;
++j;}
if(!
(p->next)||j>i-1)returnerror;//删除位置不合理
q=p->next;
p->next=q->next;//删除并释放结点
e=q->data;
delete(q);
returnok;
}
voidMergeList(LinkList&La,LinkList&Lb,LinkList&Lc)
{//合并两个顺序链表
LinkListpa,pc,pb;
pa=La->next;
pb=Lb->next;
Lc=pc=La;
while(pa&&pb)
{if(pa->data<=pb->data)
{pc->next=pa;
pc=pa;
pa=pa->next;}
else
{pc->next=pb;
pc=pb;
pb=pb->next;}
}
pc->next=pa?
pa:
pb;
delete(Lb);
}
voidshow(LinkListL)//显示
{LinkListp;
p=L->next;
while(p)
{cout<data<<"-->";
p=p->next;}
cout<}
intLength(LinkListL,inti)//表长
{i=0;
LinkListp=L->next;
while(p)
{++i;
p=p->next;}
returni;
}
voidxiugai(LinkListL)//修改
{inti,j=1;
ElemTypek;
ElemTypee,m;
LinkListp=L->next;
cout<<"请输入要修改的元素位置(0
";
cin>>i;
GetElem(L,i,e);
cout<<"该位置的元素:
"<cout<<"修改后的元素值:
";
cin>>k;
while(p&&j
{p=p->next;
++j;}
m=p->data;
p->data=k;
cout<<"修改后的单链表显示如下:
"<show(L);
}
voidhebing()//合并两个单链表
{inta,b;
LinkListLa,Lb,Lc;
cout<<"请输入第一个有序链表的长度:
"<cin>>a;
cout<<"请输入第一个有序链表的元素共("<"<CreateList(La,a);
show(La);
cout<<"请输入第二个有序链表的长度:
"<cin>>b;
cout<<"请输入第二个有序链表的元素共("<
"<CreateList(Lb,b);
show(Lb);
MergeList(La,Lb,Lc);
cout<<"合并后的有序链表如下:
"<show(Lc);
}
voidmain()//主函数
{intselect;
intx;
ElemTypey;
LinkListlist;
for(;;)
{cout<<"单链表的基本操作"<cout<<"1.单链表的创建"<cout<<"2.单链表的显示"<cout<<"3.单链表的长度"<cout<<"4.取第i个位置的元素"<cout<<"5.修改第i个位置的元素"<cout<<"6.插入元素到单链表里"<cout<<"7.删除单链表里的元素"<cout<<"8.合并两个单链表"<cout<<"9.退出系统"<cout<<"请选择:
";
cin>>select;
switch(select)
{case1:
cout<<"请输入单链表的长度:
"<cin>>x;
cout<<"请输入"<CreateList(list,x);
break;
case2:
cout<<"单链表显示如下:
"<show(list);
break;
case3:
ints;
cout<<"单链表的长度为:
"<break;
case4:
cout<<"请选择所要取出元素的位置:
";
cin>>x;
while(x<0||x>Length(list,s))
{cout<<"输入有误,请重新输入"<cout<<"请选择所要取出元素的位置:
";
cin>>x;}
GetElem(list,x,y);
cout<<"该位置的元素为:
"<break;
case5:
xiugai(list);break;
case6:
cout<<"请选择要插入的位置:
";cin>>x;
while(x<0||x>Length(list,s))
{cout<<"输入有误,请重新输入"<cout<<"请选择所要插入元素的位置:
";
cin>>x;}
cout<<"要插入的元素值:
";
cin>>y;
LinkInsert(list,x,y);
cout<<"插入后单链表显示如下:
"<show(list);
break;
case7:
cout<<"请选择要删除的位置:
";cin>>x;
while(x<0||x>Length(list,s))
{cout<<"输入有误,请重新输入"<cout<<"请选择所要删除元素的位置:
";
cin>>x;}
ListDelete(list,x,y);
cout<<"要删除的元素值:
"<cout<<"删除后的单链表显示如下:
"<show(list);
break;
case8:
hebing();
break;
case9:
exit(0);
break;
default:
cout<<"输入有误,请重新输入"<break;}}}
五.运行结果如下: