数据结构实验文档)

数据结构实验文档)
数据结构实验文档)

附录上机实验题

实验一线性表

实验目的:

1.熟悉C语言的上机环境,进一步掌握C语言的结构特点。

2.掌握线性表的顺序存储结构的定义及C语言实现。

3.掌握线性表的链式存储结构——单链表的定义及C语言实现。

4.掌握线性表在顺序存储结构即顺序表中的各种基本操作。

5.掌握线性表在链式存储结构——单链表中的各种基本操作。

实验内容:

1.顺序线性表的建立、插入及删除。

2.链式线性表的建立、插入及删除。

实验步骤:

1.建立含n个数据元素的顺序表并输出该表中各元素的值及顺序表的长度。

2.利用前面的实验先建立一个顺序表L={21,23,14,5,56,17,31},然后在第i个位置插入元素68。

3.建立一个带头结点的单链表,结点的值域为整型数据。要求将用户输入的数据按尾插入法来建立相应单链表。

实现提示:

1.由于C语言的数组类型也有随机存取的特点,一维数组的机内表示就是顺序结构。因此,可用C语言的一维数组实现线性表的顺序存储。

在此,我们利用C语言的结构体类型定义顺序表:

#define MAXSIZE 1024

typedef int elemtype; /* 线性表中存放整型元素 */

typedef struct

{

elemtype vec[MAXSIZE];

int len; /* 顺序表的长度 */

}sequenlist;

将此结构定义放在一个头文件sqlist.h里,可避免在后面的参考程序中代码重复书写,另外在该头文件里给出顺序表的建立及常量的定义。

2. 注意如何取到第i个元素,在插入过程中注意溢出情况以及数组的下标与位序(顺序表中元素的次序)的区别。

3.单链表的结点结构除数据域外,还含有一个指针域。用C语言描述结点结构如下:

typedef int elemtype;

typedef struct node

{

elemtype data; //数据域

struct node *next; //指针域

}linklist;

注意结点的建立方法及构造新结点时指针的变化。构造一个结点需用到C语言的标准函数malloc(),如给指针变量p分配一个结点的地址:

270

第9章排序

p=(linklist *)malloc(sizeof(linklist));该语句的功能是申请分配一个类型为linklist的结点的地址空间,并将首地址存入指针变量p 中。当结点不需要时可以用标准函数free(p)释放结点存储空间,这时p为空值(NULL)。

思考与提高:

1. 如果按由表尾至表头的次序输入数据元素,应如何建立顺序表。

2. 在main函数里如果去掉L=&a语句,会出现什么结果?

实验二栈

实验目的:

掌握栈的顺序表示和实现

实验内容:

编写一个程序实现顺序栈的各种基本运算。

实验步骤:

1. 初始化顺序栈

2. 插入元素

3. 删除栈顶元素

4. 取栈顶元素

5. 遍历顺序栈

6. 置空顺序栈

实现提示:

/*定义顺序栈的存储结构*/

typedef struct

{

Datatype stack[MAXNUM];

int top;

}SqStack;

/*初始化顺序栈函数*/

void InitStack(SqStack *p)

