数据结构实验报告完整版.docx
- 文档编号:28594303
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:69
- 大小:187.68KB
数据结构实验报告完整版.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;i scanf("%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;i printf("%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&&j p=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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 报告 完整版
![提示](https://static.bdocx.com/images/bang_tan.gif)