当前位置:文档之家› 数据结构实验讲义2011-08

数据结构实验讲义2011-08

数据结构实验讲义2011-08
数据结构实验讲义2011-08

《数据结构》实验讲义

信息学院

王青松李晓光

2011年8月

前言

数据结构是计算机程序设计的重要理论技术基础,它是计算机学科的核心课程。通过实验帮助学生消化理解课程内容,提高自身编程能力,实验目的和任务是使实验者较全面地掌握各种常用的数据结构,为学习后续软件课程提供必要的基础,提高运用数据结构解决实际问题的能力,另外通过上机实验加深对课程内容的理解,增加感性认识,提高软件设计、编写及程序调试的能力。我们要求所编制的程序能正确运行,并提交实验报告。

数据结构的内容具体包括:

1、线性结构;

2、树状结构;

3、图状结构;

4、查找;

5、排序。

本实验讲义是针对数据结构中的操作编写,提出了上机实验的要求,介绍了程序调试和测试的基本知识,并且具体安排了8个实验(其中设计性题目5个,综合设计性题目2个,验证性实验1个),便于进行实验教学。由于篇幅和课时的限制,在见教材和课堂讲授中只能介绍一些典型的例题。建议同学们尽可能多做例题和习题,以掌握数据结构特点及编程思路,另外需要说明的是本讲义对学生上机仅提供一个参考,学生可不局限于讲义讲的那些操作,同学可以多做或是做自己感兴趣的操作。

本实验所依据的教材是:《数据结构》,严蔚敏等编著,清华大学出版社。上机环境是C语言上机环境。

目录

实验一…………………………………………………………………………4-6 实验二…………………………………………………………………………7-7 实验三…………………………………………………………………………8-9 实验四…………………………………………………………………………10-13 实验五…………………………………………………………………………14-16 实验六…………………………………………………………………………16-17 实验七…………………………………………………………………………18-21 实验八…………………………………………………………………………21-23

[实验题目一] 顺序表的插入

对于第一个实验,我们要求是用一次实验来完成,最后提交一个报告。

一、实验目的:

1、掌握顺序表的结构特点。

2、主要掌握顺序表的插入算法。

3、学会分析算法的时间复杂度。

二、预习内容

1、WinTC或VC++上机环境;

2、教材2.2节线性表的顺序表示和实现。

三、实验内容:

1、已知顺序表L,在第i个元素前插入元素e。

A、首先要定义顺序表的数据结构,可参考教材22页;

B、定义一个函数能够初始化一个顺序表,可参考教材23页算法2.3;

C、编写一个函数,例如:

int ListInsert_Sq(SqList *L,int i,int e){

//已知顺序表L,在第i个元素前插入元素e,已知空间足够大。

……

}

上边算法可参考教材24页算法2.4

D、读懂F中函数(ListPrint),它能输出一个顺序表中的所有元素的值。

E、编写主函数(main)并多次调用ListInsert_Sq函数创建一个顺序表,

并输出其结果,例如:(输入的是1,2,3,4,5),输出结果为:

1 2 3 4 5

F、程序编制上的部分提示,仅供参考:

#include "stdio.h"

#define N 10 //顺序表中最多N个数

#define OK 1

#define ERROR -1

typedef struct{

int *elem;

int length;

int listsize;

}SqList;

int Init(SqList *L){

//因为L是指针,所以请注意->的使用,而不是L. L->elem=(int*)malloc(N*sizeof(int));

if(!L->elem) return ERROR;

L->length=0;

L->listsize=N;

return OK;

}

int ListInsert_Sq(SqList *L,int i,int e){

//插入函数,在实验时,可暂不考虑空间不足的情况……

}

int ListPrint(SqList M){

//能输出顺序表所有元素的值

int *p;

for(p=M.elem;p<=(M.elem+M.length-1);p++) printf("%d ",*p);

printf("\n");

}

main(){

int i,n=5,e;

SqList M;

Init(&M);

printf("Input %d numbers, Please:\n",n);

for(i=1;i<=n;i++){

/*创建初始的顺序表,包含n个数,通过调用n次ListInsert_Sq函数实施插入*/

scanf("%d",&e); //输入一个数

ListInsert_Sq(&M,i,e); //在L中第i个前插入e

}

ListPrint(M);//输出顺序表中各元素的值

ListInsert_Sq(&M,3,999); //在第三个元素前插入999

printf("After insert:\n");

ListPrint(M);//输出插入后顺序表的各元素的值

getch();

//如果环境是Win-Tc,getch()起到暂停作用以看程序输出结果

}

