数据结构实验一线性表.docx
- 文档编号:10010644
- 上传时间:2023-02-07
- 格式:DOCX
- 页数:31
- 大小:1.25MB
数据结构实验一线性表.docx
《数据结构实验一线性表.docx》由会员分享,可在线阅读,更多相关《数据结构实验一线性表.docx(31页珍藏版)》请在冰豆网上搜索。
数据结构实验一线性表
实验一线性表
学生姓名
吴肖遥
学号
20151681310131
专业班级
电子信息5班
实验地点
理工大楼610
实验日期
2016.3.21
指导教师
李红蕾
实验环境
Visualc++6.0
实验学时
2学时
实验类型
综合
实验成绩
一、实验目的
1、深刻理解线性结构的特点,以及在计算机内的两种存储结构。
2、熟练掌握线性表的顺序存储结构和链式存储结构,及其它们的基本操作,重点掌握查找、插入和删除等操作。
二、实验要求
1、认真阅读程序,将未完成的代码补全(红色部分)。
2、上机调试,并运行程序。
3、保存和截图程序的运行结果,并结合程序进行分析。
三、实验内容和基本原理
1、实验1.1顺序表的操作
利用顺序表存储方式实现下列功能(见参考程序1):
1)通过键盘输入数据建立一个线性表,并输出该线性表。
如,依次输入元素25,21,46,90,12,98。
2)根据屏幕菜单的选择,进行数据的插入、删除和查找,并在插入或删除数据后,再输出线性表。
如,在第2个位置上插入元素43,然后输出顺序表。
删除顺序表第4个元素,输出改变的顺序表。
3)在屏幕菜单中选择0,结束程序的运行。
基本原理:
在顺序表的第i个位置上插入一个元素时,必须先将线性表的第i个元素之后的所有元素依次后移一个位置,以便腾空一个位置,在把新元素插入到该位置。
当要删除第i个元素时,只需将第i个元素之后的所有元素前移一个位置。
程序代码(蓝色为补充的语句):
//************************
//*PROGRAM:
顺序结构的线性表*
//*CONTENT:
建立,插入,删除,查找*
//*编程语言:
Visualc++6.0*
//**********************
#include
#include
#defineMAXSIZE20
typedefintElemType;//数据元素的类型
typedefstruct
{
ElemTypea[MAXSIZE];
intlength;
}SqList;//顺序存储的结构体类型
SqLista,b,c;
//函数声明
voidcreat_list(SqList*L);
voidout_list(SqListL);
voidinsert_sq(SqList*L,inti,ElemTypee);
ElemTypedelete_sq(SqList*L,inti);
intlocat_sq(SqListL,ElemTypee);
//主函数
voidmain()
{
inti,k,loc;
ElemTypee,x;
charch;
do{printf("\n\n\n");
printf("\n吴肖遥20151681310131");
printf("\n1.建立线性表");
printf("\n2.插入元素");
printf("\n3.删除元素");
printf("\n4.查找元素");
printf("\n0.结束程序运行");
printf("\n=====================");
printf("\n请输入要执行的操作:
");
scanf("%d",&k);
switch(k)
{
case1:
{creat_list(&a);
out_list(a);
}
break;
case2:
{printf("\n请输入插入位置:
",a.length+1);
scanf("%d",&i);
printf("请输入要插入的元素值:
");
scanf("%d",&e);
insert_sq(&a,i,e);
out_list(a);
}
break;
case3:
{printf("\n请输入要删除元素的位置:
",a.length);
scanf("%d",&i);
x=delete_sq(&a,i);
out_list(a);
if(x!
=-1)
printf("\n删除的元素为:
%d\n",x);
elseprintf("要删除的元素不存在!
");
}
break;
case4:
{printf("\n请输入要查找的元素值:
");
scanf("%d",&e);
loc=locat_sq(a,e);
if(loc==-1)
printf("\n未找到指定元素!
");
else
printf("\n已找到,元素的位置是:
%d",loc);
}
break;
}/*switch*/
}
while(k!
=0);
printf("\n按回车键,返回...\n");
ch=getchar();
}/*main*/
//建立线性表
voidcreat_list(SqList*L)
{
inti;
printf("请输入线性表的长度:
");
scanf("%d",&L->length);
for(i=0;i
{
printf("数据%d=",i);
scanf("%d",&(L->a[i]));
}
}
//输出线性表
voidout_list(SqListL)
{
inti;
for(i=0;i<=L.length-1;i++)
printf("%10d",L.a[i]);
}
//在线性表的第i个位置插入元素e
voidinsert_sq(SqList*L,inti,ElemTypee)
{
intj;
if(L->length==MAXSIZE)
printf("线性表已满!
\n");
else{
if(i<1||i>L->length+1)
printf("输入位置错!
\n");
else{
for(j=L->length-1;j>=i-1;j--)
L->a[j+1]=L->a[j];
L->a[j+1]=e;
/*将未完成的代码补全,提示:
此处添加一条语句,将被删除的元素值赋给e*/
L->length++;
}
}
}
//删除第i个元素,返回其值
ElemTypedelete_sq(SqList*L,inti)
{
ElemTypex;
intj;
if(L->length==0)
printf("空表!
\n");
elseif(i<1||i>L->length)
{
printf("输入位置错!
\n");
x=-1;
}
else
{
x=L->a[i-1];
for(j=i;j<=L->length-1;j++)
L->a[j-1]=L->a[j];
/*将未完成的代码补全,提示:
此处添加一条语句,将被删除元素之后的元素左移。
*/
L->length--;
}
return(x);
}
//查找值为e的元素,返回它的位置
intlocat_sq(SqListL,ElemTypee)
{
inti=0;
while(L.a[i]!
=e/*将未完成的代码补全,提示:
此处添加一条语句*/)i++;
if(i<=L.length-1)
return(i+1);
}
2、实验1.2链表的操作(见参考程序2)
利用链式存储的方式实现线性表的创建、插入、删除和查找等操作。
1)请输入初始时链表长度,如输入5。
如,依次输入元素abcdf,然后输出链表。
2)删除一个元素,如输入c。
3)插入一个元素,如输入e。
4)按关键字查找元素。
如输入e。
5)按序号查找元素。
如输入3。
基本原理:
在带头结点的单链表中第i(从1开始计数)个位置之后插入元素、创建带头结点的单链表、在带头结点的单链表中删除第i个位置的元素等,最后输出单链表的内容。
程序代码(蓝色为补充部分):
//************************
//*PROGRAM:
链式结构的线性表*
//*CONTENT:
生成,插入,删除,定位,查找*
//*编程语言:
Visualc++6.0*
//**********************
#include
#include
#include
#include
#defineLENsizeof(LNode)//定义LEN为一个//节点的长度
enumBOOL{False,True};//定义BOOL型
typedefstructnode
{chardata;//数据域
structnode*next;//指向下一个节点的指针
}LNode,*LinkList;
voidCreatList(LinkList&,int);//生成一个//单链表
BOOLListInsert(LinkList&,int,char);//在单//链表中插入一个元素
BOOLListDelete(LinkList&,int,char&);//在//单链表中删除一个元素
BOOLListFind_keyword(LinkList,char,int&);//按关键字查找一个元素
BOOLListFind_order(LinkList,char&,int);//按序号查找一个元素
voidListPrint(LinkList);//显示单链表//所有元素
intmain()
{LinkListL;
BOOLtemp;
intnum,loc,flag=1;
charj,ch;
//---------------------程序解说-----------------------
printf("吴肖遥20151681310131\n");
printf("本程序实现链式结构的线性表的操作。
\n");
printf("可以进行插入,删除,定位,查找等操作。
\n");
//----------------------------------------------------
printf("请输入初始时链表长度:
");//输入生成单链表时的元素个数
scanf("%d",&num);
CreatList(L,num);//生成单链表
ListPrint(L);
while(flag)
{printf("请选择:
\n");
printf("1.显示所有元素\n");//显示链//表元素
printf("2.插入一个元素\n");//插入链//表元素
printf("3.删除一个元素\n");//删除链//表元素
printf("4.按关键字查找元素\n");//按//关键字查找
printf("5.按序号查找元素\n");//按序号//查找
printf("6.退出程序\n");//退出
scanf("%c",&j);
switch(j)
{case'1':
ListPrint(L);break;
case'2':
{printf("请输入元素(一个字符)和要插入的位置:
\n");
printf("格式:
字符,位置;例如:
a,3\n");
scanf("%c,%d",&ch,&loc);//输入要插入的元素和要插入的位置
temp=ListInsert(L,loc,ch);//插入
if(temp==False)printf("插入失败!
\n");//插入失败
elseprintf("插入成功!
\n");//成//功插入
ListPrint(L);
break;
}
case'3':
printf("请输入要删除的元素所在位置:
");
scanf("%d",&loc);//输入要删除的节点的位置
temp=ListDelete(L,loc,ch);//删除
if(temp==False)printf("删除失败!
\n");//删除失败
elseprintf("成功删除了一个元素:
%c\n",ch);//删除成功,显示该元素
ListPrint(L);
break;
case'4':
if(L->next==NULL)//链表为空
printf("链表为空!
\n");
else{printf("请输入要查找的元素(一个字符):
");
scanf("%c",&ch);//输入要查找的元素
temp=ListFind_keyword(L,ch,loc);//按关键字//查找
if(temp==False)printf("没有找到该元素!
\n");//查找失败
elseprintf("该元素在链表的第%d个位置。
\n",loc);
//成功查找,显示该元素位置
}
break;
case'5':
if(L->next==NULL)//链表为空
printf("链表为空!
\n");
else{printf("请输入要查找的位置:
");
scanf("%d",&loc);//输入//要查找的元素的位置
temp=ListFind_order(L,ch,loc);//按序号查找
if(temp==False)printf("该位置不存在!
\n");//查找失败
elseprintf("第%d个元素是:
%c\n",loc,ch);
//成功查找,显示该元素
}
break;
default:
flag=0;printf("程序结束,按任意键退出!
\n");
}
}
getch();
}
voidCreatList(LinkList&v,intn)
{//生成一个带头结点的有n个元素的单链表
inti;
LinkListp;
v=(LinkList)malloc(LEN);//生成头结点
v->next=NULL;
printf("请输入%d个字符:
例如:
abcdefg\n",n);
getchar();
for(i=n;i>0;--i)
{p=(LinkList)malloc(LEN);//生成新结点
scanf("%c",&p->data);
p->next=v->next;
//将未完成的代码补全,此处添加一条代码
v->next=p;
}
}
BOOLListInsert(LinkList&v,inti,chare)
{//在单链表的第i各位置插入元素e,成功返回//True,失败返回False
LinkListp,s;
intj=0;
p=v;
while(p&&j
if(!
p||j>i-1)returnFalse;//没有找到
s=(LinkList)malloc(LEN);//生成一个新//结点
s->data=e;
s->next=p->next;
//将未完成的代码补全,此处添加一条代码
//提示:
将新结点插入到单链表中,即修改指针,完成插入操作
p->next=s;
returnTrue;
}
BOOLListDelete(LinkList&v,inti,char&e)
{//在单链表中删除第i个元素,成功删除返回//True,并用e返回该元素值,失败返回False
LinkListp,q;
intj=0;
p=v;
while(p->next&&j {p=p->next;++j;} if(! (p->next)||j>i-1)returnFalse;//查找//失败 q=p->next; p->next=q->next; /*将未完成的代码补全,此处添加一条代码,提示: 删除该元素*/ e=q->data; /*将未完成的代码补全,此处添加一条代码,提示: e取得该元素值,即修改指针,删除结点q*/ free(q);//释放该元素空间 returnTrue; } BOOLListFind_keyword(LinkListv,chare,int&i) {//在单链表中查找关键字为e的元素,成功返回//True,并用i返回该元素位置, //失败返回False i=1; LinkListp; p=v->next; while((p->data! =e)&&(p->next! =NULL))//p指//针指向下一个,直到 {p=p->next;i++;}//找到或到链表尾为止 if(p->data! =e)//该元//素在链表中不存在 returnFalse; elsereturnTrue; } BOOLListFind_order(LinkListv,char&e,inti) {//在单链表中查找第i个元素,成功返回True,//并用e返回该元素值, //失败返回False LinkListp; intj=0; p=v; while(p! =NULL&&j 移动指针,直到找到第i个元素*/) {p=p->next;++j;} if(j! =i)returnFalse;//查找失败 else{e=p->data;//查找成功,用e取得//该元素值 returnTrue; } } voidListPrint(LinkListv) {//显示链表所有元素 LinkListq; q=v->next; printf("链表所有元素: "); while(q! =NULL) {printf("%c",q->data);q=q->next;} printf("\n"); } 四、实验步骤 1、顺序表的操作 1)运行Visualc++6.0,创建一个c++源文件 提示: 选择菜单栏中的“文件”下拉菜单中的“新建”按钮,在弹出的对话框中,选择“文件”子菜单中的“C/C++SourceFile”。 选中“Addtoproject”复选框。 然后给一个文件名,如“sy1”,并保存在“桌面/姓名学号/”。 2)将参考程序复制到文档窗口,选择菜单栏中的“组建”下拉菜单中的“编译”选项,在弹出的对话框中选择“是”。 3)将未完成的代码补充完整,然后选择菜单中的“组建”下拉菜单中的“执行”,或者直接点击工具栏中的“ ”进行连接,调试和运行。 4)运行程序,并检查插入、删除和查找等操作是否有误,正确后截图到word文档中指定位置。 图1 说明: 当程序运行错误时,如图2所示,查看组建窗口,双击出错部分(单击窗口然后滑动查看),逐条更改直到程序运行无误。 图2 参考程序1 //************************ //*PROGRAM: 顺序结构的线性表* //*CONTENT: 建立,插入,删除,查找* //*编程语言: Visualc++6.0* //********************** #include #include #defineMAXSIZE20 typedefintElemType;//数据元素的类型 typedefstruct { ElemTypea[MAXSIZE]; intlength; }SqList;//顺序存储的结构体类型 SqLista,b,c; //函数声明 voidcreat_list(SqList*L); voidout_list(SqListL); voidinsert_sq(SqList*L,inti,ElemTypee); ElemTypedelete_sq(SqList*L,inti); intlocat_sq(SqListL,ElemTypee); //主函数 voidmain() { inti,k,loc; ElemTypee,x; charch; do{printf("\n\n\n"); printf("\n1.建立线性表"); printf("\n2.插入元素"); printf("\n3.删除元素"); printf("\n4.查找元素"); printf("\n0.结束程序运行"); printf("\n====================="); printf("\n请输入要执行的操作: "); scanf("%d",&k); switch(k) { case1: {creat_list(&a); out_list(a); } break; case2: {printf("\n请输入插入位置: ",a.length+1); scanf("%d",&i); printf("请输入要插入的元素值: "); scanf("%d",&e); insert_sq(&a,i,e); out_list(a); } break; case3: {printf("\n请输入要删除元素的位置: ",a.length); scanf("%d",&i); x=delete_sq(&a,i); out_list(a); if(x! =-1) printf("\n删除的元素为: %d\n",x); elseprintf("要删除的元素不存在! "); } break; case4: {printf("\n请输入要查找的元素值: "); scanf("%d",&e); loc=locat_sq(a,e); if(loc==-1) printf("\n未找到指定元素! "); else printf("\n已找到,元素的位置是: %d",loc); } break; }/*switch*/ } while(k! =0); printf("\n按回车
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 线性