数据结构实验报告01.docx
《数据结构实验报告01.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告01.docx(18页珍藏版)》请在冰豆网上搜索。
数据结构实验报告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;indexq=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&&indexp=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;
}