注:在上机编程时可不打注释(//后的文字),但是在写实验报

告时要加适当的注释;有的函数返回类型是int,但是可

以不返回任何类型,可以换成void。

2、编写函数实现在一个非递减的顺序表L(空间足够大)中,插入一个值为

e的元素,要求插入后L仍然是非递减的。(选做)

void SortListInsert(SqList *L, int e){

......

}

四、实验报告要求

1、写好班级、姓名、学号和实验题目;

2、写上程序源代码;

3、写上程序测试的结果;

4、写个实验小结。

对于第二个实验,我们要求是用一次实验来完成,最后提交一个报告。

一、实验目的:

1、掌握顺序表的结构特点。

2、主要掌握顺序表的删除算法。

3、理解算法的高效性的追求目标。

二、预习内容

1、WinTC或VC++上机环境;

2、教材2.2节线性表的顺序删除算法。

三、实验内容:

1、顺序表L,从第i个元素起连续删除k个元素。

A、在“实验一”的程序(main函数的上边),增加编写一个函数,例如:

int ListDel_Sq(SqList *L,int i,int k){

//顺序表L,从第i个元素起连续删除k个元素。

……

}//本算法可参考教材24页算法2.5

B、扩充上边主函数(main) 对初始的顺序表L(含n个数)调用

ListDel_Sq(L,2,3)函数,表示从L中第二个元素起连续删除3个

数,并输出调用ListDel_Sq后的L中的元素的值。

提示:ListDel_Sq这个函数如果是高效的,那么它的时间复杂度应为O(n),如果时间复杂度为O(n2),那么需要对算法进行改进。

2、在顺序表L中查找一个元素(选做)

A、本算法可参考教材26页算法2.6

四、实验报告要求

1、写好班级、姓名、学号和实验题目;

2、写上程序源代码;

3、写上程序测试的结果和实验小结。

对于第三个实验,我们要求一次实验来完成,最后提交一个报告。

一、实验目的:

1、理解单链表的结构特点。

2、重点掌握创建单链表的两种算法。

3、学会分析算法的时间复杂度。

二、预习内容

1、教材2.3.1线性链表;

三、实验内容:

1、建立并输出两个递增单链表La和Lb。

A、首先要定义单链表的数据结构,可参考教材28页;

B、编写一个函数使用“头插法”或“尾插法”创建一个单链表,例如:

LinkList CreateList(LinkList L,int n){

………

}

上边算法可参考教材31页算法2.11,注意本算法不要求对单链表排序

C、编写主函数(main) ,调用函数CreateList(La,n), CreateList(Lb,n)

分别录入单链表La和Lb,注意手动录入时要保证La和Lb是递增的(如果是头插法,那么录入时要按从大到小录入,如:5 4 3 2 1)

D、编写一个函数能够显示一个单链表中各结点的值,设La和Lb如下:

La:1 3 7 8 15 20

Lb:2 4 8 15 17 24 90

E、程序编制上的提示,仅供参考:

#include "stdio.h"

typedef struct LNode{

int data;

struct LNode *next;

}LNode,*LinkList;

LinkList creatlist(LinkList L,int n){

//使用头插法(算法2.11),创建一个含有n个结点的带头结点的单链表 //也可以使用尾插法来创建L

……

return L;

//因为链表是动态分配内存,所以创建后头指针需返回,在调用时接收}

void show(LinkList L){

//能够输出带头结点的单链表L中的各个结点的值

……

}

main() {

LinkList La,Lb;

La=creatlist(La,6); //创建带头结点单链表La含6个结点

show(La); //输出La中各结点的值

Lb=creatlist(Lb,7);

show(Lb);

getch();

}

注:两种创建单链表的方法都分别实现,并体现在实验报告上。

四、实验报告要求

1、写好班级、姓名、学号和实验题目;

2、写上程序源代码;

3、写上程序测试的结果;

4、写个实验小结。

[实验题目四]单链表的合并

对于第四个实验,我们要求一次实验来完成,最后提交一个报告。

一、实验目的:

1、理解单链表的结构特点。

2、重点掌握两个单链表在集合上的并、交等运算,要求占用原来空间。

3、学会分析算法的时间复杂度。

二、预习内容

1、教材2.3.1线性链表;

2、集合的运算

三、实验内容:

1、在实验内容1的基础上,求La和Lb两集合的并运算,要求占用原来空间。

A、在实验内容1的main函数上边编写一个函数能够实现La和Lb两集合

的并运算(合并后仍然是递增的),例如:

void bing(LinkList La,LinkList Lb){

//求La和Lb两集合的并运算,结果用La保存而无需使用LC

//因为占用原来空间,所以需释放多余结点

……

}

上边算法可参考教材31页算法2.12,注意本算法需考虑删除相同的元

素,因为我们考虑的集合中没有重复元素。

B、在main函数中输入数据:(如果是头插法,输入数据时要倒着录)

La:1 3 7 8 1520

Lb:2 4 81517 24 90

C、在主函数中调用bing(La,Lb)算法,并输出合并后的La结果:

1 2 3 4 7 8 15 17 20 24 90

D、主函数编制提示,仅供参考:

main() {

LinkList La,Lb;

La=creatlist(La,6);//创建La要求递增

show(La);

Lb=creatlist(Lb,7); //创建Lb要求递增

show(Lb);

bing(La,Lb); //求并集,合并后的结果在La中,Lb就不存在了

show(La);

getch();

}

注:第二次实验完成以上内容即可,如有剩余时间,可以做下面的选做题。

2、求La和Lb两集合的交运算,要求占用原来空间。(选做)

A、在上边程序基础上,增加编写一个函数能够实现La和Lb两集合的交

运算(交集仍然是递增的),例如:

void Jiao(LinkList La,LinkList Lb){

//求La和Lb两集合的交运算,结果用La保存而无需使用LC

……

}

上边算法可参考教材31页算法2.12,注意本算法要将La和Lb中多余结点释放掉。

B、在主函数中调用Jiao(La,Lb)算法,并输出结果:

8 15

C、注意当调用bing(La,Lb)算法后,La,Lb都改变了,Lb不存在了,

La的值也发生了变化,这样就无法实现下边的实验了,所以需要重

新录入La和Lb,他们的值如下:

La:1 3 7 8 15 20

Lb:2 4 8 15 17 24 90

D、主函数编制提示,仅供参考

main() {

LinkList La,Lb;

La=creatlist(La,6);//创建La要求递增

show(La);

Lb=creatlist(Lb,7); //创建Lb要求递增

show(Lb);

Jiao(La,Lb); //求交集,

show(La);

getch();

}

注:main函数的编制可参考上边的并运算,对交运算进行测试,上机时一回只测试一个运算,如要测试交运算,就不要测试并运算了。

3、将一个带头结点单链表就地逆置(选做)

程序编制上的提示,仅供参考(其中很多代码可以借鉴内容1):

#include "stdio.h"

#define NULL 0

typedef struct LNode{

int data;

struct LNode *next;

}LNode,*LinkList;

LinkList creatlist(LinkList L,int n){

//创建一个含有n个结点的带头结点的单链表

……

return L;

}

void show(LinkList L){

//能够输出带头结点的单链表L中的各个结点的值

……

}

void reverse_L(LinkList L){

//将一个带头结点单链表L就地逆置

……

}

main() {

LinkList L;

L=creatlist(L,6);

show(L);

reverse_L (L);

printf(“\nThe after reverse L is:\n”);

show(L);

getch( );

}

注:程序运行时如输入(假设采用头插法创建的链表):6 5 4 3 2 1,输出结果如下:

1 2 3 4 5 6

The after reverse L is:

6 5 4 3 2 1

四、实验报告要求

1、写好班级、姓名、学号和实验题目;

2、写上程序源代码;

3、写上程序测试的结果;

4、写个实验小结。

[实验题目五] 二叉树的建立与遍历

对于第五个实验,我们要求是用一次实验来完成,最后提交一个报告。

一、实验目的:

1、理解树的结构特点。

2、掌握建立二叉树和遍历的算法。

3、重点掌握的递归算法的特点。

二、预习内容

1、教材6.2.3和6.3.1;

2、递归算法

三、实验内容:

1、建立一个二叉树

A、建立二叉树的数据结构,要求以二叉链表作为存储结构,可参考

教材127页

B、读懂下面递归函数创建一个二叉树,例如:

BiTree CreateBitree(BiTree T){

……

}

上边算法可参考教材131页算法6.4,注意录入的序列次序。

2、对建立的二叉树进行遍历

A、写一个递归算法实现对二叉树的遍历,要求能输出结果,例如:

int PreOrderTraverse(Bitree T){ //先序遍历二叉树

……

} 上边算法可参考教材129页算法6.1。

B、编写主函数(main) ,调用函数CreateBitree(T)来创建一个二

叉树并遍历。

C、程序编制上的提示,仅供参考:

#include "stdio.h"

#include "string.h"

#define NULL 0

typedef struct BiTNode{

char data; //注意结点类型

struct BiTNode *lchild,*rchild;

}BiTNode,*BiTree;

BiTree Create(BiTree T){// 创建二叉树

char ch;

scanf("%c",&ch);

if(ch=='#') T=NULL;

else{ if(!(T=(BiTNode*)malloc(sizeof(BiTNode))))

exit(0);

T->data=ch;

T->lchild=Create(T->lchild);

T->rchild=Create(T->rchild);

}

return T;

}

int preorder(BiTree T){

//先序遍历二叉树,输出各结点的值

……

}/*在完成先序遍历的基础上,可去实现中序和后序遍历算法*/

注意:在实验报告要体现出先序遍历和中序遍历算法。

main(){

BiTree T;

T=Create(T); //创建二叉树

printf(“The preOrder of T is:\n”);

preorder(T); //先序遍历二叉树,输出T中各结点的值

getch( );

}

注意:录入测试数据时一定要先知道自己所要创建的二叉树,例如,输入的序列是:Ab##C##(回车),那么所创建的二叉树是什么样呢?

参考教材131页。

3、选做题

用先序遍历方式输出二叉树中的大写字母,并将大写字母的个数存入全局变量Count中。

四、实验报告要求

1、写好班级、姓名、学号和实验题目;

2、写上程序源代码;

3、写清程序的输入实例和输出结果;

4、写个实验小结。

[实验题目六] 二叉树的应用

对于第六个实验,我们要求是用一次实验来完成,最后提交一个报告。

一、实验目的:

1、理解二叉树的结构特点。

2、掌握二叉树的应用算法。

3、重点掌握的递归算法的特点。

二、预习内容

1、教材6.2.3和6.3.1;

2、递归算法

三、实验内容:

1、求二叉树叶子数

A、写一个递归算法实现计算二叉树的叶子数,提示:先考虑边界,

如果二叉树为空,则返回0;否则,如果根结点无左孩子和右孩子则返

回1,否则,返回该二叉树的左子树叶子数加上右子树的叶子数。例如:

int sumLeaf(BiTree T){ //求二叉树叶子数,不使用全局变量

……

}

C、在函数(main) ,调用函数sumLeaf(T),并能输出结果进行验证。

函数(main)的编制提示如下:

main(){

int countSum;

BiTree T;

T=Create(T); //参考实验五

preorder(T);//参考实验五,先序遍历二叉树

inorder(T);//参考实验五,中序遍历二叉树

countSum=sumLeaf(T);//求叶子数

printf("The Sumleaf is:%d\n",countSum);//输出叶子数 getch( );

}

2、写一个递归算法统计二叉树的度为1的结点总数,不用全局变量。

3、选做题

A、写一个递归算法实现计算二叉树的深度。

B、写一个递归算法实现统计二叉树的结点总数,不使用全局变量。

四、实验报告要求

1、写好班级、姓名、学号和实验题目;

2、写上程序源代码;

3、写清程序的输入实例和输出结果;

4、写个实验小结。

[实验题目七] 图的建立与遍历

对于第七个实验,我们要求是用一次实验来完成,最后提交一个报告。

一、实验目的:

1、理解图的结构特点。

2、掌握存储图的方法(邻接表)。

3、掌握图的遍历方法。

二、预习内容

1、教材7.2.

2、7.3和7.5.1;

2、递归算法

三、实验内容:

1、建立一个有向图

A、定义图的数据结构,要求用邻接表,参考教材163页

B、定义一个函数建立一个有向图。

具体算法思想在课堂上讲解。

2、对上边有向图进行深度优先遍历

具体算法思想可参考教材169页算法7.4和算法7.5

3、图的程序编制上较难,所以给出全部参考算法,做验证性实验:#define NULL 0

#define N 4 /* N表示图的顶点最大个数*/

typedef struct ArcNode{

int adjvex;

struct ArcNode *nextarc;

}ArcNode;

typedef struct VNode{

int data; /* 注意图的顶点信息是整型*/

ArcNode *firstarc;

} VNode,Adjlist[N]; /* 最多N个顶点*/

int visited[N]={0}; /* 全局变量,初值是0,避免重复遍历*/

typedef struct{

Adjlist vertices;

int vexnum,arcnum;

}ALGraph; /*邻接表*/

void Create(ALGraph *G){ /* 创建一个有向图*/

int i,j,k;

ArcNode *s;

printf("Please input vexnum and arcnum:");

scanf("%d%d",&G->vexnum,&G->arcnum);

/* 输入顶点数(最多N)和边数*/ printf("Please input each vex message,vex message is int and from 0 start :\n");

for(i=0;ivexnum;i++){

/* 输入每个顶点信息,注意顶点类型是整数,顶点编号从0开始顶点信息是顶点编号*/

scanf("%d",&G->vertices[i].data);

G->vertices[i].firstarc=NULL;

}

printf("Please input the edge,edge message is int,int:\n");

for(k=0;karcnum;k++){

/* 输入每个边信息,注意录入边的形式,例如顶点0,1之间有边,*/

/* 录入正确形式是:0,1 */

scanf("%d,%d",&i,&j);

s=(ArcNode *)malloc(sizeof(ArcNode));

s->adjvex=j;

s->nextarc=G->vertices[i].firstarc;

G->vertices[i].firstarc=s;

}

}

void DFS(ALGraph G,int v){

/* 从顶点v出发进行深度优先遍历,注意参数G的类型*/ ArcNode *w;

visited[v]=1;

printf("%3d",G.vertices[v].data);

for(w=G.vertices[v].firstarc;w;w=w->nextarc)

if(!visited[w->adjvex])

DFS(G, w->adjvex);

}

void DFSGraph(ALGraph G){ /* 尝试从各点出发DFS */ int i;

for(i=0;i

if(!visited[i]) {

printf("\nFrom %d DFS is:",i);

DFS(G,i); /* 从i出发深度遍历*/

}

}

main(){

ALGraph G;

Create(&G);

DFSGraph (G);

getch();

}

例:输入数据依次是:4 3 回车

0 1 2 3 回车

0,1 0,2 1,3 回车

思考:

画出按上边输入数据所创建的有向图的邻接表。

2017数据结构实验指导书

《数据结构》实验指导书 贵州大学 电子信息学院 通信工程

目录 实验一顺序表的操作 (3) 实验二链表操作 (8) 实验三集合、稀疏矩阵和广义表 (19) 实验四栈和队列 (42) 实验五二叉树操作、图形或网状结构 (55) 实验六查找、排序 (88) 贵州大学实验报告 (109)

实验一顺序表的操作 实验学时:2学时 实验类型:验证 实验要求:必修 一、实验目的和要求 1、熟练掌握线性表的基本操作在顺序存储和链式存储上的实现。 2、以线性表的各种操作(建立、插入、删除等)的实现为重点。 3、掌握线性表的动态分配顺序存储结构的定义和基本操作的实现。 二、实验内容及步骤要求 1、定义顺序表类型,输入一组整型数据,建立顺序表。 typedef int ElemType; //定义顺序表 struct List{ ElemType *list; int Size; int MaxSize; }; 2、实现该线性表的删除。 3、实现该线性表的插入。 4、实现线性表中数据的显示。 5、实现线性表数据的定位和查找。 6、编写一个主函数,调试上述算法。 7、完成实验报告。 三、实验原理、方法和手段 1、根据实验内容编程,上机调试、得出正确的运行程序。 2、编译运行程序,观察运行情况和输出结果。 四、实验条件 运行Visual c++的微机一台 五、实验结果与分析 对程序进行调试,并将运行结果进行截图、对所得到的的结果分析。 六、实验总结 记录实验感受、上机过程中遇到的困难及解决办法、遗留的问题、意见和建议等,并将其写入实验报告中。

【附录----源程序】 #include #include using namespace std; typedef int ElemType; struct List { ElemType *list; int Size; int MaxSize; }; //初始化线性表 bool InitList(List &L) { L.MaxSize=20; L.list=new ElemType[L.MaxSize]; for(int i=0;i<20&&L.list==NULL;i++) { L.list=new ElemType[L.MaxSize]; } if(L.list==NULL) { cout<<"无法分配内存空间,退出程序"<L.Size+1||pos<1) { cout<<"位置无效"<

数据结构实验报告格式

《数据结构课程实验》大纲 一、《数据结构课程实验》的地位与作用 “数据结构”是计算机专业一门重要的专业技术基础课程,是计算机专业的一门核心的关键性课程。本课程较系统地介绍了软件设计中常用的数据结构以及相应的存储结构和实现算法,介绍了常用的多种查找和排序技术,并做了性能分析和比较,内容非常丰富。本课程的学习将为后续课程的学习以及软件设计水平的提高打下良好的基础。 由于以下原因,使得掌握这门课程具有较大的难度: (1)内容丰富,学习量大,给学习带来困难; (2)贯穿全书的动态链表存储结构和递归技术是学习中的重点也是难点; (3)所用到的技术多,而在此之前的各门课程中所介绍的专业性知识又不多,因而加大了学习难度; (4)隐含在各部分的技术和方法丰富,也是学习的重点和难点。 根据《数据结构课程》课程本身的技术特性,设置《数据结构课程实验》实践环节十分重要。通过实验实践内容的训练,突出构造性思维训练的特征, 目的是提高学生组织数据及编写大型程序的能力。实验学时为18。 二、《数据结构课程实验》的目的和要求 不少学生在解答习题尤其是算法设计题时,觉得无从下手,做起来特别费劲。实验中的内容和教科书的内容是密切相关的,解决题目要求所需的各种技术大多可从教科书中找到,只不过其出现的形式呈多样化,因此需要仔细体会,在反复实践的过程中才能掌握。 为了帮助学生更好地学习本课程,理解和掌握算法设计所需的技术,为整个专业学习打好基础,要求运用所学知识,上机解决一些典型问题,通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握所用到的一些技术。数据结构中稍微复杂一些的算法设计中可能同时要用到多种技术和方法,如算法设计的构思方法,动态链表,算法的编码,递归技术,与特定问题相关的技术等,要求重点掌握线性链表、二叉树和树、图结构、数组结构相关算法的设计。在掌握基本算法的基础上,掌握分析、解决实际问题的能力。 三、《数据结构课程实验》内容 课程实验共18学时,要求完成以下六个题目: 实习一约瑟夫环问题(2学时)

数据结构课程实验指导书

数据结构实验指导书 一、实验目的 《数据结构》是计算机学科一门重要的专业基础课程,也是计算机学科的一门核心课程。本课程较为系统地论述了软件设计中常用的数据结构以及相应的存储结构与实现算法,并做了相应的性能分析和比较,课程内容丰富,理论系统。本课程的学习将为后续课程的学习以及软件设计水平的提高打下良好的基础。 由于以下原因,使得掌握这门课程具有较大的难度: 1)理论艰深,方法灵活,给学习带来困难; 2)内容丰富,涉及的知识较多,学习有一定的难度; 3)侧重于知识的实际应用,要求学生有较好的思维以及较强的分析和解决问题的能力,因而加大了学习的难度; 根据《数据结构》课程本身的特性,通过实验实践内容的训练,突出构造性思维训练的特征,目的是提高学生分析问题,组织数据及设计大型软件的能力。 课程上机实验的目的,不仅仅是验证教材和讲课的内容,检查自己所编的程序是否正确,课程安排的上机实验的目的可以概括为如下几个方面: (1)加深对课堂讲授内容的理解 实验是对学生的一种全面综合训练。是与课堂听讲、自学和练习相辅相成的必不可少的一个教学环节。通常,实验题中的问题比平时的习题复杂得多,也更接近实际。实验着眼于原理与应用的结合点,使学生学会如何把书上学到的知识用于解决实际问题,培养软件工作所需要的动手能力;另一方面,能使书上的知识变" 活" ,起到深化理解和灵活掌握教学内容的目的。 不少学生在解答习题尤其是算法设计时,觉得无从下手。实验中的内容和教科书的内容是密切相关的,解决题目要求所需的各种技术大多可从教科书中找到,只不过其出