{q=(SqStack*)malloc(sizeof(SqStack) /*申请空间*/}

/*入栈函数*/

void Push(SqStack *p,Datatype x)

{if(p->top

{

p->top=p->top+1; /*栈顶+1*/

p->stack[p->top]=x; /*数据入栈*/

}

}

/*出栈函数*/

Datatype Pop(SqStack *p)

271

{

x=p->stack[p->top]; /*将栈顶元素赋给x*/

p->top=p->top-1; /*栈顶-1*/

}

/*获取栈顶元素函数*/

Datatype GetTop(SqStack *p)

{ x=p->stack[p->top];}

/*遍历顺序栈函数*/

void OutStack(SqStack *p)

{

for(i=p->top;i>=0;i--)

printf("第%d个数据元素是:%6d\n",i,p->stack[i]);

}

/*置空顺序栈函数*/

void setEmpty(SqStack *p)

{ p->top= -1;}

思考与提高:

读栈顶元素的算法与退栈顶元素的算法有何区别?

实验三队列

实验目的:

掌握队列的链式表示和实现

实验内容:

实现队列的链式表示和实现。

实验步骤:

1. 初始化并建立链队列

2. 入链队列

3. 出链队列

4. 遍历链队列

实现提示:

/*定义链队列*/

typedef struct Qnode

{

Datatype data;

struct Qnode *next;

}Qnodetype;

typedef struct

{ Qnodetype *front;

Qnodetype *rear;

}Lqueue;

272

第9章排序

/*初始化并建立链队列函数*/

void creat(Lqueue *q)

{

h=(Qnodetype*)malloc(sizeof(Qnodetype)); /*初始化申请空间*/

h->next=NULL;

q->front=h;

q->rear=h;

for(i=1;i<=n;i++) /*利用循环快速输入数据*/

{

scanf("%d",&x);

Lappend(q,x); /*利用入链队列函数快速输入数据*/

}

}

/*入链队列函数*/

void Lappend(Lqueue *q,int x)

{

s->data=x;

s->next=NULL;

q->rear->next=s;

q->rear=s;

}

/*出链队列函数*/

Datatype Ldelete(Lqueue *q)

{

p=q->front->next;

q->front->next=p->next;

if(p->next==NULL)

q->rear=q->front;

x=p->data;

free(p); /*释放空间*/

}

/*遍历链队列函数*/

void display(Lqueue *q)

{ while(p!=NULL) /*利用条件判断是否到队尾*/

{

printf("%d-->",p->data);

p=p->next;

}

}

思考与提高:

链栈只有一个top指针,对于链队列,为什么要设计一个头指针和一个尾指针?

实验四树及二叉树

273

实验目的:

1. 通过实验,掌握二叉树的建立与存储

2. 通过实验,掌握二叉树的遍历方法

实验内容:

1. 练习二叉树的建立与存储

2. 练习二叉树的遍历

实验步骤:

1. 建立自己的头文件BinTree.h,内容包括二叉链表的结构描述、二叉树的建立、二叉树的先序、中序与后序遍历算法。

2. 建立二叉树,并通过调用函数, 输出先序遍历、中序遍历与后序遍历的结果。

实现提示:

建立二叉树的代码如下:

BinTNode *CreateBinTree() //输入二叉树的先序遍历序列,创建二叉链表

{

BinTNode *t;

char ch;

ch=getchar();

if (ch=='0') //如果读入0,创建空树

t=NULL;

else

{

t=(BinTNode *)malloc(sizeof(BinTNode)); //申请根结点*t空间

t->data=ch; //将结点数据ch放入跟结点的数据域

t->lchild=CreateBinTree(); //建左子树

t->rchild=CreateBinTree(); //建右子树

}

return t;

}

思考与提高:

1. 如何用孩子兄弟表示法存储树?

2. 熟悉并掌握哈夫曼树及其应用。

实验五图

实验目的:

1. 掌握图的基本存储方法;

2. 掌握有关图的操作算法并用高级语言实现;

3. 熟练掌握图的两种搜索路径的遍历方法。

实验内容:

假设以一个带权有向图表示某一区域的公交线路网,图中顶点代表一些区域中的重要场所,弧代表已有的公交线路,弧上的权表示该线路上的票价(或搭乘所需时间),试设计一个简易交通指南系统,指导前来咨询者以最低的票价或最少的时间从区域中的某一场所到达

274

第9章排序

另一场所。

实验步骤:

1. 定义结点结构,定义图结构。

2. 存储图信息;

3. 定义求某顶点到其他所有顶点最短路径的函数;

4. 写出主函数。

实现提示:

int creatcost(int cost[][MAX_VEX]) /*建立图的邻接矩阵,cost数组表示图的邻接矩阵*/ {

int vexnum,arcnum,i,j,k,v1,v2,w; /*输入图的顶点数和弧数(或边数)*/

printf("\n请输入顶点数和边数(输入格式为:顶点数,边数): ");

scanf("%d,%d",&vexnum,&arcnum);

for(i=1;i<=vexnum;i++)

for(j=1;j<=vexnum;j++)

cost[i][j]=9999; /*设9999代表无限大*/

for(k=1;k<=arcnum;k++)

{

printf("v1,v2,w = ");

scanf("%d,%d,%d",&v1,&v2,&w); /*输入所有边或所有弧的一对顶点V1,V2 */ cost[v1][v2]=w;

}

return(vexnum);

}

void dijkstra(int cost[][MAX_VEX],int vexnum)

/*Dijkstra算法求从源点出发的最短路径*/

{

int path[MAX_VEX],s[MAX_VEX],dist[MAX_VEX],i,j,w,v,min,v1;

/*S数组用于记录顶点V是否已经确定了最短路径,S[V]=1,顶点V已经确定了最短路径,S[V]=0,顶点V尚未确定最短路径。dist数组表示当前求出的从V0 到Vi 的最短路径。path是路径数

组,其中path[i]表示从源点到顶点Vi之间的最短路径上Vi的前驱顶点,如有路径

(v1,v3,v5),则path[5]=3*/

printf("输入源点 v1 : ");

scanf("%d",&v1); /*输入源点V1 */

for(i=1;i<=vexnum;i++)

{

dist[i]=cost[v1][i]; /*初始时,从源点V1到各顶点的最短路径为相应弧上的权*/ s[i]=0; /*初始化*/

if(cost[v1][i]<9999)

path[i]=v1; /*初始化,path记录当前最短路径,即顶点的直接前趋*/

}

s[v1]=1; /*将源点加入S集合中*/

for(i=1;i<=vexnum;i++)

{

min=9999; /*本例设各边上的权值均小于9999*/

for(j=1;j<=vexnum;j++) /*从S集合外找出距离源点最近的顶点w*/

if((s[j]==0)&&(dist[j]

275

{

min=dist[j];

w=j;

}

s[w]=1; /*将w加入S集合,即w已是求出最短路径的顶点*/

for(v=1;v<=vexnum;v++) /*根据w修改dist[]*/

if(s[v]==0) /*修改未加入的顶点的路径长度*/

if(dist[w]+cost[w][v]

{

dist[v]=dist[w]+cost[w][v]; /*修改V-S集合中各顶点的最短路径长度*/ path[v]=w; /*修改V-S集合中各顶点的最短路径*/

}

}

printf("源点1到其他各顶点的路径与值:\n",v1);

for(i=2;i<=vexnum;i++) /*输出从某源点到其他各顶点的最短路径*/

if(s[i]==1)

{

w=i;

while(w!=v1)

{

printf("%d<--",w);

w=path[w]; /*通过找到前驱顶点,反向输出最短路径*/

}

printf("%d",w);

printf(" %d\n",dist[i]);

}

else

{

printf("%d<--%d",i,v1);

printf(" 9999\n"); /*不存在路径时,路径长度设为9999*/

}

}

思考与提高:

1. 判断两点是否可达。

3. 练习图的拓扑排序

实验六查找

实验目的:

1. 掌握查找的不同方法,并能用高级语言实现查找算法;

2. 熟练掌握二叉排序树的构造和查找方法。

3. 了解静态查找表及哈希表查找方法。

实验内容:

设计一个算法读入一串整数,然后构造二叉排序树,进行查找。

实验步骤:

276

第9章排序

1. 从空的二叉树开始,每输入一个结点数据,就建立一个新结点插入到当前已生成的二叉排序树中。

2. 在二叉排序树中查找某一结点。

3. 用其它查找算法进行排序(课后自己做)。

实现提示:

typedef struct Node /*二叉排序树结点结构*/

{

KeyType key ; /*关键字值*/

struct node *lchild, *rchild; /*左右指针*/

}BSTNode;

void InsertBST(BSTNode **bst, int key)

/*若在二叉排序树中不存在关键字等于key的记录,插入该记录*/

{

BSTNode * s;

if (*bst == NULL)/*递归结束条件*/

{

s=(BSTNode *)malloc(sizeof(BSTNode)); /*申请新的结点s*/

s-> key=key;

s->lchild=NULL;

s->rchild=NULL;

*bst=s;

}

else

if(key<(*bst)->key)

InsertBST(&((*bst)->lchild), key); /*将s插入左子树*/

else

if(key>(*bst)->key)

InsertBST(&((*bst)->rchild), key); /*将s插入右子树*/ }

void CreateBST(BSTNode **bst) /*从键盘输入记录的值,创建相应的二叉排序树*/

{

int key;

*bst=NULL;

scanf("%d", &key);

while (key!=0) /*输入0时结束*/

{

InsertBST(bst, key);

scanf("%d", &key);

}

}

BSTNode *SearchBST(BSTNode *bst, int key)

/*在根指针bst所指二叉排序树中,递归查找某关键字等于key的记录,

若查找成功,返回指向该记录结点指针,否则返回空指针*/

{

if (!bst)

277

278

return NULL;

else

if (bst->key == key)

return bst; /*查找成功*/

else

if (bst->key > key)

return SearchBST(bst->lchild, key);/*在左子树继续查找*/ else

return SearchBST(bst->rchild, key);/*在右子树继续查找*/

}

思考与提高:

1. 用其它的查找方法完成该算法。

2. 比较各种算法的时间及空间复杂度。

实验七排序

实验目的:

1. 掌握常用的排序方法,并掌握用高级语言实现排序算法的方法;

2. 深刻理解排序的定义和各种排序方法的特点,并能加以灵活应用;

3. 了解各种方法的排序过程及其时间复杂度的分析方法。

实验内容:

统计成绩

给出n个学生的考试成绩表,每条信息由姓名和分数组成,试设计一个算法:

(1)按分数高低次序,打印出每个学生在考试中获得的名次,分数相同的为同一名次;

(2)按名次列出每个学生的姓名与分数。

实验步骤:

1. 定义结构体。

2. 定义结构体数组。

3. 定出主程序,对数据进行排序。

实现提示:

#define n 30

typedef struct student

{

char name[8];

int score;

}

student R[n];

main ( )

{

int num=1, i, j, max, temp;

printf(“\n请输入学生成绩: \n”);

for(i=0;i

{

第9章排序

printf (“姓名:”);

scanf (“%s”, &stu[i].name);

scanf (“%4d”, &stu[i].score);

}

for (i=0; i

{ max=i;

for (j=i+1; j

if(R[j].score>R[max].score)

max=j;

if (max!=i)

{ temp=R[max];

R[max]=R[i];

R[i]= temp;

}

if((i>0)&&(R[i].score

num=num+1;

printf(“%4d%s%4d”, num, R[i].name, R[i].score);

}

}

思考与提高:

1. 快速排序算法解决本问题。

2. 比较各种排序算法的优缺点。

3. 使用其它排序算法实现该问题(直接插入排序、希尔排序、简单选择排序、堆排序等)。

279

数据结构实验报告格式

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

中央电大数据结构形成性考核册实验报告

中央电大本科数据结构形成性考核册实验报告 实验名称:实验一线性表 线性表的链式存储结构 【问题描述】 某项比赛中,评委们给某参赛者的评分信息存储在一个带头结点的单向链表中,编写程序: (1)显示在评分中给出最高分和最低分的评委的有关信息(姓名、年龄、所给分数等)。 (2)在链表中删除一个最高分和一个最低分的结点。 (3)计算该参赛者去掉一个最高分和一个最低分后的平均成绩。 【基本要求】 (1)建立一个评委打分的单向链表; (2)显示删除相关结点后的链表信息。 (3)显示要求的结果。 【实验步骤】 (1)运行PC中的Microsoft Visual C++ 6.0程序, (2)点击“文件”→“新建”→对话窗口中“文件”→“c++ Source File”→在“文件名”中输入“X1.cpp” →在“位置”中选择储存路径为“桌面”→“确定”, (3)输入程序代码, 程序代码如下: #include #include #include #include #include #define NULL 0 #define PWRS 5 //定义评委人数 struct pw //定义评委信息 { char name[6]; float score; int age; }; typedef struct pw PW; struct node //定义链表结点 {struct pw data; struct node * next; }; typedef struct node NODE; NODE *create(int m); //创建单链表 int calc(NODE *h); //计算、数据处理

(完整版)数据结构实验报告全集

数据结构实验报告全集 实验一线性表基本操作和简单程序 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)编程实现二叉排序树,包括生成、插入,删除; 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

图书管理系统 c++ 数据结构实验报告

图书管理系统 c++ 数据结构实验报告学生姓名: 学院: 软件学院 专业: 信息管理与信息系统 题目: 图书管理系统 成绩 指导教师 2011年1月6日 1(设计目的(小标题黑体五号字) 《数据结构》课程主要介绍最常用的数据结构,阐明各种数据结构内在的逻辑 关系,讨论其 在计算机中的存储表示,以及在其上进行各种运算时的实现算法,并对算法的 效率进行简单的分 析和讨论。进行数据结构课程设计要达到以下目的: , 了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力; , 初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能; , 提高综合运用所学的理论知识和方法独立分析和解决问题的能力; 训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。 2(设计内容和要求 1)每种书的登记内容包括书号、书名、著作者、现存量和库存量; 2)对书号建立索引表(线性表)以提高查找效率; 3)系统主要功能如下:

*采编入库:新购一种书,确定书号后,登记到图书帐目表中,如果表中已有,则只将库存量增加; *借阅:如果一种书的现存量大于0,则借出一本,登记借阅者的书证号和归还期限,改变现存量; *归还:注销对借阅者的登记,改变该书的现存量。 3(本设计所采用的数据结构 定义图书链表和图书索引结构 struct Book { char BookID[10];/*图书编号*/ char BookName[512];/*书名*/ char Writer[512];/*作者*/ int CurrentNumber;/*现存量*/ Book *pNext;/*下一个图书信息*/ }; struct Index { char BookID[10];/*图书编号*/ Index *pNext;/*下一个索引指针*/ }; 1 /*借阅信息结构*/ struct Borrow {

数据结构实验报告完整

华北电力大学 实验报告| | 实验名称数据结构实验 课程名称数据结构 | | 专业班级:学生姓名: 学号:成绩: 指导教师:实验日期:2015/7/3

实验报告说明: 本次实验报告共包含六个实验,分别为:简易停车场管理、约瑟夫环(基于链表和数组)、二叉树的建立和三种遍历、图的建立和两种遍历、hash-telbook和公司招工系统。 编译环境:visual studio 2010 使用语言:C++ 所有程序经调试均能正常运行 实验目录 实验一约瑟夫环(基于链表和数组) 实验二简易停车场管理 实验三二叉树的建立和三种遍历 实验四图的建立和两种遍历 实验五哈希表的设计

实验一:约瑟夫环 一、实验目的 1.熟悉循环链表的定义和有关操作。 二、实验要求 1.认真阅读和掌握实验内容。 2.用循环链表解决约瑟夫问题。 3.输入和运行编出的相关操作的程序。 4.保存程序运行结果 , 并结合输入数据进行分析。 三、所用仪器设备 1.PC机。 2.Microsoft Visual C++运行环境。 四、实验原理 1.约瑟夫问题解决方案: 用两个指针分别指向链表开头和下一个,两指针依次挪动,符合题意就输出结点数据,在调整指针,删掉该结点。 五、代码 1、基于链表 #include using namespace std; struct Node { int data; Node* next; }; void main() { int m,n,j=1; cout<<"请输入m的值:";cin>>m; cout<<"请输入n的值:";cin>>n; Node* head=NULL; Node* s=new Node; for(int i=1;i<=n;i++) { Node* p=new Node; p->data=n+1-i;

数据结构实验报告册

实验一线性表的操作 实验类型:验证性 实验要求:必修 实验学时: 2学时 一、实验目的: 参照给定的线性表顺序表类和链表类的程序样例,验证给出的线性表的常见算法。 二、实验要求: 1、掌握线性表顺序表类和链表类的特点。掌握线性表的常见算法。 2、提交实验报告,报告内容包括:目的、要求、算法描述、程序结构、主要变量说明、程序清单、调试情况、设计技巧、心得体会。 三、实验内容: 1.设计一个静态数组存储结构的顺序表类,要求编程实现如下任务:建立一个线性表,首先依次输人数据元素1,2,3,…,10,然后删除数据元素6,最后依次显示当前线性表中的数据元素。要求采用顺序表实现,假设该顺序表的数据元素个数在最坏情况下不会超过10个。 第一题源代码: #include using namespace std; template //定义模板类SeqList class SeqList { private: int length,x,j,data[10]; public: public: SeqList( ) //无参构造函数 { length=0; } SeqList(T a[ ], int n) //有参构造函数 { for(int i=0;i

} T Get(int i) //按位查找,取线性表的第i个元素 { } int Locate(T x ) //按值查找,求线性表中值为x的元素序号{ } void Insert(int i, T x) //在线性表中第i个位置插入值为x的元素{ } T Delete(int i) //删除线性表的第i个元素 { if(length==0) throw"下溢"; if(i<1||i>length) throw"位置异常"; x=data[i-1]; for(j=i;j theseqlist(a,n); cout<<"删除前元素:"; for(int i=0;i

数据结构实验报告模板

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);//重载赋

数据结构实验报告.

实验目的 (1)学会用先序创建一棵二叉树。 (2)学会采用递归算法对二叉树进行先序、中序、后序遍历。 (3)学会打印输出二叉树的遍历结果。 实验内容 【问题描述】建立一棵二叉树,并对其进行遍历(先序、中序、后序),打印输出遍历结果。 【基本要求】 从键盘接受输入(先序),以二叉链表作为存储结构,建立二叉树(以先序来建立),并采用递归算法对其进行遍历(先序、中序、后序),将遍历结果打印输出。 【测试数据】 ABCффDEфGффFффф(其中ф表示空格字符) 则输出结果为先序:ABCDEGF 中序:CBEGDFA 后序:CGBFDBA 【选作内容】 采用非递归算法实现二叉树遍历。 实验步骤 (一)需求分析 1、在这个过程中,接受遍历的二叉树是从键盘接受输入(先序),以二叉链表作为存储结构,建立的二叉树。因此,首先要创建一棵二叉树,而这棵二叉树是先序二叉树。本演示程序中,集合的元素设定为大写字母ABCDEFG,输出的先序,中序,后序遍历分别为ABCDEGF,CBEGDFA,CGBFDBA。二叉树可以表示为:

接受的输入数据在进行递归的先序,中序,后序遍历后,分别将结果打印出来。 2、在程序运行的过程中可以看到,以计算机提示用户执行的方式进行下去,即在计算机终端上提示“输入二叉树的先序序列”后,由用户在键盘上输入ABC##DE#G##F###,之后相应的选择遍历及遍历结果显示出来。 3、程序执行的命令包括:首先是二叉树的先序序列被创建输入,其次是对输入进去的先序序列有次序的进行先序,中序,后序遍历。最后是打印出二叉树的遍历结果。 4、测试数据 (1)在键盘上输入的先序序列ABC##DE#G##F### (2)先序遍历结果ABCDEGF

数据结构实验报告图实验

图实验一,邻接矩阵的实现 1.实验目的 (1)掌握图的逻辑结构 (2)掌握图的邻接矩阵的存储结构 (3)验证图的邻接矩阵存储及其遍历操作的实现 2.实验内容 (1)建立无向图的邻接矩阵存储 (2)进行深度优先遍历 (3)进行广度优先遍历 3.设计与编码 MGraph.h #ifndef MGraph_H #define MGraph_H const int MaxSize = 10;

template class MGraph { public: MGraph(DataType a[], int n, int e); ~MGraph(){ } void DFSTraverse(int v); void BFSTraverse(int v); private: DataType vertex[MaxSize]; int arc[MaxSize][MaxSize]; int vertexNum, arcNum; }; #endif MGraph.cpp

#include using namespace std; #include "MGraph.h" extern int visited[MaxSize]; template MGraph::MGraph(DataType a[], int n, int e) { int i, j, k; vertexNum = n, arcNum = e; for(i = 0; i < vertexNum; i++) vertex[i] = a[i]; for(i = 0;i < vertexNum; i++) for(j = 0; j < vertexNum; j++) arc[i][j] = 0; for(k = 0; k < arcNum; k++) {

数据结构实验报告

数据结构实验报告 第 6 次实验 学号:20141060106 姓名:叶佳伟 一、实验目的 1、复习图的逻辑结构、存储结构及基本操作; 2、掌握邻接矩阵、邻接表及图的创建、遍历; 3、了解图的应用。 二、实验内容 1、(必做题)假设图中数据元素类型是字符型,请采用邻接矩阵或邻接表实现图的以下基本操作: ( 1)构造图(包括有向图、有向网、无向图、无向网); ( 2)根据深度优先遍历图; ( 3)根据广度优先遍历图。 三、算法描述 (采用自然语言描述) 四、详细设计 (画出程序流程图) 五、程序代码 (给出必要注释) #include #include #include #include #include #define INFINITY 255678 /*赋初值用*/ #define MAX_VERTEX_NUM 20 /* 最大顶点个数*/ enum {DG, DN, UDG, UDN}; typedef struct ArcCell {

int adj;/*顶点关系类型,对无权图,用1(是)或0(否)表示相邻否;对带权图,则为权值*/ char *info;/*弧相关信息指针*/ }AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; typedef struct { char vexs[MAX_VERTEX_NUM][5];/*顶点向量*/ AdjMatrix arcs; /*邻接矩阵*/ int vexnum, arcnum;/*图的当前顶点数和弧数*/ int kind; }MGraph; void CreateDG(MGraph *G); void CreateDN(MGraph *G); void CreateUDG(MGraph *G); void CreateUDN(MGraph *G); int LocateVex(MGraph *G, char v[]); void print(MGraph *G); int main(void) { MGraph *G; G = (MGraph *)malloc(sizeof(MGraph)); printf("请选者0-有向图,1-有向网,2-无向图,3-无向网: "); scanf("%d", &G->kind); switch(G->kind) { case DG : CreateDG(G); print(G); break; case DN : CreateDN(G); print(G); break; case UDG : CreateUDG(G); print(G); break; case UDN : CreateUDN(G);

《数据结构实验》实验题目及实验报告模板

《数据结构实验》的实验题目及实验报告模板 实验一客房管理(链表实验) ●实现功能:采用结构化程序设计思想,编程实现客房管理程序的各个功能函数,从而熟练 掌握单链表的创建、输出、查找、修改、插入、删除、排序和复杂综合应用等操作的算法 实现。以带表头结点的单链表为存储结构,实现如下客房管理的设计要求。 ●实验机时:8 ●设计要求: #include #include #include //定义客房链表结点结构 typedef struct HNode { char roomN[7]; //客房名称 float Price; //标准价格 float PriceL; //入住价格(默认值=标准价格*80%) int Beds; //床位数Beds char State[5]; //入住状态(值域:"空闲"、"入住"、"预订",默认值为"空闲") struct HNode *next; //指针域 }Hotel, *HLink; (1)实现创建客房信息链表函数void Build(HLink &H),输入(客房名称、标准价格、床位数),同时修改入住价格、入住状态为默认值,即入住价格=标准价格*80%,入住状态为”空闲”(提示:用strcpy()字符串拷贝函数)。为了提高程序调试效率,要求:用文件操作来输入客房信息(客房名称、标准价格、床位数); (2)实现输出客房信息函数void Exp(HLink H),输出所有客房的客房名称、标准价格、入住价格、床位数、入住状态; (3)函数int Find(HLink &H, char *roomN),查找房间名称为roomN的客房。如果找到,则返回该客房在链表中的位置序号(>=1),否则返回0。提示:用strcmp()字符串比较函数; (4)实现函数void updateH(HLink &H, int beds, char *state),将床位数为beds的客房入住状态改为state。提示:用strcpy()字符串拷贝函数; (5)函数void Add(HLink &H),将该链表中未入住的客房入住价格均加价20%; (6)求出入住价格最高的客房函数HLink FirstH(HLink &H),该函数内return语句返回入住价格最高的客房结点指针,返回前将该结点在链表中删除; (7)函数void MoveK1(HLink &H, int k),将单链表中倒数第k个结点移到第一个结点位置,注意:严禁采用先计算链表长度n再减k(即n-k)的方法;

数据结构实验报告 - 答案汇总

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

专业班级学号姓名 实验1 实验题目:单链表的插入和删除 实验目的: 了解和掌握线性表的逻辑结构和链式存储结构,掌握单链表的基本算法及相关的时间性能分析。 实验要求: 建立一个数据域定义为字符串的单链表,在链表中不允许有重复的字符串;根据输入的字符串,先找到相应的结点,后删除之。 实验主要步骤: 1、分析、理解给出的示例程序。 2、调试程序,并设计输入数据(如:bat,cat,eat,fat,hat,jat,lat,mat,#),测试程序 的如下功能:不允许重复字符串的插入;根据输入的字符串,找到相应的结点并删除。 3、修改程序: (1)增加插入结点的功能。 (2)将建立链表的方法改为头插入法。 程序代码: #include"stdio.h" #include"string.h" #include"stdlib.h" #include"ctype.h" typedef struct node //定义结点 { char data[10]; //结点的数据域为字符串 struct node *next; //结点的指针域 }ListNode; typedef ListNode * LinkList; // 自定义LinkList单链表类型 LinkList CreatListR1(); //函数,用尾插入法建立带头结点的单链表 LinkList CreatList(void); //函数,用头插入法建立带头结点的单链表 ListNode *LocateNode(); //函数,按值查找结点 void DeleteList(); //函数,删除指定值的结点 void printlist(); //函数,打印链表中的所有值 void DeleteAll(); //函数,删除所有结点,释放内存

数据结构实验报告及心得体会

2011~2012第一学期数据结构实验报告 班级:信管一班 学号:201051018 姓名:史孟晨

实验报告题目及要求 一、实验题目 设某班级有M(6)名学生,本学期共开设N(3)门课程,要求实现并修改如下程序(算法)。 1. 输入学生的学号、姓名和 N 门课程的成绩(输入提示和输出显示使用汉字系统), 输出实验结果。(15分) 2. 计算每个学生本学期 N 门课程的总分,输出总分和N门课程成绩排在前 3 名学 生的学号、姓名和成绩。 3. 按学生总分和 N 门课程成绩关键字升序排列名次,总分相同者同名次。 二、实验要求 1.修改算法。将奇偶排序算法升序改为降序。(15分) 2.用选择排序、冒泡排序、插入排序分别替换奇偶排序算法,并将升序算法修改为降序算法;。(45分)) 3.编译、链接以上算法,按要求写出实验报告(25)。 4. 修改后算法的所有语句必须加下划线,没做修改语句保持按原样不动。 5.用A4纸打印输出实验报告。 三、实验报告说明 实验数据可自定义,每种排序算法数据要求均不重复。 (1) 实验题目:《N门课程学生成绩名次排序算法实现》; (2) 实验目的:掌握各种排序算法的基本思想、实验方法和验证算法的准确性; (3) 实验要求:对算法进行上机编译、链接、运行; (4) 实验环境(Windows XP-sp3,Visual c++); (5) 实验算法(给出四种排序算法修改后的全部清单); (6) 实验结果(四种排序算法模拟运行后的实验结果); (7) 实验体会(文字说明本实验成功或不足之处)。

三、实验源程序(算法) Score.c #include "stdio.h" #include "string.h" #define M 6 #define N 3 struct student { char name[10]; int number; int score[N+1]; /*score[N]为总分,score[0]-score[2]为学科成绩*/ }stu[M]; void changesort(struct student a[],int n,int j) {int flag=1,i; struct student temp; while(flag) { flag=0; for(i=1;ia[i+1].score[j]) { temp=a[i]; a[i]=a[i+1]; a[i+1]=temp; flag=1; } for(i=0;ia[i+1].score[j]) { temp=a[i]; a[i]=a[i+1]; a[i+1]=temp; flag=1;

数据结构实验报告 答案

. 数据结构(C语言版) 实验报告 '. . 专业班级学号姓名 实验1 实验题目:单链表的插入和删除

实验目的: 了解和掌握线性表的逻辑结构和链式存储结构,掌握单链表的基本算法及相关的时间性能分析。 实验要求: 建立一个数据域定义为字符串的单链表,在链表中不允许有重复的字符串;根据输入的字符串,先找到相应的结点,后删除之。 实验主要步骤: 1、分析、理解给出的示例程序。 2、调试程序,并设计输入数据(如:bat,cat,eat,fat,hat,jat,lat,mat,#),测试程序的如下功能:不允许重复字符串的插入;根据输入的字符串,找到相应的结点并删除。 3、修改程序: (1)增加插入结点的功能。 (2)将建立链表的方法改为头插入法。 程序代码: #includestdio.h #includestring.h #includestdlib.h #includectype.h typedef struct node //定义结点 { char data[10]; //结点的数据域为字符串 struct node *next; //结点的指针域 }ListNode; typedef ListNode * LinkList; // 自定义LinkList单链表类型 LinkList CreatListR1(); //函数,用尾插入法建立带头结点的单链表 LinkList CreatList(void); //函数,用头插入法建立带头结点的单链表 ListNode *LocateNode(); //函数,按值查找结点 void DeleteList(); //函数,删除指定值的结点 void printlist(); //函数,打印链表中的所有值 void DeleteAll(); //函数,删除所有结点,释放内存 '. . ListNode * AddNode(); //修改程序:增加节点。用头插法,返回头指针 //==========主函数============== void main() {

数据结构实验报告

南京工程学院实验报告 操作的函数程序清单,分别用顺序表和链表结构完成,并在首页上表明团队名称、成员及个人的工作(函数),未来的成绩评定时将包含这一部分的团队成绩及个人的工作成绩。 一、实验目的 1.熟悉上机环境,进一步掌握语言的结构特点。 2.掌握线性表的顺序存储结构的定义及实现。 3.掌握线性表的链式存储结构——单链表的定义及实现。 4.掌握线性表在顺序存储结构即顺序表中的各种基本操作。 5.掌握线性表在链式存储结构——单链表中的各种基本操作。 二、实验内容 1.顺序线性表的建立、插入及删除。 2.链式线性表的建立、插入及删除。 三、实验步骤 1.建立含n个数据元素的顺序表并输出该表中各元素的值及顺序表的长度。 2.利用前面的实验先建立一个顺序表L={21,23,14,5,56,17,31},然后在第i个位置插入元素68。 3.建立一个带头结点的单链表,结点的值域为整型数据。要求将用户输入的数据按尾插入法来建立相应单链表。 四、程序主要语句及作用(main函数程序清单) 程序1的主要代码(附简要注释) #include #define MAXSIZE 1024 typedef int elemtype; typedef struct{ elemtype vec[MAXSIZE]; int len; }sequenlist; elemtype geti(sequenlist s, int i); elemtype deli(sequenlist *s,int i); elemtype insi(sequenlist *s,int i,int b); int main(int argc, char *argv[]){ int i,n,x; sequenlist a; printf("输入n(n>3):"); scanf("%d",&n);

数据结构实验报告--图实验

图实验 一,邻接矩阵的实现 1.实验目的 (1)掌握图的逻辑结构 (2)掌握图的邻接矩阵的存储结构 (3)验证图的邻接矩阵存储及其遍历操作的实现 2.实验内容 (1)建立无向图的邻接矩阵存储 (2)进行深度优先遍历 (3)进行广度优先遍历 3.设计与编码 MGraph.h #ifndef MGraph_H #define MGraph_H const int MaxSize = 10; template class MGraph { public: MGraph(DataType a[], int n, int e); ~MGraph(){ } void DFSTraverse(int v); void BFSTraverse(int v); private: DataType vertex[MaxSize]; int arc[MaxSize][MaxSize]; int vertexNum, arcNum; }; #endif MGraph.cpp #include using namespace std; #include "MGraph.h" extern int visited[MaxSize]; template MGraph::MGraph(DataType a[], int n, int e)

{ int i, j, k; vertexNum = n, arcNum = e; for(i = 0; i < vertexNum; i++) vertex[i] = a[i]; for(i = 0;i < vertexNum; i++) for(j = 0; j < vertexNum; j++) arc[i][j] = 0; for(k = 0; k < arcNum; k++) { cout << "Please enter two vertexs number of edge: "; cin >> i >> j; arc[i][j] = 1; arc[j][i] = 1; } } template void MGraph::DFSTraverse(int v) { cout << vertex[v]; visited[v] = 1; for(int j = 0; j < vertexNum; j++) if(arc[v][j] == 1 && visited[j] == 0) DFSTraverse(j); } template void MGraph::BFSTraverse(int v) { int Q[MaxSize]; int front = -1, rear = -1; cout << vertex[v]; visited[v] = 1; Q[++rear] = v; while(front != rear) { v = Q[++front]; for(int j = 0;j < vertexNum; j++) if(arc[v][j] == 1 && visited[j] == 0){ cout << vertex[j]; visited[j] = 1;

数据结构与算法实验报告册

. . 河南工程学院 理学院学院 实验报告 (数据结构与算法) 学期: 课程: 专业: 班级: 学号: 姓名: 指导教师:

. . 目录 实验一线性表1(顺序表及单链表的合并) (1) 实验二线性表2(循环链表实现约瑟夫环) (1) 实验三栈和队列的应用(表达式求值和杨辉三角) (1) 实验四赫夫曼编码 实验五最小生成树 (1) 实验六排序算法

. . 实验一线性表1 一、实验学时:2学时 二、实验目的 1.了解线性表的逻辑结构特性是数据元素之间存在着线性关系。在计算机中 表示这种关系的两类不同的存储结构是顺序存储结构和链式存储结构。 2.熟练掌握这两类存储结构的描述方法以及线性表的基本操作在这两种存储 结构上的实现。 三、实验内容 1. 编写程序,实现顺序表的合并。 2. 编写程序,实现单链表的合并。 四、主要仪器设备及耗材 硬件:计算机一台 软件:VC++ 6.0,MSDN2003或者以上版本 五、算法设计 1. 顺序表合并的基本思想 程序流程图: 2. 单链表合并的基本思想 程序流程图 六、程序清单

. 七、实现结果 .

. 八、实验体会或对改进实验的建议.

. . 实验二线性表2 一、实验学时:2学时 二、实验目的 1.了解双向循环链表的逻辑结构特性,理解与单链表的区别与联系。 2.熟练掌握双向循环链表的存储结构以及基本操作。 三、实验内容 编写程序,采用循环链表实现约瑟夫环。 设有编号为1,2,……,n的n(n>0)个人围成一个圈,从第1个人开始报数,报到m时停止报数,报m的人出圈,再从他的下一个人起重新报数,报到m时停止报数,报m的出圈,……,如此下去,直到所有人全部出圈为止。当任意给定n和m后,设计算法求n个人出圈的次序。 四、主要仪器设备及耗材 硬件:计算机一台 软件:VC++ 6.0,MSDN2003或者以上版本 五、算法设计 约瑟夫环实现的基本思想 程序流程图: 六、程序清单

数据结构实验报告

实验一约瑟夫问题 实验学时:3学时 实验类型:设计 实验要求:必修 一、实验目的 熟练掌握线性链表的基础知识; 能够使用C++或其他程序设计语言编程实现线性链表; 能够使用线性链表构造正确而且时间复杂度低的算法解决实际问题; 锻炼程序设计能力。 二、实验内容 M个教徒和N个非教徒在深海上遇险,必须将N个人投入海中,其余的人才能幸免于难,于是想了一个办法:所有人围成一圆圈,从第一个人开始依次报数,每数到第K个人就将他扔入大海,如此循环进行直到仅余M个人为止。设计一个算法,找出这样一个排序:使每次被扔进大海的都是非教徒。并用程序设计语言实现。 三、实验原理、方法和手段 使用循环单链表,将每个人作为一个结点,每个结点的指针域指向下一个人,采用循环链表的遍历对每隔N-1个结点的结点进行标记,直至标记出N个结点为止。该实验亦可用顺序表实现。 四、实验组织运行要求 本实验采用集中授课形式,每个同学独立完成上述实验要求。 五、实验条件 每人一台计算机独立完成实验,有如下条件: (1)硬件:联想高性能PC机; (2)软件:VC++ 6.0、VC++.Net。 六、实验步骤 (1)编写循环链表构造函数Node *Create( ),使链表中每个结点的数据域值为0,并让最后一个结点的指针域指向第一个结点; (2)编写约瑟夫问题函数 Node *Move(Node *H,int n); void Insert(Node *H,int pos,int data); (5)主函数中调用Create,Move和Insert,采用具体数据计算,输出结果。 七、实验程序 // stdafx.h : 标准系统包含文件的包含文件, // 或是经常使用但不常更改的 // 特定于项目的包含文件 // #pragma once #include"targetver.h" #include #include #include using namespace std;

相关文档
最新文档