朱颢东2015-2016学年第二学期《数据结构》实验指导书(修订版)-1

更新时间:2024-06-17 00:47:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

《数据结构》 实验指导书

郑州轻工业学院 2016.02.20

目 录

前 言 ................................................................................ 3 实验01 顺序表的基本操作........................................... 5 实验02 单链表的基本操作......................................... 13 实验03 栈的基本操作 ................................................. 21 实验04 队列的基本操作 ............................................. 23 实验05 二叉树的基本操作......................................... 25 实验06 哈夫曼编码 ..................................................... 26 实验07 图的两种存储和遍历 .................................... 28 实验08 最小生成树、拓扑排序和最短路径 ............ 31 实验09 二叉排序树的基本操作 ................................ 33 实验10 哈希表的生成 ................................................. 34 实验11 常用的内部排序算法 ..................................... 35 附:实验报告模板 ........................ 错误!未定义书签。

2

前 言

《数据结构》是计算机相关专业的一门核心基础课程,是编译原理、操作系统、数据库系统及其它系统程序和大型应用程序开发的重要基础,也是很多高校考研专业课之一。它主要介绍线性结构、树型结构、图状结构三种逻辑结构的特点和在计算机内的存储方法,并在此基础上介绍一些典型算法及其时、空效率分析。这门课程的主要任务是研究数据的逻辑关系以及这种逻辑关系在计算机中的表示、存储和运算,培养学生能够设计有效表达和简化算法的数据结构,从而提高其程序设计能力。通过学习,要求学生能够掌握各种数据结构的特点、存储表示和典型算法的设计思想及程序实现,能够根据实际问题选取合适的数据表达和存储方案,设计出简洁、高效、实用的算法,为后续课程的学习及软件开发打下良好的基础。另外本课程的学习过程也是进行复杂程序设计的训练过程,通过算法设计和上机实践的训练,能够培养学生的数据抽象能力和程序设计能力。学习这门课程,习题和实验是两个关键环节。学生理解算法,上机实验是最佳的途径之一。因此,实验环节的好坏是学生能否学好《数据结构》的关键。为了更好地配合学生实验,特编写实验指导书。 一、实验目的

本课程实验主要是为了原理和应用的结合,通过实验一方面使学生更好的理解数据结构的概念和常用的几种数据结构在计算机中的存储和实现的方法,加强学生动手能力;另一方面培养学生从实际问题中抽象出对应的抽象数据类型,进而找到合适的计算机存储方法和算法,为以后课程的学习、大型软件的开发、实际工程问题打下良好的软件开发基础。 二、实验要求

1、每次实验前学生必须根据实验内容认真准备实验程序及调试时所需的输入数据。 2、在指导教师的帮助下能够完成实验内容,得出正确的实验结果。 3、实验结束后总结实验内容、书写实验报告。

4、遵守实验室规章制度、不缺席、按时上、下机。

5、实验学时内必须做数据结构的有关内容,不允许上网聊天或玩游戏,如发现上述现象,取消本次上机资格,平时成绩扣10分。

6、实验报告有一次不合格,扣5分,两次以上不合格者,平时成绩以零分记。 三、实验环境

VC++6.0或其他C++相关的编译环境。 四、说明

1、本实验的所有算法中元素类型应根据实际需要合理选择。

2、实验题目中带*者为较高要求,学生可自选;其余部分为基本内容,应尽量完成(至少完成70%,否则实验不合格)。

3、数据结构是很多高校的硕士研究生入学考试的专业课之一,希望有志于考研的学生能够在

3

学习过程中注意各种算法的理解,以便为考研做一定的准备。

4、好的算法决定了好的程序,要有效地实现算法,就需要设计能够有效表达和简化算法的数据结构,因此数据结构是有效进行程序设计的基础,是每个程序员的必修课。 五、实验报告的书写要求

1、明确实验的目的及要求。 2、记录实验的输入数据和输出结果。 3、说明实验中出现的问题和解决过程。