现的形式呈多样化,因此需要仔细体会,在反复实践的过程中才能掌握。 (2) 培养学生软件设计的综合能力 平时的练习较偏重于如何编写功能单一的" 小" 算法,而实验题是软件设计的综合训练,包括问题分析、总体结构设计、用户界面设计、程序设计基本技能和技巧,多人合作,以至一整套软件工作规范的训练和科学作风的培养。 通过实验使学生不仅能够深化理解教学内容,进一步提高灵活运用数据结构、算法和程序设计技术的能力,而且可以在需求分析、总体结构设计、算法设计、程序设计、上机操作及程序调试等基本技能方面受到综合训练。实验着眼于原理与应用的结合点,使学生学会如何把书本上和课堂上学到的知识用于解决实际问题,从而培养计算机软件工作所需要的动手能力。 (3) 熟悉程序开发环境,学习上机调试程序一个程序从编辑,编译,连接到运行,都要在一定的外部操作环境下才能进行。所谓" 环境" 就是所用的计算机系统硬件,软件条件,只有学会使用这些环境,才能进行 程序开发工作。通过上机实验,熟练地掌握程序的开发环境,为以后真正编写计算机程序解决实际问题打下基础。同时,在今后遇到其它开发环境时就会触类旁通,很快掌握新系统的使用。 完成程序的编写,决不意味着万事大吉。你认为万无一失的程序,实际上机运行时可能不断出现麻烦。如编译程序检测出一大堆语法错误。有时程序本身不存在语法错误,也能够顺利运行,但是运行结果显然是错误的。开发环境所提供的编译系统无法发现这种程序逻辑错误,只能靠自己的上机经验分析判断错误所在。程序的调试是一个技巧性很强的工作,尽快掌握程序调试方法是非常重要的。分析问题,选择算法,编好程序,只能说完成一半工作,另一半工作就是调试程序,运行程序并得到正确结果。 二、实验要求 常用的软件开发方法,是将软件开发过程划分为分析、设计、实现和维护四个阶段。虽然数据结构课程中的实验题目的远不如从实际问题中的复杂程度度高,但为了培养一个软件工作者所应具备的科学工作的方法和作风,也应遵循以下五个步骤来完成实验题目: 1) 问题分析和任务定义 在进行设计之前,首先应该充分地分析和理解问题,明确问题要求做什么?限制条件是什么。本步骤强调的是做什么?而不是怎么做。对问题的描述应避开算法和所涉及的数据类型,而是对所需完成的任务作出明确的回答。例如:输入数据的类型、值的范围以及输入的

