数据结构实验一线性表.docx

上传人:b****7 文档编号:10010644 上传时间:2023-02-07 格式:DOCX 页数:31 大小:1.25MB
下载 相关 举报
数据结构实验一线性表.docx_第1页
第1页 / 共31页
数据结构实验一线性表.docx_第2页
第2页 / 共31页
数据结构实验一线性表.docx_第3页
第3页 / 共31页
数据结构实验一线性表.docx_第4页
第4页 / 共31页
数据结构实验一线性表.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

数据结构实验一线性表.docx

《数据结构实验一线性表.docx》由会员分享,可在线阅读,更多相关《数据结构实验一线性表.docx(31页珍藏版)》请在冰豆网上搜索。

数据结构实验一线性表.docx

数据结构实验一线性表

实验一线性表

学生姓名

吴肖遥

学号

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;ilength;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&&jnext;++j;}//查找第//i-1个元素的位置

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模板 > 商务科技

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1