最新版川师 数据结构 实验报告.docx
《最新版川师 数据结构 实验报告.docx》由会员分享,可在线阅读,更多相关《最新版川师 数据结构 实验报告.docx(79页珍藏版)》请在冰点文库上搜索。
最新版川师数据结构实验报告
《数据结构》实验教学大纲
学时课程总:
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)编程实现抽象数据类型三元组的定义、存储、基本操作(最大值、最小值、平均值等的求解),并设计一个主菜单完成各个功能的调用。
3.主要仪器设备及药品
1)PC机
2)TurboC2.0或VisualC++
源代码:
#include"head.h"
voidmain()
{
Tripletp;
ElemTypee,v1,v2,v3;
inti,choice;
printf("输入三个数,建立一个三元组\n");
scanf("%d%d%d",&v1,&v2,&v3);
if(InitTriplet(p,v1,v2,v3)==OVERFLOW)
printf("分配失败,退出程序!
");
else
do
{
printf("1:
取三元组第i个元素\n");
printf("2:
判断三元组元素是否递增\n");
printf("3:
求最大值\n");
printf("4:
置换第i个元素\n");
printf("0:
结束!
\n");
printf("请输入选择!
\n");
//getchar();
scanf("%d",&choice);
switch(choice)
{
case1:
printf("\ni=");
scanf("%d",&i);
if(Get(p,i,e)==ERROR)printf("i值不合法\n");
else
printf("第%d个元素的值为:
%d\n",i,e);
break;
case2:
if(IsAscending(p)==OK)
printf("三元组递增\n");
elseif(IsDescending(p)==OK)
printf("三元组递减!
\n");
else
printf("三元组非递增有序\n");
break;
case3:
Max(p,e);
printf("最大值是:
%d\n",e);break;
case4:
printf("\ni=");
scanf("%d",&i);
printf("\nx=");
scanf("%d",&e);
if(Put(p,i,e)==ERROR)printf("i值不合法\n");
elseprintf("置换第%d个元素后的3个元素分别为:
%d,%d,%d\n",i,p[0],p[1],p[2]);break;
case0:
printf("操作结束!
");break;
default:
printf("输入选择出错!
\n");
}
}while(choice!
=0);
DestroyTriplet(p);
}
//head.h
#ifndef_FUNC_H
#define_FUNC_H
#defineOK1
#defineERROR0
#defineOVERFLOW-1
typedefintStatus;
typedefintElemType;
typedefElemType*Triplet;
//函数原型
StatusInitTriplet(Triplet&T,ElemTypev1,ElemTypev2,ElemTypev3);//初始化
StatusDestroyTriplet(Triplet&T);//销毁指针
StatusGet(TripletT,inti,ElemType&e);//获取值,注意多个返回值的用法
StatusPut(Triplet&T,inti,ElemTypee);//设置值
StatusIsAscending(TripletT);//是否升序,用const避免改变
StatusIsDescending(TripletT);//是否降序
StatusMax(TripletT,ElemType&e);//最大值
StatusMin(TripletT,ElemType&e);//最小值
#endif
#include"stdio.h"
#include"head.h"
#include"malloc.h"
#include"stdlib.h"
StatusInitTriplet(Triplet&T,ElemTypev1,ElemTypev2,ElemTypev3)
{
T=(ElemType*)malloc(3*sizeof(ElemType));
if(!
T)
exit(OVERFLOW);
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<0||i>2)
returnERROR;
e=T[i-1];
returnOK;
}
StatusPut(Triplet&T,inti,ElemTypee)
{
if(i<0||i>2)
returnERROR;
T[i-1]=e;
returnOK;
}
StatusIsAscending(TripletT)
{
return(T[0]<=T[1])&&(T[1]<=T[2]);
}
StatusIsDescending(TripletT)
{
return(T[0]>=T[1])&&(T[1]>=T[2]);
}
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;
}
截图:
实验二线性表实验
(验证性实验4学时)
1.目的要求:
1)熟悉线性表的基本运算在两种存储结构(顺序结构和链式结构)上的实现;
2)以线性表的各种操作(建立、插入、删除等)的实现为重点;
3)通过本次实习帮助学生加深对高级语言C语言的使用(特别是函数参数、指针类型、链表的使用)。
4)认真阅读和掌握本实验的参考程序,上机运行本程序,保存和打印出程序的运行结果,并结合程序进行分析。
按照你对线性表的操作需要,重新改写主程序并运行,打印出文件清单和运行结果。
3.实验内容:
1)编程实现线性表两种存储结构中的基本操作的实现(线性表的创建、插入、删除和查找),并设计一个主菜单完成各个功能的调用。
3.主要仪器设备及药品
1)PC机
2)TurboC2.0或VisualC++
顺序表代码:
#include
#include"func.h"
voidmain()
{
SqListT;
intchoice,n,x=0,k;
ElemTypem;
InitList_Sq(T);
do
{
printf("请输入第%d个元素:
",T.length+1);
scanf("%d",&m);
Sq_ListInsert(T,T.length+1,m);
printf("是否继续输入,继续输入请按1,退出请按0\n");
scanf("%d",&k);
if(k!
=1)
ShowAll(T);
}while(k==1);
printf("顺序表的实现:
\n");
printf("1.插入\n");
printf("2.删除\n");
printf("3.取第i个值\n");
printf("4.退出\n");
printf("请输入您的选择:
");
scanf("%d",&choice);
switch(choice)
{
case1:
do
{
printf("请输入您要插入的位置:
");
scanf("%d",&n);
printf("请输入您要插入的数:
");
scanf("%d",&m);
Sq_ListInsert(T,n,m);
printf("是否继续插入,继续插入请按1,退出请按0\n");
scanf("%d",&k);
if(k!
=1)
ShowAll(T);
}while(k==1);
break;
case2:
printf("请输入要删除的元素位序:
");
scanf("%d",&n);
Sq_ListDelet(T,n,m);
ShowAll(T);
break;
case3:
printf("请输入您想取得元素的位序:
");
scanf("%d",&n);
GetElem(T,n,m);
printf("第%d个元素为%d\n",n,m);
break;
default:
break;
}
getchar();
getchar();
}
#ifndefFUNC_SEQLIST
#defineFUNC_SEQLIST
#defineLIST_INIT_SIZE100
#defineLISTINCREMENT10
#defineOK1
#defineERROR0
#defineOVERFLOW-1
typedefintElemType;
typedefintStatus;
typedefstruct
{
ElemType*elem;
intlength;
intlistsize;
}SqList;
StatusInitList_Sq(SqList&L);
StatusDestroyList_Sq(SqList&L);
StatusSq_ListInsert(SqList&L,inti,ElemTypee);
StatusSq_ListDelet(SqList&L,inti,ElemType&e);
StatusGetElem(SqListL,inti,ElemType&e);
StatusShowAll(SqListL);
#endif
#include"h1.h"
#include
#include
//函数实现
StatusInitList_Sq(SqList&L)
{
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!
L.elem)exit(OVERFLOW);
L.length=0;
L.listsize=LIST_INIT_SIZE;
returnOK;
}
StatusDestroyList_Sq(SqList&L){
free(L.elem);
L.elem=NULL;
returnOK;
}
StatusSq_ListInsert(SqList&L,inti,ElemTypee){
ElemType*newbase,*q,*p;
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;
returnOK;
}
StatusSq_ListDelet(SqList&L,inti,ElemType&e){
if((i<1)||(i>L.length))returnERROR;
ElemType*p,*q;
p=&(L.elem[i-1]);
e=*p;
q=L.elem+L.length-1;
for(++p;p<=q;++p)
*(p-1)=*p;
--L.length;
returnOK;
}
StatusGetElem(SqListL,inti,ElemType&e){
if(i<1||i>L.length)exit(OVERFLOW);
ElemType*q;
q=&L.elem[i-1];
e=*q;
returnOK;
}
StatusShowAll(SqListL){
inti;
for(i=0;iprintf("%4d",L.elem[i]);
printf("\n");
returnOK;
}
截图:
链表代码:
#include"funtion.h"
#include"stdio.h"
voidmain()
{
LinkListT;
intn,choice,k;
ElemTypee1;
CreateList(T);
printf("单链表的实现\n");
printf("1.插入\n");
printf("2.查找第i个元素的值\n");
printf("3.删除第i个元素的值\n");
printf("4.退出\n");
printf("请选择您的操作:
");
scanf("%d",&choice);
switch(choice)
{
case1:
printf("请输入要插入的位序:
");
scanf("%d",&n);
printf("请输入要插入的元素:
");
scanf("%d",&e1);
ListInsert_L(T,n,e1);
printf("插入后,结果为:
\n");
ShowAll(T);
break;
case2:
printf("请输入您要查找的位序:
");
scanf("%d",&n);
GetElem_L(T,n,e1);
printf("链表的第%d个元素为:
%d",n,e1);
break;
case3:
printf("请输入您要删除的位序:
");
scanf("%d",&n);
ListDelete_L(T,n,e1);
printf("您要删除的数为%d\n",e1);
printf("删除后的结果为:
\n");
ShowAll(T);
break;
default:
break;
}
getchar();
getchar();
}
#ifndefFUNC_LINK_H
#defineFUNC_LINK_H
#defineOK1
#defineERROR0
#defineOVERFLOW-1
typedefintElemType;
typedefintStatus;
typedefstructLNode{
ElemTypedata;
structLNode*next;
}LNode,*LinkList;
StatusCreateList(LinkList&L);
StatusListInsert_L(LinkList&L,inti,ElemTypee);
StatusGetElem_L(LinkListL,inti,ElemType&e);
StatusListDelete_L(LinkList&L,inti,ElemType&e);
StatusShowAll(LinkListL);
#endif
//函数实现
#include"stdio.h"
#include"h1.h"
#include"malloc.h"
#include"stdlib.h"
StatusCreateList(LinkList&L)
{
LinkListp,pre;
inti,n;
printf("请输入要建立链表的长度\n");
scanf("%d",&n);
printf("请输入%d个数据\n",n);
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
pre=L;
for(i=1;i<=n;i++)
{
p=(LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
//p->next=L->next;
//L->next=p;
p->next=pre->next;
pre->next=p;
pre=pre->next;
}
returnOK;
}
StatusListInsert_L(LinkList&L,inti,ElemTypee){
LinkListp,s;
p=L;
intj=0;
while(p&&j{p=p->next;++j;}
if(!
p||j>i-1)returnERROR;
s=(LinkLi