(完整word版)数据结构课程设计实验报告

设计题目:一 单位员工通讯录管理系统 一、题目要求 为某个单位建立一个员工通讯录管理系统,可以方便查询每一个员工的办公室电话、手机号、及电子邮箱。其功能包括通讯录链表的建立、员工通讯信息的查询、修改、插入与删除、以及整个通讯录表的输出。二、概要设计 本程序通过建立通讯录链表,对员工信息进行记录,并建立一个系统的联系。 三、主要代码及分析 这里面关于链表的主要的操作有插入,查询,删除。则这里只列出这几项的主代码。 1、通过建立通讯录结构体,对信息进行存储,建立链表,建立信息之间 的联系。 typedef struct { }DataType;结构体来存储通讯录中的基本信息 typedef struct node { DataType data; /*结点的数据域*/ struct node *next; /*结点的指针域*/ }ListNode,*LinkList; 2、信息插入操作,将信息查到链表的后面。 void ListInsert(LinkList list){ //信息插入 ListNode *w; w=list->next; while(w->next!=NULL) { w=w->next; } ListNode *u=new ListNode; u->next=NULL; cout<<"员工编号:";cin>>u->data.num; cout<<"员工姓名:";cin>>u->https://www.doczj.com/doc/3e18033202.html,; cout<<"手机号码:";cin>>u->data.call; cout<<"员工邮箱:";cin>>u->data.email; cout<<"办公室电话号码:";cin>>u->data.phone; w->next=u;w=w->next; }

数据结构实验指导书2014(1)

《数据结构》实验指导书 专业:____________班级:_______________组序:_____________ 学号:______________姓名:_______________ 中国矿业大学管理学院 2014 年9 月

上篇程序设计基础 实验一 Java编程环境 【实验目的】 1.掌握下载Java sdk软件包、Eclipse软件的安装和使用方法 2.掌握设置Java程序运行环境的方法 3.掌握编写与运行Java程序的方法 4.了解Java语言的概貌 【实验内容】 一 JDK下载与安装 1. 下载JDK 为了建立基于SDK的Java运行环境,需要先下载免费SDK软件包。SDK包含了一整套开发工具,其中包含对编程最有用的是Java编译器、Applet查看器和Java解释器。下载链接 https://www.doczj.com/doc/3e18033202.html,。 2.安装SDK 运行下载的JDK软件包,在安装过程中可以设置安装路径及选择组件,默认的组件选择是全部安装,安装成功后,其中bin文件夹中包含编译器(javac.exe)、解释器(java.exe)、Applet查看器(appletviewer.exe)等可执行文件,lib文件夹中包含了所有的类库以便开发Java程序使用,demo文件夹中包含开源代码程序实例。 安装成功后,文件和子目录结构如图1所示。其中bin文件夹中包含编译器(javac.exe)、解释器(java.exe)、Applet查看器(appletviewer.exe)等可执行文件,lib文件夹中包含了所有的类库以便开发Java程序使用,sample文件夹包含开源代码程序实例,src压缩文件中包含类库开源代码。 图1 二.设置环境变量

数据结构实验报告

数据结构实验报告 一.题目要求 1)编程实现二叉排序树,包括生成、插入,删除; 2)对二叉排序树进行先根、中根、和后根非递归遍历; 3)每次对树的修改操作和遍历操作的显示结果都需要在屏幕上用树的形状表示出来。 4)分别用二叉排序树和数组去存储一个班(50人以上)的成员信息(至少包括学号、姓名、成绩3项),对比查找效率,并说明在什么情况下二叉排序树效率高,为什么? 二.解决方案 对于前三个题目要求,我们用一个程序实现代码如下 #include #include #include #include "Stack.h"//栈的头文件,没有用上 typedefintElemType; //数据类型 typedefint Status; //返回值类型 //定义二叉树结构 typedefstructBiTNode{ ElemType data; //数据域 structBiTNode *lChild, *rChild;//左右子树域 }BiTNode, *BiTree; intInsertBST(BiTree&T,int key){//插入二叉树函数 if(T==NULL) { T = (BiTree)malloc(sizeof(BiTNode)); T->data=key; T->lChild=T->rChild=NULL; return 1; } else if(keydata){ InsertBST(T->lChild,key); } else if(key>T->data){ InsertBST(T->rChild,key); } else return 0; } BiTreeCreateBST(int a[],int n){//创建二叉树函数 BiTreebst=NULL; inti=0; while(i

