数据结构线性表试验报告.docx

上传人:b****5 文档编号:6353148 上传时间:2023-01-05 格式:DOCX 页数:14 大小:439.37KB
下载 相关 举报
数据结构线性表试验报告.docx_第1页
第1页 / 共14页
数据结构线性表试验报告.docx_第2页
第2页 / 共14页
数据结构线性表试验报告.docx_第3页
第3页 / 共14页
数据结构线性表试验报告.docx_第4页
第4页 / 共14页
数据结构线性表试验报告.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

数据结构线性表试验报告.docx

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

数据结构线性表试验报告.docx

数据结构线性表试验报告

 

线性表上机实习

1、实验目的

(1)熟悉将算法转换为程序代码的过程。

(2)了解顺序表的逻辑结构特性,熟练掌握顺序表存储结构的C语言描述方法。

(3)熟练掌握顺序表的基本运算:

查找、插入、删除等,掌握顺序表的随机存取特性。

(4)了解线性表的链式存储结构,熟练掌握线性表的链式存储结构的C语言描述方法。

(5)熟练掌握线性链表(单链表)的基本运算:

查找、插入、删除等,能在实际应用中灵活选择适当的链表结构。

2、实验要求

(1)熟悉顺序表的插入、删除和查找。

(2)熟悉单链表的插入、删除和查找。

3、实验内容:

1 顺序表

(1)抽象数据类型定义

typedefstruct{

TypeDatadata[maxsize];//容量为maxsize的静态顺手表

intn;//顺序表中的实际元素个数

}SeqList;//静态顺序表的定义

在本次实验中,首先建立一个空的静态顺序表,然后键盘输入数据存入表中,然后进入菜单选择界面,通过不同的数字输入,实现对顺序表,删除,插入,查找,显示等操作。

(2)存储结构定义及算法思想

在顺序表结构体的定义中,typedefintTypeData为整型,存储结构如下:

for(n=0;n

cout<<"请输入线性表数据"<

cin>>[n];//顺序将数据存入顺序表

}//其他存储与此类似,都是直接赋值与数组的某一位

插入版块子函数:

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;

}

顺序表的插入与删除操作类似,在插入与删除后,都要循环调整后面数组的每一位元素,同时记录数据元素的长度的标示符也要跟着改变。

显示操作是通过循环实现表中第一个元素到最后一个元素的输出,查找操作是直接取数组中的查找位输出。

(3)

实验结果与分析

 

 

2 单链表

(1)抽象数据类型定义

typedefstructnode{

DataTypedata;//链表的数据类型

structnode*link;//链表的结点指针

}linknode,*linklist;//定义了结构体linklode和结构体指针linklist

在本次实验中,首先程序自己建立一个空的头结点,通过菜单的功能选择“添加链表数据”可自由添加链表的节点数及元素值。

在菜单选择中,有“添加链数据”,“插入链表数据”,“删除链表数据”,“查找链表数据”和“显示链表数据”功能,选择不能的功能选择就能实现不同的操作。

其中“添加链表数据”可反复批量输入链表数据。

(2)存储结构定义及算法思想

在单链表中,typedefintDataType;DataTypedata;定义链表存储数据位整型。

存储结构如下:

while(p->link!

=NULL){

p=p->link;k++;//首先找到单链表的最后结点(如果是只有头结点

}的单链表则直接跳过),以便后面接着输入数据

for(inti=0;i

{

cout<<"请输入数据"<

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&&i

p=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;

}

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 入党转正申请

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

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