数据结构实验报告完整版.docx
《数据结构实验报告完整版.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告完整版.docx(69页珍藏版)》请在冰豆网上搜索。
数据结构实验报告完整版
四川师范大学计算机学院
实验报告册
院系名称:
计算机科学学院
课程名称:
数据结构
实验学期2010年至2011年第一学期
专业班级:
2010级教育技术学
姓名:
学号:
指导教师:
实验最终成绩:
实验报告须知
1.学生填写实验报告应按规范填写,填写格式见由任课老师给出的实验报告样本;
2.学生应填写的内容包括:
封面相关栏目、第一页中‘本学期(年)开设实验课程情况一览表’中的实验名称、学时数;每次报告中的实验性质、同组人姓名、实验日期、以及实验报告中的一至五项;
3.教师填写内容为:
实验评价、每次报告成绩、第一页中‘本学期(年)开设实验课程情况一览表’中成绩、及封面的实验最终成绩;
4.学生实验结束后,教师应对学生实验结果进行核实,学生方可离开实验室。
5、实验成绩等级分为(90-100分)优,(80-89分)良,(70-79分)中,(60-69分)及格,(59分)不及格。
6.本实验册应妥善保管,本课程实验结束后应交回实验室。
本学期(年)开设实验课程情况一览表
序号
实验名称
(学生实验后填写)
学时数
成绩
(分数或等级)
1
抽象数据类型的表示与实现
2学时
2
线性表实验
4学时
3
栈和队列实验
6学时
4
稀疏矩阵实验
4学时
5
树和二叉树实验
6学时
6
图及其应用实验
6学时
7
查找和排序实验
4学时
8
9
10
11
12
13
14
15
16
17
18
19
20
实验报告
(1)
实验名称
抽象数据类型的表示与实现
同组人姓名
实验性质
□基本操作■验证性
■综合性□设计性
实验日期
2011年9月
30日
实验成绩
教师评价:
实验预习□实验操作□实验结果□实验报告□其它□
教师签名:
一、实验目的及要求
1)熟悉类C语言的描述方法,学会将类C语言描述的算法转换为C源程序实现;
2)理解抽象数据类型的定义,编写完整的程序实现一个抽象数据类型(如三元组)。
3)认真阅读和掌握本实验的参考程序,上机运行程序,保存和打印出程序的运行结果,并结合程序进行分析。
二、实验内容
1)编程实现抽象数据类型三元组的定义、存储、基本操作(最大值、最小值、平均值等的求解),并设计一个主菜单完成各个功能的调用。
三、主要设备及软件
1)PC机
2)TurboC2.0或VisualC++
四、实验流程、操作步骤或核心代码、算法片段
(一)头文件(H1.h)
#ifndefH1_H
#defineH1_H
#defineOK1
#defineERROR0
#defineOVERFLOW-2
typedefintStatus;
typedefintElemType;
typedefElemType*Triplet;
//函数声明
externStatusInitTriplet(Triplet&T,ElemTypev1,ElemTypev2,ElemTypev3);
externStatusDestroyTriplet(Triplet&T);
externStatusGet(TripletT,inti,ElemType&e);
externStatusPut(Triplet&T,inti,ElemTypee);
externStatusMax(TripletT,ElemType&e);
externStatusMin(TripletT,ElemType&e);
externStatusAverage(TripletT,ElemType&e);
#endif
(二)功能函数(function.cpp)
#include
#include"h1.h"
StatusInitTriplet(Triplet&T,ElemTypev1,ElemTypev2,ElemTypev3)
{
T=(ElemType*)malloc(3*sizeof(ElemType));
if(!
T)
returnOVERFLOW;
T[0]=v1;T[1]=v2;T[2]=v3;
returnOK;
}
StatusDestroyTriplet(Triplet&T)
{
free(T);T=NULL;
returnOK;
}
StatusGet(TripletT,inti,ElemType&e)
{
if(i<1||i>3)
returnERROR;
e=T[i-1];
returnOK;
}
StatusPut(Triplet&T,inti,ElemTypee)
{
if(i<1||i>3)
returnERROR;
T[i-1]=e;
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]);
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]);
returnOK;
}
StatusAverage(TripletT,ElemType&e)
{
e=(T[0]+T[1]+T[2])/3;
returnOK;
}
(三)主函数(triplet.cpp)
#include
#include"h1.h"
voidmain()
{
Tripletp;
ElemTypee,v1,v2,v3;
inti;
intselect;
printf("输入三个数,建立一个三元组\n");
scanf("%d%d%d",&v1,&v2,&v3);
if(InitTriplet(p,v1,v2,v3)==OVERFLOW)
printf("分配失败,退出程序!
");
else
do
{
printf("1:
取三元组的最大值\n");
printf("2:
取三元组的最小值\n");
printf("3:
求三元组的平均值\n");
printf("0:
结束!
\n");
printf("请输入选择!
\n");
scanf("%d",&select);
switch(select)
{case1:
Max(p,e);
printf("最大值是:
%d\n",e);break;
case2:
Min(p,e);
printf("最小值是:
%d\n",e);break;
case3:
Average(p,e);
printf("平均值是:
%d\n",e);break;
case0:
printf("操作结束!
");break;
default:
printf("输入选择出错!
\n");
}//endofswitch
}while(select!
=0);//endofwhile
DestroyTriplet(p);
}//endofmain
五、实验结果的分析与评价
实验结果:
分析:
(1)类C语言面对对象,而C语言面对过程;
(2)核心算法就相当于C语言的程序;
(3)初步了解三元组的建立等知识;
(4)初步了解利用C++编程的步骤及编程的组成部分;
(5)初次接触还是对很多地方倍感疑惑,需要多多操作理解;
实验报告
(2)
实验名称
线性表实验:
顺序存储、链式存储
同组人姓名
实验性质
□基本操作■验证性
■综合性□设计性
实验日期
2010年10月9日
实验成绩
教师评价:
实验预习□实验操作□实验结果□实验报告□其它□
教师签名:
一、实验目的及要求
1)熟悉线性表的基本运算在两种存储结构(顺序结构和链式结构)上的实现;
2)以线性表的各种操作(建立、插入、删除等)的实现为重点;
3)通过本次实习帮助学生加深对高级语言C语言的使用(特别是函数参数、指针类型、链表的使用)。
认真阅读和掌握本实验的参考程序,上机运行本程序,保存和打印出程序的运行结果,并结合程序进行分析。
按照你对线性表的操作需要,重新改写主程序并运行,打印出文件清单和运行结果
二、实验内容
1)编程实现线性表两种存储结构中的基本操作的实现(线性表的创建、插入、删除和查找),并设计一个主菜单完成各个功能的调用。
三、主要设备及软件
1)PC机
2)TurboC2.0或VisualC++
四、实验流程、操作步骤或核心代码、算法片段
1.顺序存储的程序:
(一)头文件(H1.h)
#ifndefH1_H
#defineH1_H
#defineLIST_INIT_SIZE100//线形表存储空间的初始分配量
#defineLISTINCREMENT10//线形表存储空间的分配增量
#defineOVERFLOW-2
#defineOK1
#defineERROR0
typedefintElemType;
typedefintStatus;
typedefstruct{
ElemType*elem;//存储空间基址
intlength;//当前长度
intlistsize;//当前分配的存储容量
}SqList;//函数声明
externStatusInitList_Sq(SqList&L,intn);
externStatusListInsert_Sq(SqList&L,inti,ElemTypee);
externStatusListDelete_Sq(SqList&L,inti,ElemType&e);
externStatusLocateElem_Sq(SqListL,ElemTypee);
externStatusDestrory_Sq(SqList&L);
#endif
(二)功能函数(function.cpp)
#include"stdlib.h"
#include"h1.h"
#include"stdio.h"
StatusInitList_Sq(SqList&L,intn)
{
inti;
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!
L.elem)
returnOVERFLOW;//存储分配失败
L.length=0;//空表长度为0
for(i=0;iscanf("%d",&(L.elem[i]));
++L.length;
}
L.listsize=LIST_INIT_SIZE;//初始存储容量
returnOK;
}//Initlist_sq
StatusListInsert_Sq(SqList&L,inti,ElemTypee)
{
ElemType*newbase;
ElemType*p;
ElemType*q;
if(i<1||i>L.length+1)
returnERROR;//i值不合法
if(L.length>=L.listsize){//当前存储空间已满,增加分配
newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!
newbase)
returnOVERFLOW;//存储分配失败
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;//插入e
++L.length;//表长增1
returnOK;
}//ListInsert_sq
StatusListDelete_Sq(SqList&L,inti,ElemType&e)
{
ElemType*p;
ElemType*q;
if((i<1)||(i>L.length))
returnERROR;//i值不合法
p=&(L.elem[i-1]);//p为被删除元素的位置
e=*p;//被删除元素的值赋给e
q=L.elem+L.length-1;//表尾元素的位置
for(++p;p<=q;++p)
*(p-1)=*p;//被删除元素之后的元素左移
--L.length;//表长减1
returnOK;
}//ListDelete_sq
StatusLocateElem_Sq(SqListL,ElemTypee){
//在顺序表中查询第一个满足判定条件的数据元素,
//若存在,则返回它的位序,否则返回0
inti=1;//i的初值为第1元素的位序
ElemType*p=L.elem;//p的初值为第1元素的存储位置
while((i<=L.length)&&(*p++!
=e))
++i;
if(i<=L.length)
returni;
else
return0;
}//LocateElem_Sq
StatusDestrory_Sq(SqList&L)
{
returnOK;
}
(三)主函数(main.cpp)
#include
#include"h1.h"
voidmain()
{
SqListp;
inti,e,n;
intselect;
printf("请输入你将要建立的链表的大小n:
");
scanf("%d",&n);
printf("\n请输入%d个数值并用'空格符'分隔:
\n",n);
InitList_Sq(p,n);
printf("\n你建立的链表为:
\n");
for(i=0;iprintf("%3d",p.elem[i]);
/*if(InitList_Sq(p,n)==OVERFLOW)
printf("分配失败,退出程序!
");
else*/
do
{
printf("\n1:
在链表原来的基础上插入一个值\n");
printf("2:
删除链表中的一个值\n");
printf("3:
查找链表中的某一个值\n");
printf("0:
结束!
\n");
printf("请输入选择!
\n");
scanf("%d",&select);
switch(select)
{
case1:
printf("从键盘输入你插入的元素的位置i和插入元素的值e:
\n");
scanf("%d%d",&i,&e);
ListInsert_Sq(p,i,e);
printf("插入后所有的值是:
\n");
for(i=0;i
printf("%3d",p.elem[i]);
break;
case2:
printf("输入你删除的元素的位置i:
\n");
scanf("%d",&i);
ListDelete_Sq(p,i,e);
printf("删除后所有的值是:
\n");
for(i=0;i
printf("%3d",p.elem[i]);
break;
case3:
printf("输入查找的元素e:
\n");
scanf("%d",&e);
LocateElem_Sq(p,e);
printf("所查找值的位序是:
%d\n",LocateElem_Sq(p,e));
break;
case0:
printf("操作结束!
");
break;
default:
printf("输入选择出错!
\n");
}//endofswitch
}while(select!
=0);//endofwhile
Destrory_Sq(p);
}//endofmain
2.链式存储的程序:
(一)H1.h(头文件)
#ifndefH1_H
#defineH1_H
#defineERROR0
#defineOK1
#defineOVERFLOW-2
typedefintElemType;
typedefintStatus;
typedefstructLNode{
ElemTypedata;
structLNode*next;
}LNote,*LinkList;
externStatusCreateList_L(LinkList&L,intn);
externStatusGetElem_L(LinkListL,inti,ElemType&e);
externStatusListInsert_L(LinkList&L,inti,ElemTypee);
externStatusListDelete_L(LinkList&L,inti,ElemType&e);
externStatusDestroy_L(LinkList&L);
#endif
(二)功能函数(function.cpp)
#include"stdlib.h"
#include"h1.h"
#include"stdio.h"
StatusCreateList_L(LinkList&L,intn){
//逆位序输入n个元素的值,建立带表头结点的单链线性表。
inti;
structLNode*p;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;//先建一个带头结点的单链表
for(i=n;i>0;--i){
p=(LinkList)malloc(sizeof(LNode));//生成结点
scanf("%d",&p->data);//输入元素
p->next=L->next;
L->next=p;//插入到表头
}
returnOK;
}//CreateList_L
StatusGetElem_L(LinkListL,inti,ElemType&e){
//L为带结点的单链表的头指针
//当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR
LinkListp;
p=L->next;
intj=1;//初始化,p指向第一个结点,j为计数器
while(p&&j
p=p->next;
++j;
}
if(!
p||j>i)
returnERROR;//第i个元素不存在
e=p->data;
returnOK;
}//GetElem_L
StatusListInsert_L(LinkList&L,inti,ElemTypee){
//在带结点的单链线性表L中第i个位置之前插入元素e
structLNode*s;
structLNode*p;
p=L;
intj=0;
while(p&&jp=p->next;++j;
}//寻找第i-1个结点
if(!
p||j>i-1)
returnERROR;//i小于1或者大于表长加1
s=(LinkList)malloc(sizeof(LNode));//生成新结点
s->data=e;s->next=p->next;//插入L中
p->next=s;
returnOK;
}//ListInsert_L
StatusListDelete_L(LinkList&L,inti,ElemType&e){
//在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
structLNode*p;
p=L;
structLNode*q;
intj=0;
while(p->next&&j<(i-1)){//寻找第i个结点,并令p指向其前驱
p=p->next;++j;
}
if(!
(p->next)||j>(i-1))
returnERROR;//删除位置不合理
q=p->next;p->next=q->next;//删除并释放结点
e=q->data;free(q);
returnOK;
}//ListDelete_L
Destroy_L(LinkList&L){
returnOK;
}
(三)主函数(main.cpp)
#include
#include"h1.h"
voidmain()
{
LinkListp,L,s;
ElemTypedata;
inti,n,e;
intselect;
printf("从键盘输入你建立的链表的数值个数n:
");
scanf("%d",&n);
pr