实验指导-数据结构B教案资料

实验指导-数据结构B

附录综合实验 1、实验目的 本课程的目标之一是使得学生学会如何从问题出发,分析数据,构造求解问题的数据结构和算法,培养学生进行较复杂程序设计的能力。本课程实践性较强,为实现课程目标,要求学生完成一定数量的上机实验。从而一方面使得学生加深对课内所学的各种数据的逻辑结构、存储表示和运算的方法等基本内容的理解,学习如何运用所学的数据结构和算法知识解决应用问题的方法;另一方面,在程序设计方法、C语言编程环境以及程序的调试和测试等方面得到必要的训练。 2、实验基本要求: 1)学习使用自顶向下的分析方法,分析问题空间中存在哪些模块,明确这些模块之间的关系。 2)使用结构化的系统设计方法,将系统中存在的各个模块合理组织成层次结构,并明确定义各个结构体。确定模块的主要数据结构和接口。 3)熟练使用C语言环境来实现或重用模块,从而实现系统的层次结构。模块的实现包括结构体的定义和函数的实现。 4)学会利用数据结构所学知识设计结构清晰的算法和程序,并会分析所设计的算法的时间和空间复杂度。 5)所有的算法和实现均使用C语言进行描述,实验结束写出实验报告。

3、实验项目与内容: 1、线性表的基本运算及多项式的算术运算 内容:实现顺序表和单链表的基本运算,多项式的加法和乘法算术运算。 要求:能够正确演示线性表的查找、插入、删除运算。实现多项式的加法和乘法运算操作。 2、二叉树的基本操作及哈夫曼编码译码系统的实现 内容:创建一棵二叉树,实现先序、中序和后序遍历一棵二叉树,计算二叉树结点个数等操作。哈夫曼编码/译码系统。 要求:能成功演示二叉树的有关运算,实现哈夫曼编码/译码的功能,运算完毕后能成功释放二叉树所有结点占用的系统内存。 3、图的基本运算及智能交通中的最佳路径选择问题 内容:在邻接矩阵和邻接表两种不同存储结构上实现图的基本运算的算法,实现图的深度和宽度优先遍历算法,解决智能交通中的路径选择问题。设有n 个地点,编号为0~n-1,m条路径的起点、终点和代价由用户输入提供,寻找最佳路径方案(例如花费时间最少、路径长度最短、交通费用最小等,任选其一即可)。 要求:设计主函数,测试上述运算。 4、各种内排序算法的实现及性能比较 内容:验证教材的各种内排序算法。分析各种排序算法的时间复杂度。 要求:使用随机数产生器产生较大规模数据集合,运行上述各种排序算法,使用系统时钟测量各算法所需的实际时间,并进行比较。

数据结构课程设计实验报告

《空间数据结构基础》 课程实习报告(测绘10级) 姓名 班级 学号 环境与测绘学院

1C++面向对象程序设计基础 【实验简介】学会用算法语言C++描述抽象数据类型,使用模板建立数据结构。理解数据结构的组成分为两部分,第一部分是数据集(数据元素),第二部分是在此数据集上的操作。从面向对象的观点看,这两部分代表了对象的属性和方法。掌握用C++描述数据结构的基本方法,即通过建立类来描述抽象数据类型。类的数据成员提供对象属性,成员函数提供操作方法,方法是公共接口,用户通过调用方法实现对属性的访问。 【实验内容】 1.定义三维空间的坐标点TPoint 2.描述三维空间的球TBall,实现其主要操作(如计算体积和表面积,输出空间坐标 等)。 【主要代码】 头文件: TPoint.h: #ifndef TPOINT_H #define TPOINT_H #include using namespace std; class TPoint { public: TPoint(double xx,double yy,double zz):x(xx),y(yy),z(zz){} TPoint(TPoint &TP):x(TP.x),y(TP.y),z(TP.z){} double getX()const{return x;}//取x坐标值 double getY()const{return y;}//取y坐标值 double getZ()const{return z;}//取z坐标值 void DisplayTP() const {cout<<"("<

《数据结构》实验指导书