4、写出实验的体会和实验过程中没能解决的问题。

5、实验程序请构建为多文件程序,每一个算法对应的函数原型声明存放在头文件*.h中,对应的函数实现存放在源文件*.c中;main()函数存放在另一个源文件中,该文件包含头文件*.h即可。 六、成绩考评办法

1、期末考试占70分,闭卷。

2、平时考评占30分。其中实验环节占20分(实验准备、上机、报告、验收等);平时占10分(出勤、作业、测验等)。 七、参考书目

1、《数据结构》(C语言版) 严蔚敏等 清华大学出版社。 2、《数据结构题集》 (C语言版) 严蔚敏等 清华大学出版社。

3、《数据结构与算法分析——C语言描述》,Mark Allen Weiss著,机械工业出版社,2012。

4

实验01 顺序表的基本操作

实验学时:2学时 实验类型:上机

背景知识:顺序表的插入、删除及应用。 目的要求:

1.掌握顺序存储结构的特点。 2.掌握顺序存储结构的常见算法。

实验内容:

编写一个完整的程序,实现顺序表的生成、插入、删除、输出等基本运算。 (1) 建立一个顺序表,含有n个数据元素。 (2) 输出顺序表。

(3) 在顺序表中删除值为x的结点或者删除给定位置i的结点。

(4) 实现把该表中所有奇数排在偶数之前,即表的前面为奇数,后面为偶数。 (5) 输入整型元素序列,利用有序表插入算法建立一个有序表。

(6) *利用算法5建立两个非递减有序表A和B,并把它们合并成一个非递减有序表C。 (7) 在主函数中设计一个简单的菜单,分别测试上述算法。 (8) *综合训练:

利用顺序表实现一个班级学生信息管理(数据录入、插入、删除、排序、查找等)。

实验说明:

1.请构建多文件程序,算法1至算法6对应的函数原型声明存放在头文件SqList.h中,对应的函数实现存放在源文件SqList.c中;main()函数存放在另一个源文件中,该文件包含头文件SqList.h即可。

2.类型定义

#define MAXSIZE 100 //表中元素的最大个数 typedef int ElemType; //元素类型 typedef struct {

ElemType *elem; //线性表 int length; //表的实际长度 int listsize; //当前分配的存储容量 }SqList; //顺序表的类型名

5

3.建立顺序表时可利用随机函数自动产生数据。

注意问题:

1、 插入、删除时元素的移动原因、方向及先后顺序。 2、 理解函数形参与实参的传递关系。

部分源代码: DS.h

#include #include #include #include

#define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0

typedef int Status;

SqList.h

#ifndef SQLIST_H_INCLUDED #define SQLIST_H_INCLUDED

#include \

typedef int ElemType; typedef struct {

ElemType *elem; int length; int listsize; }SqList; void menu();

Status InitList_Sq(SqList &L, int n);/*初始化顺序表*/ Status CreateList_Sq(SqList &L);/*建立顺序表*/ void PrintList_Sq(SqList L);/*输出顺序表*/

Status DeleteList_Sq(SqList &L,int i,ElemType &e);/*删除第i个元素*/ Status DeleteListX_Sq(SqList &L,ElemType x);/*删除值为x的元素*/

6

Status AdjustList_Sq(SqList &L);/*奇数排在偶数之前*/ Status OrderList_sq(SqList &L, int n);/*插入法生成递增有序表*/

void MergeList_Sq(SqList La, SqList Lb, SqList &Lc );/*两个非递减有序表A和B,并把它们合并成一个非递减有序表C*/

#endif // SQLIST_H_INCLUDED

SqList.cpp

#include \

