数据结构实验报告01.docx

上传人:b****8 文档编号:9317959 上传时间:2023-02-04 格式:DOCX 页数:18 大小:204.91KB
下载 相关 举报
数据结构实验报告01.docx_第1页
第1页 / 共18页
数据结构实验报告01.docx_第2页
第2页 / 共18页
数据结构实验报告01.docx_第3页
第3页 / 共18页
数据结构实验报告01.docx_第4页
第4页 / 共18页
数据结构实验报告01.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

数据结构实验报告01.docx

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

数据结构实验报告01.docx

数据结构实验报告01

数据结构《实验1》实验报告

实验项目1:

线性表(双向链表)存储及运算

学  号

姓  名

课程号

实验地点

指导教师

时间

2013-10-03

评语:

成绩

教师签字

线性表链式存储(双向链表)插入、删除运算

1、预习要求:

线性表的插入、删除相关概念及运算,完成线性表元素的插入、删除。

2、实验目的:

(1)了解线性表的插入、删除相关概念;

(2)理解线性表的插入、删除过程和结构定义;

(3)掌握算法转换为程序的过程中的变化。

3、实验内容及要求:

(1)以“一个较完整的程序范例-顺序表”程序框架为框架

(2)双链表结构体为:

typedefstruct

{

intnum;/学号

charname[10];/姓名

}student;

分别建立包含3~5个数据元素的链式存储线性表;

(3)实现功能

a)构造空表,直接从键盘输入数据元素

b)插入、删除、一般查找(给定某一学号x,找到并显示该学生信息)、显示等函数功能

c)设计特殊查找函数findbeforeAndAfter(...),给定某一学号x,能同时找到该学生第i个前驱的学生信息,以及该学生第j个后继的学生信息,参数x,i,j从键盘输入

(4)给出程序运行截图。

4、实验设备(环境)及要求

硬件:

支持IntelPentiumⅡ及其以上CPU,内存128MB以上、硬盘1GB以上容量的微机。

软件:

配有Windows98/2000/XP操作系统,安装VisualC++。

5、实验时间:

6学时

6、该文档的文件名不要修改,存入<学号><姓名>命名的文件夹中

7、该表中的数据只需填空,已有内容不要修改

实验结果(运行结果界面及源程序,运行结果界面放在前面):

欢迎界面

Cover界面

输入5组数据后,自动显示当前链表内容

选择功能1,显示当前链表

选择功能2,插入数据信息以及要插入第几个人后

选择功能3,删除一个学生的信息,在这里选择删除第6个人的信息,删除后显示列表。

选择功能4,输入学号查找相应学生的信息

选择功能5,输入学号及k、i的值,查找此学号前第k个人和此学号后第i个人的信息。

最后,选择功能0,退出程序

 

程序代码如下

#include

#include

#include

#include

#defineTRUE1

#defineFALSE0

#defineOK1

#defineERROR0

typedefboolStatus;

typedefintHeadEType;

typedefstructStudent

{

intnum;//学号

charname[15];//姓名

}Student;

typedefstructDoubleNode

{

Studentdata;

DoubleNode*plink;

DoubleNode*nlink;

}DoubleNode;//链表结点

typedefstruct

{

HeadETypeHdata;

DoubleNode*first;

}DoubleChainList;//链表的头

typedefstruct

{

DoubleNode*plink;

DoubleNode*nlink;

}ResultNode;//返回直接前驱和直接后驱的数据元素的地址结果

typedefDoubleChainListChainList;

typedefDoubleNodeChainNode;

ChainList*L;

ChainList*Creat(ChainList*L)

{//构造一个空链表

L=newChainList;//产生一个仅有表头结点的链表

L->first=NULL;//first的值设为空(NULL)值

L->Hdata=0;

returnL;

}

StatusDelete(DoubleChainList*L,intk)