《数据结构》实验指导书 实验类别:课内实验实验课程名称:数据结构 实验室名称:软件工程实验室实验课程编号:N02070601 总学时:64 学分: 4 适用专业:计算机科学与技术、网络工程、物联网工程、数字媒体专业 先修课程:计算机科学导论、离散数学 实验在教学培养计划中地位、作用: 数据结构是计算机软件相关专业的主干课程,也是计算机软硬件专业的重要基础课程。数据结构课程实验的目的是通过实验掌握数据结构的基本理论和算法,并运用它们来解决实际问题。数据结构课程实验是提高学生动手能力的重要的实践教学环节,对于培养学生的基本素质以及掌握程序设计的基本技能并养成良好的程序设计习惯方面发挥重要的作用。 实验一线性表的应用(2学时) 1、实验目的 通过本实验,掌握线性表链式存储结构的基本原理和基本运算以及在实际问题中的应用。 2、实验内容 建立某班学生的通讯录,要求用链表存储。 具体功能包括: (1)可以实现插入一个同学的通讯录记录; (2)能够删除某位同学的通讯录; (3)对通讯录打印输出。 3、实验要求 (1)定义通讯录内容的结构体; (2)建立存储通讯录的链表结构并初始化; (3)建立主函数: 1)建立录入函数(返回主界面) 2)建立插入函数(返回主界面) 3)建立删除函数(返回主界面) 4)建立输出和打印函数(返回主界面) I)通过循环对所有成员记录输出 II)输出指定姓名的某个同学的通讯录记录 5)退出 实验二树的应用(2学时) 1、实验目的 通过本实验掌握二叉排序树的建立和排序算法,了解二叉排序树在实际中的应用并熟练运用二叉排序树解决实际问题。 2、实验内容 建立一个由多种化妆品品牌价格组成的二叉排序树,并按照价格从低到高的顺序 打印输出。 3、实验要求 (1)创建化妆品信息的结构体; (2)定义二叉排序树链表的结点结构; (3)依次输入各类化妆品品牌的价格并按二叉排序树的要求创建一个二叉排序树链表;(4)对二叉排序树进行中序遍历输出,打印按价格从低到高顺序排列的化妆品品牌信息。 实验三图的应用(2学时)

数据结构实验报告全集

数据结构实验报告全集 实验一线性表基本操作和简单程序 1.实验目的 (1)掌握使用Visual C++ 6.0上机调试程序的基本方法; (2)掌握线性表的基本操作:初始化、插入、删除、取数据元素等运算在顺序存储结构和链表存储结构上的程序设计方法。 2.实验要求 (1)认真阅读和掌握和本实验相关的教材内容。 (2)认真阅读和掌握本章相关内容的程序。 (3)上机运行程序。 (4)保存和打印出程序的运行结果,并结合程序进行分析。 (5)按照你对线性表的操作需要,重新改写主程序并运行,打印出文件清单和运行结果 实验代码: 1)头文件模块 #include iostream.h>//头文件 #include//库头文件-----动态分配内存空间 typedef int elemtype;//定义数据域的类型 typedef struct linknode//定义结点类型 { elemtype data;//定义数据域 struct linknode *next;//定义结点指针 }nodetype; 2)创建单链表

nodetype *create()//建立单链表,由用户输入各结点data域之值,//以0表示输入结束 { elemtype d;//定义数据元素d nodetype *h=NULL,*s,*t;//定义结点指针 int i=1; cout<<"建立一个单链表"<> d; if(d==0) break;//以0表示输入结束 if(i==1)//建立第一个结点 { h=(nodetype*)malloc(sizeof(nodetype));//表示指针h h->data=d;h->next=NULL;t=h;//h是头指针 } else//建立其余结点 { s=(nodetype*) malloc(sizeof(nodetype)); s->data=d;s->next=NULL;t->next=s; t=s;//t始终指向生成的单链表的最后一个节点

《数据结构》实验指导

