数据结构实验报告.docx
《数据结构实验报告.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告.docx(77页珍藏版)》请在冰豆网上搜索。
数据结构实验报告
《数据结构》实验教学大纲
学时课程总:
64 学分:
4
实验学时:
24 实验个数:
7实验学分:
1.5
课程性质:
必做适用专业:
计算机科学与技术、软件工程、网络工程
教材及参考书:
数据结构(C语言版),严蔚敏吴伟民,清华大学出版社,2011年11月;
数据结构题集(C语言版)实习题部分,清华大学出版社;
数据结构实验教程,王玲刘芳贺春林等,四川大学出版社,2010年10月,
大纲执笔人:
刘芳 大纲审定人:
一、实验课的性质与任务
计算机编程中加工处理的对象是数据,而数据具有一定的组织结构,所以学习编写计算机程序仅仅了解计算机语言是不够的,还必须掌握数据组织、存储和运算的一般方法,这是数据结构课程中学习和研究的内容。
由于数据结构的原理和算法较抽象,而该课程一般在本科低年级开设,对于计算机程序设计知识的初学者,理解和掌握其中的原理就显得较为困难。
《数据结构》实验课程着眼于原理和应用的结合点,使读者学会如何将书上学到的知识用于解决实际问题,培养软件工作需要的动手能力;另一方面,能使书上的知识变“活”,起到深化理解和灵活掌握教学内容的目的。
平时练习较偏重于如何编写功能单一的“小”算法,而实习题是软件设计的综合训练,包括问题分析、总体结构设计、用户界面设计、程序设计基本技能和技巧,多人合作,以至一整套软件工作规范的训练和科学作风的培养。
此外,还有很重要的一点是:
机器是比任何老师更严厉的检查者。
训练的重点在于基本的数据结构,而不是强调面面俱到。
各实习单元与教科书的各章只具有粗略的对应关系,一个实习题常常涉及到几部分教学内容。
二、实验课程目的与要求
1.实验目的
根据《数据结构》课程的任务与要求,帮助学生拓宽知识面。
并达到以下教学要求:
1)学会分析研究计算机加工的数据结构的特性,以便为应用涉及的数据选择适当的逻辑结构、存储结构及其相应的算法,并初步掌握算法的时间分析和空间分析的技术;掌握各种基本数据结构的逻辑结构和存储结构及相应算法。
2)本课程的学习过程也是复杂程序设计的训练过程,要求学生编写的程序结构清楚、正确易读,符合软件过程的规范,从而培养学生的数据抽象能力;
3)通过若干数据结构应用实例,引导学生学习数据类型的使用,为今后学习面向对象的程序做一些铺垫。
2.实验要求
1)熟悉各种基本数据结构的定义,性质和特点,初步掌握算法分析的基本技巧以及如何根据实际问题设计一个有效的算法。
2)会书写类C语言的算法,并将算法转变为程序实现。
3)正确理解各种数据结构的逻辑特性和存储表示和基本操作的算法实现,有较强的逻辑分析能力。
4)针对问题的不同选择合适的数据结构,提高算法设计的能力和动手实验的技能。
三、实验项目及内容提要
数据结构实验课程(课程编号)
序号
实验项目编号
实验名称
学时
必做
选做
学分数
实验类型
内容提要
基本操作
验证
综合
设计
1
抽象数据类型的表示与实现
2
√
√
√
抽象数据类型的表示与实现
2
线性表实验
4
√
√
√
线性表的存储实现及有关应用
3
栈和队列实验
4
√
√
√
栈和队列的基本操作及其实现,以及典型应用举例
4
稀疏矩阵实验
2
√
√
稀疏矩阵的压缩存储
5
树和二叉树实验
4
√
√
树的两种种存储结构,及各种操作的算法实现(建立、遍历、线索化、最优二叉树)
6
图及其应用实验
4
√
√
图的两种基本存储结构,及各种操作的算法实现(建立、遍历、图的典型应用)
7
查找和排序实验
4
√
√
√
各种基本的查找和排序算法及其实现分析
四、实验内容安排:
实验一抽象数据类型的表示与实现
(验证性实验2学时)
1.目的要求:
1)熟悉类C语言的描述方法,学会将类C语言描述的算法转换为C源程序实现;
2)理解抽象数据类型的定义,编写完整的程序实现一个抽象数据类型(如三元组)。
3)认真阅读和掌握本实验的参考程序,上机运行程序,保存和打印出程序的运行结果,并结合程序进行分析。
2.实验内容:
1)编程实现抽象数据类型三元组的定义、存储、基本操作(最大值、最小值、平均值等的求解),并设计一个主菜单完成各个功能的调用。
Main.cpp
#include"opretation.h"
#include"stdio.h"
voidmain()
{
TripletT;
init(T);
}
operation.h
#ifndefxxxx
#definexxxx
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
#defineOVERFLOW-2
typedefintStatus;
typedefintElemType;
typedefElemType*Triplet;
StatusInitTriplet(Triplet&T);//构造并赋值
StatusDestroyTriplet(Triplet&T);//销毁
StatusGet(TripletT,inti,ElemType&e);//返回第i的值
StatusPut(Triplet&T,inti,ElemTypee);//改变第i的值
StatusIsAscending(TripletT);//若为升序,则返回1,否返回0
StatusIsDescending(TripletT);//若为降序,则返回1,否返回0
StatusMax(TripletT,ElemType&e);//返回最大值
StatusMin(TripletT,ElemType&e);//返回最小值
Statusinit(TripletT);
#endif
Operatation.h
#include"hanshu.h"
#include"stdlib.h"
#include"stdio.h"
Statusinit(TripletT)
{
inti,e;
charchoice;
printf("1.InitTriplet构造并赋值\n");
printf("2.DestroyTriplet销毁\n");
printf("3.Get返回第i的值\n");
printf("4.Put改变第i的值\n");
printf("5.IsAscending若为升序,则返回1,否返回0\n");
printf("6.IsDescending若为降序,则返回1,否返回0\n");
printf("7.Max返回最大值\n");
printf("8.Min返回最小值\n");
printf("请输入你所选择的功能的序号:
");
fflush(stdin);
scanf("%c",&choice);
switch(choice)
{
case'1':
InitTriplet(T);//构造并赋值
break;
case'2':
DestroyTriplet(T);//销毁
break;
case'3':
printf("请输入您想显示的数的位数:
");
scanf("%d",&i);
Get(T,i,e);//返回第i的值
break;
case'4':
printf("请输入您想改变的数的位数:
");
scanf("%d",&i);
printf("请输入您想改成的整数:
");
scanf("%d",&e);
Put(T,i,e);//改变第i的值
break;
case'5':
IsAscending(T);//若为升序,则返回1,否返回0
break;
case'6':
IsDescending(T);//若为降序,则返回1,否返回0
break;
case'7':
Max(T,e);//返回最大值
break;
case'8':
Min(T,e);//返回最小值
break;
default:
printf("请重新选择:
");//选择序号输入错误时,提示重新选择
}
return0;
}
StatusInitTriplet(Triplet&T)//构造并赋值
{
intv1,v2,v3;
printf("请输入三个整数:
");
scanf("%d%d%d",&v1,&v2,&v3);
T=((ElemType*)malloc(3*sizeof(ElemType)));//分配3个元素的储存空间
if(!
T)exit(OVERFLOW);//分配空间失败
T[0]=v1;
T[1]=v2;
T[2]=v3;
getchar();
getchar();
system("CLS");//清屏
init(T);
returnOK;
}
StatusDestroyTriplet(Triplet&T)//销毁
{
free(T);
T=NULL;
getchar();
system("CLS");//清屏
init(T);
returnOK;
}
StatusGet(TripletT,inti,ElemType&e)//返回第i的值
{
if(i<1||i>3)
returnERROR;
e=T[i-1];
printf("当前位的数值为:
%d",e);
getchar();
getchar();
system("CLS");//清屏
init(T);
returnOK;
}
StatusPut(Triplet&T,inti,ElemTypee)//改变第i的值
{
if(i<1||i>3)
returnERROR;
printf("当位目前的数值为:
");
printf("%d\n",T[i-1]);
T[i-1]=e;
printf("修改后的结果为:
");
printf("%d",T[i-1]);
getchar();
getchar();
system("CLS");//清屏
init(T);
returnOK;
}
StatusIsAscending(TripletT)//若为升序,则返回1,否返回0
{
intx;
printf("若为升序,则显示1,否则显示0\n");
x=(T[0]<=T[1])&&(T[1]<=T[2]);
printf("%d",x);
getchar();
getchar();
system("CLS");//清屏
init(T);
returnOK;
}
StatusIsDescending(TripletT)//若为降序,则返回1,否返回0
{
intx;
printf("若为降序,则显示1,否则显示0\n");
x=(T[0]>=T[1])&&(T[1]>=T[2]);
printf("%d",x);
getchar();
getchar();
system("CLS");//清屏
init(T);
returnOK;
}
StatusMax(TripletT,ElemType&e)//返回最大值
{
e=(T[0]>=T[1]?
((T[0]>=T[2]?
T[0]:
T[2])):
(T[1]>=T[2]?
T[1]:
T[2]));
printf("最大值为:
");
printf("%d",e);
getchar();
getchar();
system("CLS");//清屏
init(T);
returnOK;
}
StatusMin(TripletT,ElemType&e)//返回最小值
{
e=(T[0]<=T[1]?
((T[0]<=T[2]?
T[0]:
T[2])):
(T[1]<=T[2]?
T[1]:
T[2]));
printf("最小值为:
");
printf("%d",e);
getchar();
getchar();
system("CLS");//清屏
init(T);
returnOK;
}
3.主要仪器设备及药品
2)PC机
3)TurboC2.0或VisualC++
实验二线性表实验
(验证性实验4学时)
1.目的要求:
1)熟悉线性表的基本运算在两种存储结构(顺序结构和链式结构)上的实现;
2)以线性表的各种操作(建立、插入、删除等)的实现为重点;
3)通过本次实习帮助学生加深对高级语言C语言的使用(特别是函数参数、指针类型、链表的使用)。
4)认真阅读和掌握本实验的参考程序,上机运行本程序,保存和打印出程序的运行结果,并结合程序进行分析。
按照你对线性表的操作需要,重新改写主程序并运行,打印出文件清单和运行结果。
3.实验内容:
1)编程实现线性表两种存储结构中的基本操作的实现(线性表的创建、插入、删除和查找),并设计一个主菜单完成各个功能的调用。
顺序存储:
main.cpp
#include
#include"opretation.h"
#include"stdlib.h"
voidmain()
{
SqlistL;
inti,e;
intx;
printf("1.Initlist创建\n");
printf("2.ListInsert插入\n");
printf("3.ListDelete删除\n");
printf("4.Serch查找\n");
printf("5.exit结束\n");
while
(1)
{
printf("\n");
printf("请输入你所选择的功能的序号:
");
scanf("%d",&x);
switch(x)
{
case1:
Initlist(L);////创建
break;
case2:
printf("请输入您想插入的数字e=");
scanf("%d",&e);
ListInsert(L,e);//插入
break;
case3:
ListDelete(L,e);//删除
break;
case4:
Serch(L,e);//查找
break;
case5:
exit(OVERFLOW);//结束
default:
printf("请重新选择:
");//选择序号输入错误时,提示重新选择
}
}
}
operation.h
#ifndefxxxx
#definexxxx
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
#defineOVERFLOW-2
#definelistinitsize100
#definelistincrement10
typedefintStatus;
typedefintElemType;
typedefstruct
{
ElemType*elem;
intlength;
intlistsize;
}Sqlist;
StatusInitlist(Sqlist&L);//创建
StatusListInsert(Sqlist&L,ElemTypee);//插入
StatusListDelete(Sqlist&L,ElemType&e);//删除
StatusSerch(SqlistL,ElemType&e);//查找
#endif
Opretation.h
#include"init.h"
#include"stdlib.h"
StatusInitlist(Sqlist&L)//创建
{
inti;
L.elem=(ElemType*)malloc(listinitsize*sizeof(ElemType));
if(!
L.elem)
exit(OVERFLOW);
L.length=0;
L.listsize=listinitsize;
L.elem[0]=1;
L.elem[1]=2;
L.elem[2]=3;
L.elem[3]=4;
L.elem[4]=5;
printf("已存数据为:
");
for(i=0;i<=4;i++)
printf("%d",L.elem[i]);
L.length=5;
returnOK;
}
StatusListInsert(Sqlist&L,ElemTypee)//插入
{
ElemType*newbase;
ElemType*p,*q;
inti,j;
printf("请输入您想插入的位置i=");
scanf("%d",&i);
if(i<1||i>L.length+1)
returnERROR;
if(L.length>=L.listsize)
{
newbase=(ElemType*)realloc(L.elem,(L.listsize+listincrement)*sizeof(ElemType));
if(!
newbase)
exit(OVERFLOW);
L.elem=newbase;
L.listsize+=listincrement;
}
q=&(L.elem[i-1]);
for(p=&(L.elem[L.length-1]);p>=q;--p)
*(p+1)=*p;
*q=e;
++L.length;
//printf("%d\n",L.length);
for(j=0;jprintf("%d",L.elem[j]);
returnOK;
}
StatusListDelete(Sqlist&L,ElemType&e)//删除
{
ElemType*p,*q;
inti,j;
printf("请输入您想删除的位置i=");
scanf("%d",&i);
if((i<1)||(i>L.length))
returnERROR;
p=&(L.elem[i-1]);
e=*p;
printf("删除的数为%d\n",e);
q=L.elem+L.length-1;
for(++p;p<=q;++p)
*(p-1)=*p;
--L.length;
//printf("%d\n",L.length);
for(j=0;jprintf("%d",L.elem[j]);
returnOK;
}
StatusSerch(SqlistL,ElemType&e)//查找
{
inti;
printf("请输入您想查找的位置i=");
scanf("%d",&i);
if((i<1)||(i>L.length))
returnERROR;
e=L.elem[i-1];
printf("查找结果e=%d\n",e);
returnOK;
}
链式存储:
Main.cpp
#include"init.h"
#include
#include"stdlib.h"
voidmain()
{
LinkListL;
inti,e,n;
intchoi;
printf("主菜单:
\n");
printf("\n");
printf("1.Create构造并赋值\n");
printf("2.Insert插入\n");
printf("3.Delete删除\n");
printf("4.Serch查找\n");
printf("5.Put显示所有数据\n");
printf("6.exit退出系统\n");
while
(1)
{
printf("\n");
printf("请输入您选择的功能");
scanf("%d",&choi);
printf("\n");
switch(choi)
{
case1:
printf("输入要写入的元素个数:
\n");
scanf("%d",&n);
GreateList_L(L,n);
break;
case2:
printf("请输入要插入的位置:
\n");
scanf("%d",&i);
printf("请输入要插入的数:
\n");
scanf("%d",&e);
ListInsert_L(L,i,e);
n++;//插入增加一个
break;
case3:
printf("请输入要删除的位置\n");
scanf("%d",&i);
ListDelete_L(L,i,e);
n--;//删除减少一个
break;
case4:
printf("请输入你想查询的数的位置\n");
scanf("%d",&i);
GetElem_L(L,i,e);
break;
case5:
printf("所有数据为:
\n");
Put_L(L,n);
break;
case6:
exit(ERROR);
default:
printf("请重新选择:
");/}
}
}
Opretation.cpp
#include"init.h"
#include"stdlib.h"
#include"stdio.h"
StatusGreateList_L(LinkList&L,intn)//创建
{
LinkListp,q;
inti;
L=(LinkList)malloc(sizeof(LNode));
p=L;
printf("请输入您想输入的数值