{//在双向链表L中删除第k个数据元素,如果不存在第k个元素返回出错状态码

if(k<1||!

L->first)returnERROR;

DoubleNode*current=L->first;

DoubleNode*p;

if(k==1)//删除的是链表中第一个结点

{

p=current->nlink;

p->plink=NULL;

L->first=p;

}

else

{

DoubleNode*q=L->first;

for(intindex=1;index

q=q->nlink;

if(!

q)

returnERROR;

current=q;//current指向第k个结点

q=current->plink;

p=current->nlink;

q->nlink=p;

if(p)

p->plink=q;

}

deletecurrent;//释放被删除结点current的空间

returnOK;

}

StatusInsert(DoubleChainList*L,intk,Student*student)

{

if(k<0)

returnERROR;

intindex=1,i=0;

DoubleNode*current=L->first;

while(index

{//找第k个结点

index++;

current=current->nlink;

}

if(k>0&&!

current)returnERROR;

DoubleNode*q=newDoubleNode;

while(i<10)

{q->data.name[i]=student->name[i];

i++;}

q->data.num=student->num;

if(k)

{//插入在current之后,两个方向的链域的修改

q->nlink=current->nlink;

q->plink=current;

DoubleNode*p=current->nlink;

current->nlink=q;

if(p)

p->plink=q;

}

else

{//作为第一个元素结点插入

q->nlink=L->first;

q->plink=NULL;

DoubleNode*p=L->first;

if(p)

p->plink=q;

L->first=q;

}

returnOK;

}

voidWelcome()//启动画面

{

charline[]={"━━━━━━━━━━"};

charbar[]={"...."};

inti,j,k=0,x=0,y=0;

for(i=1;i<=strlen(line)/2;)

{

system("cls");

for(j=0;j<9;j++)//改变行坐标

cout<

for(j=0;j<(75-strlen(line))/2;j++)//改变列坐标

cout<<"";

for(j=1;j<=i;j++)//进度显示器

cout<<"■";

for(x=strlen(line)/2;x>i;x--)

cout<<"□";

if(k==4)

i++;

cout<

for(j=0;j<(75-strlen(line))/2;j++)//行坐标定位

cout<<"";

cout<

cout<

for(j=0;j<(65-strlen(bar))/2;j++)

cout<<"";

cout<<(i-1)*10<<"%Loading";

cout.write(bar,k);

cout<

for(j=0;j<7;j++)

cout<

for(j=0;j<24;j++)

cout<<"";

cout<<"肖家乐·制作\n"<

cout<<"中南财经政法大学信息与安全工程学院"<

for(j=0;j<19;j++)

cout<<"";

for(j=0;j<=17;j++)

cout<<"─";

cout<

for(j=0;j<1000000;j++);//延时效果

k++;

if(k>4)

k=0;

}

}

voidCover()//封面信息

{

printf("\n\n\n\n\n\n\n");

printf("*************************************************\n");

printf("线性表的链式存储\n\n");

printf("制作:

肖家乐\n");

printf("班级:

电商1202班\n");

printf("学号:

1209040120\n");

printf("指导老师:

孙夫雄\n");

printf("**************************************************\n");

printf("\n\n\n\t");

}

voidOutput(DoubleChainList*L)

{//逐个地输出链表L中的数据元素

DoubleNode*current=L->first;

while(current)

{

cout<data.num<<"";

cout<data.name<<""<

current=current->nlink;

}

cout<

}

boolSearch(DoubleChainList*L,intx)

{

DoubleNode*current=L->first;

while(current&¤t->data.num!

=x)

current=current->nlink;

if(!

current)return0;

cout<<""<data.num<<"";

cout<<""<data.name<<""<

return1;

}

boolfindbeforeAndAfter(DoubleChainList*L,intx,inti,intj)

{

DoubleNode*pp,*np;

if(x<1)return0;

DoubleNode*current=L->first,*p;

while(current&¤t->data.num!

=x)

current=current->nlink;

if(!

current)return0;

p=current;

intindex=0;

for(;p&&index

p=p->nlink;

if(!

p)return0;

np=p;

p=current;

for(index=0;p&&index

p=p->plink;

if(!

p)return0;

pp=p;

cout<<"前面学生信息是:

"<data.name<data.num<

cout<<"后面学生信息是:

"<data.name<data.num<

return1;

}

intmain()

{

inti,n,flag=1,k=0,h=0,j=0;

Student*student;

system("cls");

Welcome();

system("cls");

Cover();

system("pause");

system("cls");

L=Creat(L);//创建空链表

for(i=0;i<=4;i++)

{

student=newStudent;

cout<<"请输入学生的name及num:

";

cin>>student->name>>student->num;

Insert(L,i,student);

L->Hdata++;

}//给链表赋值即初始化

cout<<"该链表现在为:

"<

Output(L);//显示现在的链表

while(flag)

{

cout<<"请选择要执行的功能:

"<

cout<<"1.显示链表;"<

cout<<"2.插入一个学生信息;"<

cout<<"3.删除一个学生信息;"<

cout<<"4.查找学生信息(给定学号):

"<

cout<<"5.查找给定学生的前面第i位和后面第j个学生信息:

"<

cout<<"0.退出"<

cout<

cin>>n;

while(n<0&&n>4)

{cout<<"输入有误,请重新输入:

"<

cin>>n;}

switch(n)//实现功能

{

case1:

cout<<"该链表现在为:

"<

Output(L);

break;

case2:

cout<<"请输入学生的name及num以及插入第几个学生后k:

";

student=newStudent;

cin>>student->name>>student->num>>k;

h=Insert(L,k,student);

if(h)cout<<"插入成功!

"<

elsecout<<"插入失败!

"<

break;

case3:

cout<<"请输入要删除第几位的学生:

";

cin>>k;

h=Delete(L,k);

if(h)cout<<"去除成功!

"<

elsecout<<"去除失败!

"<

break;

case4:

cout<<"请输入查找学生的信息(学号):

"<

cin>>k;

h=Search(L,k);

if(!

h)cout<<"查找失败!

"<

break;

case5:

cout<<"请输入要查找特定学生(学号)k以及前面学生i后面学生j:

"<

cin>>k>>i>>j;

h=findbeforeAndAfter(L,k,i,j);

if(!

h)cout<<"查找失败!

"<

break;

case0:

;

default:

;

}

if(n)

{cout<<"是否继续?

1.继续0.停止:

"<

cin>>flag;

}

elseflag=0;

cout<

<

}

return0;

}

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

当前位置:首页 > 工程科技 > 兵器核科学

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

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