《数据结构》实验指导 (计算机信息大类适用) 实验报告至少包含以下内容: 实验名称 实验目的与要求: 实验内容与步骤(需要你进行细化): 实验结果(若顺利完成,可简单说明;若实验过程中遇到问题,也请在此说明) 收获与体会(根据个人的实际情况进行说明,不得空缺) 实验1 大整数加法(8课时) 目的与要求: 1、线性表的链式存储结构及其基本运算、实现方法和技术的训练。 2、单链表的简单应用训练。 3、熟悉标准模版库STL中的链表相关的知识。 内容与步骤: 1、编程实现单链表的基本操作。 2、利用单链表存储大整数(大整数的位数不限)。 3、利用单链表实现两个大整数的相加运算。 4、进行测试,完成HLOJ(https://www.doczj.com/doc/3e18033202.html,) 9515 02-线性表大整数A+B。 5、用STL之list完成上面的任务。 6、尝试完成HLOJ 9516 02-线性表大菲波数。 实验2 栈序列匹配(8课时) 目的与要求 1、栈的顺序存储结构及其基本运算、实现方法和技术的训练。 2、栈的简单应用训练。 3、熟悉标准模版库STL中的栈相关的知识。 内容与步骤: 1、编程实现顺序栈及其基本操作。 2、对于给出的入栈序列和出栈序列,判断2个序列是否相容。即:能否利用栈 将入栈序列转换为出栈序列。 3、进行测试,完成HLOJ 9525 03-栈与队列栈序列匹配。 4、用STL之stack完成上面的任务。 5、尝试完成HLOJ 9522 03-栈与队列胡同。

实验3 二叉排序树(8课时) 目的与要求 1、二叉树的链式存储结构及其基本运算、实现方法和技术的训练。 2、二叉树的遍历方法的训练。 3、二叉树的简单应用。 内容与步骤: 1、编程实现采用链式存储结构的二叉排序树。 2、实现插入节点的操作。 3、实现查找节点的操作(若查找失败,则将新节点插入二叉排序树)。 4、利用遍历算法对该二叉排序树中结点的关键字按递增和递减顺序输出,完成 HLOJ 9576 07-查找二叉排序树。 5、尝试利用二叉排序树完成HLOJ 9580 07-查找Let the Balloon Rise。 实验4 最小生成树(8课时) 目的与要求 1、图的邻接矩阵存储结构及其相关运算的训练。 2、掌握最小生成树的概念。 3、利用Prim算法求解最小生成树。 实验背景: 给定一个地区的n个城市间的距离网,用Prim算法建立最小生成树,并计算得到的最小生成树的代价。要求显示得到的最小生成树中包括了哪些城市间的道路,并显示得到的最小生成树的代价。 内容与步骤: 1、建立采用邻接矩阵的图。 2、编程实现Prim算法,求解最小生成树的代价。 3、尝试利用Prim算法完成:HLOJ 9561 06-图最小生成树。

数据结构实验报告模板

2009级数据结构实验报告 实验名称:约瑟夫问题 学生姓名:李凯 班级:21班 班内序号:06 学号:09210609 日期:2010年11月5日 1.实验要求 1)功能描述:有n个人围城一个圆圈,给任意一个正整数m,从第一个人开始依次报数,数到m时则第m个人出列,重复进行,直到所有人均出列为止。请输出n个人的出列顺序。 2)输入描述:从源文件中读取。 输出描述:依次从显示屏上输出出列顺序。 2. 程序分析 1)存储结构的选择 单循环链表 2)链表的ADT定义 ADT List{ 数据对象:D={a i|a i∈ElemSet,i=1,2,3,…n,n≧0} 数据关系:R={< a i-1, a i>| a i-1 ,a i∈D,i=1,2,3,4….,n} 基本操作: ListInit(&L);//构造一个空的单链表表L ListEmpty(L); //判断单链表L是否是空表,若是,则返回1,否则返回0. ListLength(L); //求单链表L的长度 GetElem(L,i);//返回链表L中第i个数据元素的值; ListSort(LinkList&List) //单链表排序 ListClear(&L); //将单链表L中的所有元素删除,使单链表变为空表 ListDestroy(&L);//将单链表销毁 }ADT List 其他函数: 主函数; 结点类; 约瑟夫函数 2.1 存储结构

[内容要求] 1、存储结构:顺序表、单链表或其他存储结构,需要画示意图,可参考书上P59 页图2-9 2.2 关键算法分析 结点类: template class CirList;//声明单链表类 template class ListNode{//结点类定义; friend class CirList;//声明链表类LinkList为友元类; Type data;//结点的数据域; ListNode*next;//结点的指针域; public: ListNode():next(NULL){}//默认构造函数; ListNode(const Type &e):data(e),next(NULL){}//构造函数 Type & GetNodeData(){return data;}//返回结点的数据值; ListNode*GetNodePtr(){return next;}//返回结点的指针域的值; void SetNodeData(Type&e){data=e;}//设置结点的数据值; void SetNodePtr(ListNode*ptr){next=ptr;} //设置结点的指针值; }; 单循环链表类: templateclass CirList { ListNode*head;//循环链表头指针 public: CirList(){head=new ListNode();head->next=head;}//构造函数,建立带头节点的空循环链表 ~CirList(){CirListClear();delete head;}//析构函数,删除循环链表 void Clear();//将线性链表置为空表 void AddElem(Type &e);//添加元素 ListNode *GetElem(int i)const;//返回单链表第i个结点的地址 void CirListClear();//将循环链表置为空表 int Length()const;//求线性链表的长度 ListNode*ListNextElem(ListNode*p=NULL);//返回循环链表p指针指向节点的直接后继,若不输入参数,则返回头指针 ListNode*CirListRemove(ListNode*p);//在循环链表中删除p指针指向节点的直接后继,且将其地址通过函数值返回 CirList&operator=(CirList&List);//重载赋

数据结构实验报告-答案

数据结构(C语言版) 实验报告

专业班级学号姓名 实验1 实验题目:单链表的插入和删除 实验目的: 了解和掌握线性表的逻辑结构和链式存储结构,掌握单链表的基本算法及相关的时间性能分析。 实验要求: 建立一个数据域定义为字符串的单链表,在链表中不允许有重复的字符串;根据输入的字符串,先找到相应的结点,后删除之。 实验主要步骤: 1、分析、理解给出的示例程序。 2、调试程序,并设计输入数据(如:bat,cat,eat,fat,hat,jat,lat,mat,#),测 试程序的如下功能:不允许重复字符串的插入;根据输入的字符串,找到相应的结点并删除。 3、修改程序: (1)增加插入结点的功能。 (2)将建立链表的方法改为头插入法。 程序代码: #include"" #include"" #include"" #include"" typedef struct node . . 示意图:

head head head 心得体会: 本次实验使我们对链表的实质了解更加明确了,对链表的一些基本操作也更加熟练了。另外实验指导书上给出的代码是有一些问题的,这使我们认识到实验过程中不能想当然的直接编译执行,应当在阅读并完全理解代码的基础上再执行,这才是实验的意义所在。

实验2 实验题目:二叉树操作设计和实现 实验目的: 掌握二叉树的定义、性质及存储方式,各种遍历算法。 实验要求: 采用二叉树链表作为存储结构,完成二叉树的建立,先序、中序和后序以及按层次遍历 的操作,求所有叶子及结点总数的操作。 实验主要步骤: 1、分析、理解程序。 2、调试程序,设计一棵二叉树,输入完全二叉树的先序序列,用#代表虚结点(空指针), 如ABD###CE##F##,建立二叉树,求出先序、中序和后序以及按层次遍历序列,求 所有叶子及结点总数。 实验代码 #include"" #include"" #include"" #define Max 20 ertex=a; irstedge=NULL; irstedge; G->adjlist[i].firstedge=s; irstedge; R[i] 留在原位

数据结构实验指导书

《数据结构与算法》实验指导书马晓波秦俊平刘利民编 内蒙古工业大学信息工程学院计算机系 2008年9月1日

《数据结构与算法》实验教学大纲 三、实验目的、内容与要求 实验一线性表的创建与访问算法设计(4学时) (一)实验目的 数据结构于算法实验是计算机类本科学生计算机软件知识重要的实验环节,它将使学生从实践上学会用高级语言程序设计、实现复杂的数据结构,为大型软件设计奠定基础。本实验以某种线性表的创建与访问算法设计作为实验内容,举一反三,全面、深刻掌握线性结构的实现方法,培养解决问题的能力。 (二)实验内容 1、编写生成线性表的函数,线性表的元素从键盘输入; 2、编写在线性表中插入元素的函数; 3、编写在线性表中删除元素的函数; 4、编写输出线性表的函数; 5、编写主函数,调用以上各函数,以便能观察出原线性表以及作了插入或删除后线性表的屏 幕输出。 方案一采用顺序存储结构实现线性表。 方案二采用单链表结构实现线性表。 (三)实验要求 1、掌握线性结构的机器内表示; 2、掌握线性结构之上的算法设计与实现; 3、列表对比分析两种数据结构的相应操作的时间复杂度、空间复杂度,阐明产生差异的原因。 实验二二叉树的创建与访问算法设计(4学时) (一)实验目的 本实验以二叉树的创建与访问算法设计作为实验内容,掌握树型结构的实现方法,培养解决负责问题的能力。 (二)实验内容 1、编写生成二叉树的函数,二叉树的元素从键盘输入; 2、编写在二叉树中插入元素的函数;

3、编写在二叉树中删除元素的函数; 4、编写遍历并输出二叉树的函数。 方案一采用递归算法实现二叉树遍历算法。 方案二采用非递归算法实现二叉树遍历算法。 (三)实验要求 1、掌握树型结构的机器内表示; 2、掌握树型结构之上的算法设计与实现; 3、列表对比分析两种数据结构的相应操作的时间复杂度、空间复杂度,阐明产生差异的原因。 实验三图的创建与访问算法设计(4学时) (一)实验目的 本实验以图的创建与访问算法设计作为实验内容,掌握图型结构的实现方法,培养解决负责问题的能力。 (二)实验内容 1、编写生成图的函数,图的元素从文件输入; 2、编写在图中插入元素的函数; 3、编写在图中删除元素的函数; 4、编写遍历并输出图的函数。 方案一采用BFS深度优先搜索算法实现图的遍历。 方案二采用DFS广度优先搜索算法实现图的遍历。 (三)实验要求 1、掌握图结构的机器内表示; 2、掌握图型结构之上的算法设计与实现; 3、列表对比分析两种数据结构的相应操作的时间复杂度、空间复杂度,阐明产生差异的原因。 四、考核方式 1、学生课前要认真阅读实验教材,理解实验内容与相关理论知识的关系,并完成预习报告; 2、实验课上教师讲解实验难点及需要注意的问题,并对实验数据签字; 3、学生课后要完成实验报告,并将签字的实验数据与实验报告交给带课教师; 4、教师根据学生实验情况,及时对实验内容和方法进行必要的调整和改进。 根据实验预习报告、实验课考勤、课上实验能力与实验效果、实验报告的完成情况确定最终的实验成绩,实验成绩占课程总成绩的10%。 五、建议教材与教学参考书 1、建议教材 [1]严蔚敏、吴伟民主编. 数据结构(C语言版). 北京:清华大学出版社,1997 2、教学参考书 [1] 严蔚敏、吴伟民主编. 数据结构题集(C语言版). 北京:清华大学出版社,1997 [2] 李春葆编. 数据结构习题与解析. 北京:清华大学出版社,2002 [3] 刘振鹏主编. 数据结构. 北京:中国铁道出版社,2003 [4] 许卓群编.数据结构.北京:中央电大出版社, 2001 [5] Anany Levitin著.潘彦译.算法设计与分析.北京:清华大学出版社, 2004

数据结构实验指导书及答案(徐州工程学院)

《数据结构实验》实验指导书及答案

信电工程学院计算机科学和技术教研室编 2011.12 数据结构实验所有代码整理 作者郑涛 声明:在这里我整理了数据结构实验的所有代码,希望能对大家的数据结构实验的考试有所帮助,大家可以有选择地浏览,特别针对一些重点知识需要加强记忆(ps:重点知识最好让孙天凯给出),希望大家能够在数据结构实验的考试中取得令人满意的成绩,如果有做的 不好的地方请大家谅解并欢迎予以指正。 实验一熟悉编程环境 实验预备知识: 1.熟悉本课程的语言编译环境(TC或VC),能够用C语言编写完整的程序,并能够发现和改正错误。 2.能够灵活的编写C程序,并能够熟练输入C程序。 一、实验目的 1.熟悉C语言编译环境,掌握C程序的编写、编译、运行和调试过程。 2.能够熟练的将C程序存储到指定位置。 二、实验环境 ⒈硬件:每个学生需配备计算机一台。 ⒉软件:Windows操作系统+Turbo C; 三、实验要求 1.将实验中每个功能用一个函数实现。 2.每个输入前要有输入提示(如:请输入2个整数当中用空格分割:),每个输出数据都要求有内容说明(如:280和100的和是:380。)。 3.函数名称和变量名称等用英文或英文简写(每个单词第一个字母大写)形式说明。 四、实验内容 1.在自己的U盘中建立“姓名+学号”文件夹,并在该文件夹中创建“实验1”文件夹(以后每次实验分别创建对应的文件夹),本次实验的所有程序和数据都要求存储到本文件夹中(以后实验都按照本次要求)。

2.编写一个输入某个学生10门课程成绩的函数(10门课程成绩放到结构体数组中,结构体包括:课程编号,课程名称,课程成绩)。 3.编写一个求10门成绩中最高成绩的函数,输出最高成绩和对应的课程名称,如果有多个最高成绩,则每个最高成绩均输出。 4.编写一个求10门成绩平均成绩的函数。 5.编写函数求出比平均成绩高的所有课程及成绩。 #include #include struct subject { int subject_id; char subject_name[20]; double subject_grades; }; struct subject sub[10]; void input() { int i; printf("please input:\n"); for(i=0;i<10;i++) { scanf("%d %s %lf",&sub[i].subject_id,&sub[i].subject_name,&sub[i].subject_g rades); } printf("you just input:\n"); for(i=0;i<3;i++) { printf("%d %s %lf\n",sub[i].subject_id,sub[i].subject_name,sub[i].subject_g rades); } } void subject_max() { int i,flag; double max=sub[0].subject_grades; for(i=0;i<10;i++) { if(sub[i].subject_grades>max)

《数据结构》实验指导书

一、实验目的: 1.掌握线性表的链式存储结构。 2.熟练地利用链式存储结构实现线性表的基本操作。 3.能熟练地掌握链式存储结构中算法的实现。 二、实验内容: 1.用头插法或尾插法建立带头结点的单链表。 2.实现单链表上的插入、删除、查找、修改、计数、输出等基本操作。 三、实验要求: 1. 根据实验内容编写程序,上机调试、得出正确的运行程序。 2. 写出实验报告(包括源程序和运行结果)。 四、实验学时:4学时 五、实验步骤: 1.进入编程环境,建立一新文件; 2. 参考以下相关内容,编写程序,观察并分析输出结果。 ①定义单链表的数据类型,然后将头插法和尾插法、插入、删除、查找、修改、计数、输出等基本操作都定义成子函数的形式,最后在主函数中调用它,并将每一种操作前后的结果输出,以查看每一种操作的效果。 ②部分参考程序(略) 六、实践部分 选作实验可以从以下两个实验中任选一个: 1 试设计一元多项式相加(链式存储)的加法运算。 A(X)=7+3X+9X8+5X9 B(X)=8X+22X7-9X8 1.建立一元多项式; 2.输出相应的一元多项式; 3.相加操作的实现。 2 约瑟夫生死环 利用单循环链表存储结构,解决约瑟夫(Josephus)环问题。即:将编号是1,2,…,n(n>0)的n个人按照顺时针方向围坐一圈,每人持有一个正整数密码。开始时任选一个正整数作为报数上限值m,从某个人开始顺时针方向自1开始顺序报数,报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有的人全部出列为止。令n最大值取30。设计一个程序,求出出列顺序,并输出结果。

数据结构实验指导书(C版)

数据结构实验指导书(C语言版) 2017年9月

目录 1、顺序表的实现 (1) 2、链栈的实现 (3) 3、前序遍历二叉树 (5) 4、图的深度优先遍历算法 (7) 5、散列查找 (9)

1、顺序表的实现 1. 实验目的 ⑴掌握线性表的顺序存储结构; ⑵验证顺序表及其基本操作的实现; ⑶理解算法与程序的关系,能够将顺序表算法转换为对应的程序。 2. 实验内容 ⑴建立含有若干个元素的顺序表; ⑵对已建立的顺序表实现插入、删除、查找等基本操作。 3. 实现提示 定义顺序表的数据类型——顺序表结构体SeqList,在SeqList基础上实现题目要求的插入、删除、查找等基本操作,为便于查看操作结果,设计一个输出函数依次输出顺序表的元素。简单起见,本实验假定线性表的数据元素为int型,要求学生: (1)将实验程序调试通过后,用模板类改写; (2)加入求线性表的长度等基本操作; (3)重新给定测试数据,验证抛出异常机制。 4. 实验程序 在编程环境下新建一个工程“顺序表验证实验”,并新建相应文件,文件包括顺序表结构体SeqList的定义,范例程序如下: #define MaxSize 100 /*假设顺序表最多存放100个元素*/ typedef int DataType; /*定义线性表的数据类型,假设为int型*/ typedef struct { DataType data[MaxSize]; /*存放数据元素的数组*/ int length; /*线性表的长度*/ } SeqList; 文件包括建立顺序表、遍历顺序表、按值查找、插入操作、删除操作成员函数的定义,范例程序如下: int CreatList(SeqList *L, DataType a[ ], int n) { if (n > MaxSize) {printf("顺序表的空间不够,无法建立顺序表\n"); return 0;} for (int i = 0; i < n; i++) L->data[i] = a[i]; L->length = n; return 1; }

相关主题
文本预览
相关文档 最新文档