void menu() {

printf(\ 顺序表基本操作\\n\\n\ printf(\建 立 顺 序 表\\n\ printf(\遍 历 顺 序 表\\n\ printf(\删 除 第 i 个 元 素\\n\ printf(\删 除 值 为 x 的 元 素\\n\ printf(\奇 数 排 在 偶 数 之 前\\n\ printf(\插 入 法 生 成 递 增 有 序 表\\n\

printf(\两个非递减有序表La和Lb合并成非递减有序表Lc\\n\ printf(\退 出\\n\\n\}

/*初始化顺序表*/

Status InitList_Sq(SqList &L, int n) {

L.elem=(ElemType*)malloc(n*sizeof(ElemType)); if(!L.elem) exit(OVERFLOW); L.length=0; L.listsize=n; return OK; }

/*建立顺序表*/

Status CreateList_Sq(SqList &L)

7

{

int n, i;

printf(\请输入顺序表长度:\ scanf(\ if(InitList_Sq(L, n)) {

printf(\请输入%d个元素:\ for(i = 0; i < n; i++) {

scanf(\ L.length++; } return OK; } else

return ERROR; }

/*输出顺序表*/

void PrintList_Sq(SqList L) { int i;

printf(\顺序表中元素为:\\n\ for(i = 0; i < L.length; i++) {

printf(\ }

printf(\}

/*删除第i个元素*/

Status DeleteList_Sq(SqList &L,int i,ElemType &e) {

ElemType *p, *q;

if( (i<1) || (i>L.length) ) return ERROR; p = &(L.elem[i-1]); e = *p;

8

q = L.elem+L.length-1;

}

for(++p; p <= q; ++p) *(p-1) = *p; --L.length; return OK;

/*删除值为x的元素,删除成功返回OK,删除失败返回ERROR*/ Status DeleteListX_Sq(SqList &L,ElemType x) { }

/*奇数排在偶数之前*/ Status AdjustList_Sq(SqList &L) {

ElemType *p, *q; int temp;

return OK; }

/*插入法生成递增有序表,有序表生成成功返回OK,失败返回ERROR*/ Status OrderList_sq(SqList &L, int n) {

int i, j, x; /*x表示每次待插入的元素*/ }

/*两个非递减有序表A和B,并把它们合并成一个非递减有序表C*/ void MergeList_Sq(SqList La, SqList Lb, SqList &Lc ) {

ElemType *pa, *pb, *pc, *pa_last, *pb_last; pa = La.elem; pb = Lb.elem;

Lc.listsize = Lc.length = La.length+Lb.length;

pc = Lc.elem = (ElemType *)malloc(Lc.listsize * sizeof(ElemType));

9

ElemType *p, *q;

if (!Lc.elem) exit (OVERFLOW); pa_last = La.elem + La.length - 1; pb_last = Lb.elem + Lb.length - 1; while (pa <= pa_last && pb <= pb_last) {

if (*pa <= *pb) *pc++ = *pa++; else *pc++ = *pb++; }

while(pa <= pa_last) *pc++ = *pa++; while(pb <= pb_last) *pc++ = *pb++; }

main.cpp

#include \int main() {

int choice, n, i, x; SqList L, La, Lb, Lc; while(1) {

menu();

printf(\选择你的操作:\ scanf(\ switch(choice) {

case 1:

if(CreateList_Sq(L))

printf(\顺序表创建成功\\n\ else

printf(\顺序表创建失败\\n\ break; case 2:

PrintList_Sq(L); break; case 3:

printf(\请输入删除元素的位置:\ scanf(\ if(DeleteList_Sq(L, i, x))

10

printf(\合 并 生 成 升 序 链 表\\n\ printf(\分 解 链 表\\n\ printf(\退 出\\n\\n\}

/*初始化空表*/

Status Init_Linklist(LinkList &L) {

L=(LinkList)malloc(sizeof(Lnode)); if(!L) return ERROR; L->next=NULL; return OK;

}

/*尾插法建立单链表*/

Status Creat_Linklist(LinkList &L) { int x;

LinkList p,rear; Init_Linklist(L); rear = L;

printf(\输入-1表示输入结束\\n\ while(scanf(\ {

p = (LinkList)malloc(sizeof(Lnode)); if(!p) return ERROR; p->data = x; rear->next = p; rear = p; }

rear->next = NULL; return OK; }

/*单链表遍历*/

void Disp_Linklist(LinkList L) {

LinkList p;

16

p = L->next; while(p) {

printf(\ p = p->next; }

printf(\}

/*计算单链表长度*/ int length_Linklist(LinkList L) {

int count = 0; /*count表示单链表长度*/ LinkList p;

return count; }

/*单链表逆置*/

void Reverse_Linklist(LinkList L) {

LinkList p, q ; }

/*删除值为偶数的结点*/ void DelEven_Linklist(LinkList L) {

LinkList p, q; }

/*在有序单链表中插入元素,链表仍然有序,插入成功返回OK,插入失败返回ERROR*/ Status Insert_Linklist(LinkList L, int x) { ; }

17

/*创建非递减有序单链表,创建成功返回OK,创建失败返回ERROR*/ Status CreatOrder_Linklist(LinkList &L) { }

/*两个非递减有序单链表La和Lb合并成一个非递增有序链表Lc*/ void MergeDescend_Linklist(LinkList La, LinkList Lb, LinkList &Lc) { }

/*两个非递减有序单链表La和Lb合并成一个非递减有序链表Lc*/ void MergeAscend_Linklist(LinkList La, LinkList Lb, LinkList &Lc) {

LinkList pa, pb, pc; pa = La->next; pb = Lb->next; pc = Lc = La; while(pa && pb) {

if(pa->data <= pb->data) {

pc->next = pa; pc = pa; pa = pa->next; } else {

pc->next = pb; pc = pb; pb = pb->next; } }

pc->next = pa ? pa : pb; free(Lb); }

/*链表La按值分解成两个链表,La全部为奇数,Lb全部为偶数*/ void Split_Linklist(LinkList La, LinkList &Lb) { }

18

main.cpp

#include \int main() {

int choice, length; LinkList L, La, Lb, Lc; while(1) {

menu();

printf(\选择你的操作:\ scanf(\ switch(choice) {

case 1:

if(Creat_Linklist(L))

printf(\单链表创建成功\\n\ else

printf(\单链表创建失败\\n\ break; case 2:

Disp_Linklist(L); break; case 3:

length = length_Linklist(L);

printf(\单链表长度为:%d\\n\ break; case 4:

Reverse_Linklist(L);

printf(\逆置后的链表为:\\n\ Disp_Linklist(L); break; case 5:

DelEven_Linklist(L); printf(\新链表为:\\n\ Disp_Linklist(L); break; case 6:

if(CreatOrder_Linklist(L))

19

{

printf(\值有序链表为:\\n\ Disp_Linklist(L); } else

printf(\单链表创建失败\\n\ break; case 7:

} } }

CreatOrder_Linklist(La); CreatOrder_Linklist(Lb);

MergeDescend_Linklist(La, Lb, Lc);

printf(\合并后的新链表为:\\n\ break; case 8:

CreatOrder_Linklist(La); CreatOrder_Linklist(Lb);

MergeAscend_Linklist(La, Lb, Lc);

printf(\合并后的新链表为:\\n\ break; case 9:

Creat_Linklist(L); Split_Linklist(L, Lb);

printf(\分裂后的新链表为:\\n\ Disp_Linklist(L); Disp_Linklist(Lb); break; case 0: return 0; default:

printf(\输入错误,请重新输入\\n\20

实验06 哈夫曼编码

实验学时:4学时 实验类型:综合型实验

背景知识:二叉树的应用、哈夫曼树。 目的要求:

掌握哈夫曼树和哈夫曼编码的基本思想和算法的程序实现。

实验内容:

(1)修理牧场:农夫要修理牧场的一段栅栏,他测量了栅栏,发现需要N块木头,每块木头长度为整数Li个长度单位,于是他购买了一条很长的、能锯成N块的木头,即该木头的长度是Li的总和。

但是农夫自己没有锯子,请人锯木头的酬金跟这段木头的长度成正比。为简单起见,不妨就设酬金等于所锯木头的长度。例如,要将长度为20的木头锯成长度为8、7和5的三段,第一次锯木头花费20,将木头锯成12和8;第二次锯木头花费12,将长度为12的木头锯成7和5,总花费为32。如果第一次将木头锯成15和5,则第二次锯木头花费15,总花费为35(大于32)。

请编写程序帮助农夫计算将木头锯成N块的最少花费。

首先输入一个正整数N(N≤104),表示要将木头锯成N块。接着给出N个正整数Li(Li≤50),表示每段木块的长度。输出一个整数,即将木头锯成N块的最少花费。 例如: 输入:

8

4 5 1 2 1 3 1 1 输出:

49

*(2)压缩软件:

给定一篇文章,只含有英文大小写字母和空格,以.txt格式存储,统计该文件中各种字符的频率,对各字符进行Huffman编码,将该文件翻译成Huffman编码文件,再将Huffman编码文件翻译成源文件。

实验说明:

1.参考类型定义 //双亲孩子表示法 typedef struct {

26

unsigned int weight;

unsigned int parent, lchild, rchild;

} HTNode, *HuffmanTree; //动态分配数组存储哈夫曼树 typedef char * * HuffmanCode; //动态分配数组存储哈夫曼编码表

注意问题:

1.递归算法的灵活应用。 2.多级指针的使用。

27

实验07 图的两种存储和遍历

实验学时:2学时 实验类型:上机

背景知识:图的存储、遍历及其应用。 目的要求:

1.掌握图的存储思想及其存储实现。

2.掌握图的深度、广度优先遍历算法思想及其程序实现。

实验内容:

(1) 键盘输入数据,分别建立一个有向图和一个无向图的邻接表。 (2) 输出该邻接表。

(3) 在有向图的邻接表的基础上计算各顶点的度,并输出。 (4) 采用邻接表存储实现无向图的深度优先遍历。 (5) 采用邻接表存储实现无向图的广度优先遍历。 (6) 在主函数中设计一个简单的菜单,分别调试上述算法。 (7) *综合训练

地下迷宫探索:假设有一个地下通道迷宫,它的通道都是直的,而通道所有交叉点(包括通道的端点)上都有一盏灯和一个开关。请问你如何从某个起点开始在迷宫中点亮所有的灯并回到起点?

输入格式:

输入第一行给出三个正整数,分别表示地下迷宫的节点数N(1

若可以点亮所有节点的灯,则输出从S开始并以S结束的包含所有节点的序列,序列中相邻的节点一定有边(通道);否则虽然不能点亮所有节点的灯,但还是输出点亮部分灯的节点

28

序列,最后输出0,此时表示迷宫不是连通图。

由于深度优先遍历的节点序列是不唯一的,为了使得输出具有唯一的结果,我们约定以节点小编号优先的次序访问(点灯)。在点亮所有可以点亮的灯后,以原路返回的方式回到起点。 输入样例:

6 8 1 1 2 2 3 3 4 4 5 5 6 6 4 3 6 1 5 输出样例:

1 2 3 4 5 6 5 4 3 2 1

实验说明:

1.类型定义(邻接表存储)

#define MAX_VERTEX_NUM 20 //顶点最大个数 typedef struct ArcNode{ int adjvex; struct ArcNode *nextarc;

int weight; //边的权值 }ArcNode; //表结点

#define VertexType int //顶点元素类型 typedef struct VNode{ VertexType data; ArcNode *firstarc;

}VNode, AdjList[MAX_VERTEX_NUM]; // typedef struct{

AdjList vertices;

int vexnum, arcnum; //顶点的实际数,边的实际数 int kind; }ALGraph;

2.上述类型定义可以根据实际情况适当调整。 3.算法4、5分别利用栈、队列实现非递归算法。

29

注意问题:

1.注意理解各算法实现时所采用的存储结构。

2.注意区别正、逆邻接。

30

实验08 最小生成树、拓扑排序和最短路径

实验学时:2学时 实验类型:上机

背景知识:图的存储、遍历及其应用。 目的要求:

掌握图的常见应用算法的思想及其程序实现。

实验内容:

(1)键盘输入数据,分别建立一个有向图的邻接表和一个无向图的邻接矩阵。 (2)输出该邻接表和邻接矩阵。

(3)以有向图的邻接表为基础输出它的拓扑排序序列。 (4)以无向图的邻接矩阵为基础实现最小生成树的PRIM算法。

(5)以有向图的邻接矩阵为基础实现Dijkstra算法输出单源点到其它顶点的最短路径。 (6)在主函数中设计一个简单的菜单,分别调试上述算法。 (7)*综合训练:校园导航 1)问题描述:

在给出校园各主要建筑的名称信息及有路线连通的建筑之间的距离(或行进时间)的基础上,利用校园导航系统计算出给定的起点到终点之间距离最近(或行进时间最短)的行进路线。

2)设计要求:文件读入或键盘方式读入校园主要建筑信息及建筑间的距离(或行进时间)信息。创建完地图后,以文件形式保存,以免重复创建。计算出给定的起点到终点之间距离最近(或行进时间最短)的行进路线,并输出该路线(包括经过哪些建筑)及其总距离(或总行进时间)。 实验说明: 1.类型定义

邻接表存储见实验07 邻接矩阵存储示例

#define MAX_VERTEX_NUM 20 //顶点最大个数 typedef enum {DG, DN, UDG, UDN} GraphKind;

typedef struct ArcCell{

VRType adj;

int weight; //边的权值

}ArcCell; AdjMatrix[MAX_VERTEX_NUM] [MAX_VERTEX_NUM]; typedef struct{

31

VertexType vexs[MAX_VERTEX_NUM]; AdjMatrix arcs;

int vexnum, arcnum; //顶点的实际数,边的实际数 GraphKind kind; }MGraph;

注意问题:

注意理解各算法实现时所采用的存储结构。

32

实验09 二叉排序树的基本操作

实验学时:2学时

实验类型:上机

背景知识:树表查找。 目的要求:

掌握二叉排序树、AVL树的查找、插入、删除、建立算法的思想及程序实现。 实验内容:

(1) 随机产生一组关键字,利用二叉排序树的插入算法建立二叉排序树,然后删除某一指

定关键字元素。

(2) * 建立AVL树并实现删除某一指定关键字元素。 (3) *综合训练: 树种统计

随着卫星成像技术的应用,自然资源研究机构可以识别每一棵树的种类。请编写程序帮助研究人员统计每种树的数量,计算每种树占总数的百分比。首先输入正整数N(≤105),随后N行,每行给出卫星观测到的一棵树的种类名称。种类名称由不超过30个英文字母和空格组成(不区分大小写)。按字典序递增输出各种树的种类名称及其所占总数的百分比,其间以空格分隔,每种树的信息占一行。 实验说明: 1.存储定义

参见实验05二叉链表的存储。

2.各种关键字数据输入可利用随机函数自动产生,以便节省上机时间。 注意问题:

1.注意建立二叉排序树时相同元素的处理。

2.注意理解动态查找概念。

33

实验10 哈希表的生成

实验学时:2学时

实验类型:上机

背景知识:哈希查找。 目的要求:

掌握哈希存储结构的思想,能选择合适的哈希函数,实现不同冲突处理方法的哈希表的查找、建立。 实验内容:

(1)设计哈希函数及处理冲突的方法;

(2)键盘输入数据,利用设计的哈希函数及线性探测法生成哈希表; (3)用同样的输入数据和哈希函数,用链地址法处理冲突生成哈希表; (4)在主函数中设计一个简单的菜单,分别调试上述算法; (5)分析两种方法的平均查找长度。 (6)*综合训练:QQ帐户的申请与登陆

首先输入一个正整数N(≤105),随后给出N行指令。每行指令的格式为:“命令符(空格)QQ号码(空格)密码”。其中命令符为“N”(代表New)时表示要新申请一个QQ号,后面是新帐户的号码和密码;命令符为“L”(代表Login)时表示是老帐户登陆,后面是登陆信息。QQ号码为一个不超过10位、但大于1000(据说QQ老总的号码是1001)的整数。密码为不小于6位、不超过16位、且不包含空格的字符串。

针对每条指令,给出相应的信息:

1)若新申请帐户成功,则输出“New: OK”;

2)若新申请的号码已经存在,则输出“ERROR: Exist”; 3)若老帐户登陆成功,则输出“Login: OK”;

4)若老帐户QQ号码不存在,则输出“ERROR: Not Exist”; 5)若老帐户密码错误,则输出“ERROR: Wrong PW”。 实验说明:

各种关键字数据输入可利用随机函数自动产生,以便节省上机时间。 注意问题:

1.注意建立哈希表时相同元素的处理。

2.注意理解哈希查找思想。

34

实验11 常用的内部排序算法

实验学时:2学时 实验类型:上机 背景知识:各种排序方法 目的要求:

1.掌握常见的内部排序算法的思想及其适用条件。 2.掌握常见的内部排序算法的程序实现。

实验内容:

输入一组关键字序列分别实现下列排序:

(1) 实现简单选择排序、直接插入排序和冒泡排序。 (2) 实现希尔排序算法。 (3) 实现快速排序算法。 (4) 实现堆排序算法。 (5) * 快速排序的非递归算法。 (6) * 实现折半插入排序。

(7) 在主函数中设计一个简单的菜单,分别测试上述算法。

(8) * 综合训练:采用几组不同数据测试各个排序算法的性能(比较次数和移动次数)。

实验说明:

1.类型定义

#define MAXSIZE 100 /*参加排序元素的最大个数*/ typedef int KeyType; typedef struct { KeyType key;

InfoType otherinfo; // 其他字段 }RedType; typedef struct {

RedType r[MAXSIZE+1];

int length; /*参加排序元素的实际个数*/ }SqList;

2.算法5可以借助栈实现。

注意问题:

35

1.在RedType中增加一个数据项验证各种排序算法的稳定性。

2.注意理解各种算法的思想、了解算法的适用情况及时间复杂度,能够根据实际情况选择合适的排序方法。

36

附:实验报告模板

郑 州 轻 工 业 学 院

课程名称:实验名称:院 (系):姓 名:学 号:专业班级:指导教师:实 验 报 告

年 月 日

实验报告成绩评定表

评定项目 实验态度 内 容 实验认真,态度端正,遵守纪律,出勤情况。 按实验要求完成各种功能或操作,实验过程 代码书写规范,注释清晰,设计严谨,运行结果正确。 报告字迹整洁、内容丰富、条理清报告撰写 楚;图、表、文字表达准确规范,上交及时。 总成绩 评语: 指导老师签字: 年 月 日

满 分 20 评 分 总 分 40 40 采用五级分制:优、良、中、及格、不及格 1

实验报告正文

一、

二、

实验内容及要求 实验目的

1、 任务描述

2、 主要数据类型与变量

(必要时,可对数据类型和变量进一步解释或说明,增加可读性)

3、 算法或程序模块

(必要时,可对算法或程序模块进一步解释或说明,增加可读性)

三、

测试

1、 方案

描述测试方案、测试数据实例(文字数据、图或表等形式)…… 2、 结果

结合测试数据实例描述测试过程和测试结果,最好给出表示测试过程和结果的抓图,对测试结果进行分析并得出结论。 四、

总结与讨论

可针对本设计谈体会、谈遇到的问题、谈改进、谈设想等,展示你的概括、归纳和创新思维能力,看重的不是你的对与错,而是鼓励你的想象和创新思维。

附:程序的源代码

2

本文来源:https://www.bwwdw.com/article/o4s3.html

Top