数据结构队列实验报告

数据结构队列实验报告
数据结构队列实验报告

《数据结构》实验报告

院系应用科技学院专业电子信息工程姓名学号

10 级电信班2011 年11 月11日1.实验目的:

(1)掌握链接存储队列的进队和出队等基本操作。

(2)掌握环行队列的进队和出队等基本操作。

(3)加深对队列结构的理解,逐步培养解决实际问题的编程能力。

2.实验要求:

(1)编写链接队列的基本操作函数。

typedef struct QNode

{

int data;

struct QNode *next;

}QNode,*QueuePtr;

typedef struct{

QueuePtr front; //队头指针

QueuePtr rear; //队尾指针

}LinkQueue;

①进队操作 EnQueue(LinkQueue &Q, int e)

②出队操作,队空DeQueue(LinkQueue &Q, int &e)

③输出队列中元素 0utputQueue(LinkQueue Q)

(2)调用上述函数实现下列操作,操作步骤如下。

①调用进队函数建立一个队列。

②读取队列中的第一个元素。

③从队列中删除元素。

④输出队列中的所有元素。

注意每完成一个步骤就必须及时输出队列中元素,以便观察操作结果。

(3)编写环型队列的基本操作函数。

#define MAXSIZE 100 //最大队列长度,最多只能插入MAXSIZE-1个数据typedef struct

{

int *base; //初始化的动态分配存储空间

int front; //头指针,若队列不为空,指向队列头元素

int rear; //为指针,若队列不为空,指向队列尾元素的下一个位置

}SqQueue;

①进队操作,返回1为队满 EnQueue(SqQueue &Q, int e)

②出队操作,返回1为队空 DeQueue(SqQueue &Q, int &e)

③输出队列中元素 OutputQueue(SqQueue &Q)

(4)调用上述函数实现下列操作,操作步骤如下:

①调用进队函数建立一个队列。

②读取队列中的第一个元素。

③从队列中删除元素。

④输出队列中的所有元素。

注意每完成一个步骤就必须及时输出队列中元素,以便观察操作结果。

3.调试内容:

//链接队列

(1)建立一个队列的功能

1.输入的形式和输入值的范围:输入若干正整数,用空格分隔,用0来表示结束。

2.输出的形式:按输入顺序输出。

3.测试数据:输入5 2 3 6 9 0后,输出5 2 3 6 9

(2)取队头元素功能

1.取出队头元素是:5

2.输出队列元素是:5 2 3 6 9

(3)删除队头元素功能

1.删除队列数据元素是:5

2.输出队列元素是:2 3 6 9

(4)输出队列所有元素功能

输出队列所有元素是:2 3 6 9

(5)结束功能

输入0结束程序!

//环型队列

(1)初始化队列

(2)建立一个队列的功能

1.输入的形式和输入值的范围:输入若干正整数,用空格分隔,用0来表示结束。

2.输出的形式:按输入顺序输出。

3.测试数据:输入11 12 13 14 15 0后,输出11 12 13 14 15

(3)取队头元素功能

1.取出队头元素是:11

2.输出队列元素是:11 12 13 14 15

(4)删除队头元素功能

1.删除队列数据元素是:11

2.输出队列元素是:12 13 14 15

(5)输出队列所有元素功能

输出队列所有元素是:12 13 14 15

(6)进队功能

1.输入进队的元素:16

2.输出所有的

(7)结束功能

输入0结束程序!

4.代码注释:

//链接队列

#include

#include

typedef struct Queue

{

int data;

struct Queue *next;

}Queue,*QueuePtr;

typedef struct

{

QueuePtr front; //对头指针

QueuePtr rear; //队尾指针

}LinkQueue;

/***************构造队列**************/

void InitQueu(LinkQueue &Q)

{

Q.front=Q.rear=(QueuePtr)malloc(sizeof(Queue));

Q.front->next=NULL;

printf("构造成功!\n");

}

/***************进队函数**************/

int EnQueue(LinkQueue &Q,int &e)

{

QueuePtr p;

p=(QueuePtr)malloc(sizeof(Queue));

if(!p)

return 0;

p->data=e;

p->next=NULL;

Q.rear->next=p;

Q.rear=p;

return 1;

}

/***************出队函数**************/

void DeQueue(LinkQueue &Q,int &e)

{

QueuePtr p;

if(Q.front==Q.rear)

printf("该队列为空!\n");

p=Q.front->next;

e=p->data;

Q.front->next=p->next;

if(Q.rear==p)

Q.rear=Q.front;

free(p);

printf("出对成功!\n");

}

/***************取对头函数**************/

void GetQueue(LinkQueue &Q,int &e)

{

QueuePtr p;

if(Q.front==Q.rear)

printf("队列为空,无对头。\n");

p=Q.front->next;

e=p->data;

}

/***************输出函数**************/

void OutQueue(LinkQueue Q)

{

if(Q.rear ==Q.front )

printf("队列为空,无元素值。\n");

Queue *head=Q.front->next ;

while(head!=NULL)

{

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

printf(" ");

head=head->next ;

}

/***************主函数**************/

}

void main()

{

char ch;

int e;

LinkQueue Q;

do

{

printf("\t\t\t ---队列操作--- ");

printf("\n\t\t\t********************************");

printf("\n\t\t\t* 0-----退出 *"); printf("\n\t\t\t* 1-----初始化 *"); printf("\n\t\t\t* 2-----创建链队列 *"); printf("\n\t\t\t* 3-----进队操作 *"); printf("\n\t\t\t* 4-----出对操作 *"); printf("\n\t\t\t* 5-----取对头元素 *"); printf("\n\t\t\t* 6-----输出链队列的元素 *"); printf("\n\t\t\t********************************\n"); printf("请选择菜单号(0-6): ");

ch=getchar();

switch(ch)

{

case '0':

printf("您确定要退出吗(y/n): ");

scanf("%c",&ch);

ch=getchar();

if(ch=='y')

printf("退出程序!\n");

else

printf("请继续……\n");

getchar();

break;

case '1':

InitQueu(Q);getchar();break;

case '2':

printf("请输入一个队列以0结束: ");

scanf("%d",&e);

while(e!=0)

{

if(EnQueue(Q,e)!=0)

scanf("%d",&e);

}

printf("链队的元素有: \n");

OutQueue(Q);

getchar();

break;

case '3':

printf("请输入要进队的元素e: ");

scanf("%d",&e);

if(e==0)

printf("进队失败!\n");

else

{

EnQueue(Q,e);

printf("进队成功!\n");

}

printf("链队的元素有: \n");

OutQueue(Q);

getchar();

break;

case '4':

DeQueue(Q,e);

printf("链队的元素有: \n");

OutQueue(Q);

getchar();

break;

case '5':

GetQueue(Q,e);

printf("对头元素为:%d\n",e);

printf("链队的元素有: ");

OutQueue(Q);

getchar();

break;

case '6':

printf("链队的元素有: \n");

OutQueue(Q);

getchar();

break;

default :

getchar();

printf("输入错误,请重新输入……\n");

}

}

while(ch!='y');

}

//环型队列

#include

#include

#define MAXSIZE 100 //最大队列长度,最多只能插入MAXSIZE-1个数据typedef struct

{

int *base; //初始化的动态分配存储空间

int front; //头指针,若队列不为空,指向队列头元素

int rear; //为指针,若队列不为空,指向队列尾元素的下一个位置}SqQueue;

void InitQueue(SqQueue &Q)

{

Q.base=(int *)malloc(MAXSIZE * sizeof(int));

if(!Q.base) printf("构造失败!\n");;

Q.front=Q.rear=0;

printf("构造成功!\n");

}

int EnQueue(SqQueue &Q, int e)

{

if((Q.rear+1) % MAXSIZE == Q.front) return 0;

Q.base[Q.rear]=e;

Q.rear=(Q.rear+1)%MAXSIZE;

return 1;

}

void GetQueue(SqQueue &Q,int &e)

{

if(Q.front==Q.rear) printf("该循环队列为空,无对头元素!\n");

e=Q.base[Q.front];

printf("取对头成功!\n");

}

void DeQueue(SqQueue &Q, int &e)

{

if(Q.front==Q.rear) printf("该循环队列为空!\n");

e = Q.base[Q.front];

Q.front=(Q.front+1) %MAXSIZE;

printf("出对成功!\n");

}

void OutQueue(SqQueue &Q)

{

int i;

if(Q.front==Q.rear) printf("该循环队列为空!\n");;

for(i=Q.front;i

printf("%d ",Q.base[i]);

printf("\n");

}

/***************主函数**************/

void main()

{

char ch;

int e;

SqQueue Q;

do

{

printf("\t\t\t ---队列操作--- ");

printf("\n\t\t\t********************************");

printf("\n\t\t\t* 0-----退出*");

printf("\n\t\t\t* 1-----初始化*");

printf("\n\t\t\t* 2-----创建链队列*");

printf("\n\t\t\t* 3-----进队操作*"); printf("\n\t\t\t* 4-----取对头元素*"); printf("\n\t\t\t* 5-----出对操作*"); printf("\n\t\t\t* 6-----输出链队列的元素*"); printf("\n\t\t\t********************************\n"); printf("请选择菜单号(0-6): ");

ch=getchar();

switch(ch)

{

case '0':

printf("您确定要退出吗(y/n): ");

scanf("%c",&ch);

ch=getchar();

if(ch=='y')

printf("退出程序!\n");

else

printf("请继续……\n");

getchar();

break;

case '1':

InitQueue(Q);getchar();break;

case '2':

printf("请输入一个队列以0结束: ");

scanf("%d",&e);

while(e!=0)

{

if(EnQueue(Q,e)!=0)

scanf("%d",&e);

}

printf("循环队列的元素有: ");

OutQueue(Q);

getchar();

break;

case '3':

printf("请输入要进队的元素e: ");

scanf("%d",&e);

if(e==0)

printf("进队失败!\n");

else

{

EnQueue(Q,e);

printf("进队成功!\n");

}

printf("循环队列的元素有: ");

OutQueue(Q);

getchar();

break;

case '4':

printf("对头元素为:%d\n",e=Q.base[Q.front]);

GetQueue(Q,e);

printf("循环队列的元素有: ");

OutQueue(Q);

getchar();

break;

case '5':

printf("出对元素为:%d\n", e=Q.base[Q.front]);

DeQueue(Q,e);

printf("循环队列的元素有: ");

OutQueue(Q);

getchar();

break;

case '6':

printf("循环队列的元素有: ");

OutQueue(Q);

getchar();

break;

default :

getchar();

printf("输入错误,请重新输入……\n");

}

}

while(ch!='y');

}

5.测试结果:

//链接队列

//环型队列

数据结构实验报告格式

《数据结构课程实验》大纲 一、《数据结构课程实验》的地位与作用 “数据结构”是计算机专业一门重要的专业技术基础课程,是计算机专业的一门核心的关键性课程。本课程较系统地介绍了软件设计中常用的数据结构以及相应的存储结构和实现算法,介绍了常用的多种查找和排序技术,并做了性能分析和比较,内容非常丰富。本课程的学习将为后续课程的学习以及软件设计水平的提高打下良好的基础。 由于以下原因,使得掌握这门课程具有较大的难度: (1)内容丰富,学习量大,给学习带来困难; (2)贯穿全书的动态链表存储结构和递归技术是学习中的重点也是难点; (3)所用到的技术多,而在此之前的各门课程中所介绍的专业性知识又不多,因而加大了学习难度; (4)隐含在各部分的技术和方法丰富,也是学习的重点和难点。 根据《数据结构课程》课程本身的技术特性,设置《数据结构课程实验》实践环节十分重要。通过实验实践内容的训练,突出构造性思维训练的特征, 目的是提高学生组织数据及编写大型程序的能力。实验学时为18。 二、《数据结构课程实验》的目的和要求 不少学生在解答习题尤其是算法设计题时,觉得无从下手,做起来特别费劲。实验中的内容和教科书的内容是密切相关的,解决题目要求所需的各种技术大多可从教科书中找到,只不过其出现的形式呈多样化,因此需要仔细体会,在反复实践的过程中才能掌握。 为了帮助学生更好地学习本课程,理解和掌握算法设计所需的技术,为整个专业学习打好基础,要求运用所学知识,上机解决一些典型问题,通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握所用到的一些技术。数据结构中稍微复杂一些的算法设计中可能同时要用到多种技术和方法,如算法设计的构思方法,动态链表,算法的编码,递归技术,与特定问题相关的技术等,要求重点掌握线性链表、二叉树和树、图结构、数组结构相关算法的设计。在掌握基本算法的基础上,掌握分析、解决实际问题的能力。 三、《数据结构课程实验》内容 课程实验共18学时,要求完成以下六个题目: 实习一约瑟夫环问题(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.数据库设计器 2.数据库的创建 3.设定数据词典 4.参照完整性的设置 5.视图的创建和修改 三、使用环境 Windos XP操作系统;Visual ProFox 6.0 四、核心代码及调试过程 例3-27创建项目管理器SBGL,要求添入数据库sbsj,并查看该数据库。 图一 图二、“项目管理器”的数据选项卡 图三、“项目管理器”中的数据库与数据库表 例3-28从sbsj数据库所属的sb和zz两个表中抽取编号、名称和增值3个字段。,组成名称 为“我的视图”的SQL视图。 open database sbsj create sql view 我的视图; as select sb.编号,sb.名称,zz.增值from sb,zz where sb.编号=zz.编号

如有你有帮助,请购买下载,谢谢! 例3-29根据例3-28的查询要求,用视图设计器建立视图1,然后修改其中车床的增值来更新zz表原来的增值 图一、视图设计器-视图1 图二、视图设计器-视图1 图三、增值表 图四 图五、视图设计器更新源表数据 19.根据图3.30所示数据库sbsj的永久关系,若利用参照完整性生成器来删除sb。dbf的第一个记录,对其他3个表会否产生影响,是分级、限制和忽略3中情况来说明。 图一、数据库设计器 图二、sbsj.dbc“永久关系的参照完整性生成器” 级联:相关子表中的记录将自动删除 限制:子表有相关记录,在父表中删除记录就会产生“触发器失败”的提示信息 忽略:父表删除记录,与子表记录无关 五、总结 (自己写一些收获和体会) 通过这次上机练习让我学会了怎样在数据库中添加项目管理器、表的数据完整性的概念以及视图的各种操作,让我更容易的掌握理论知识的难点和一些基本命令的使用方法,以及一些平时在课堂上不注意的问题。在上机练习的过程中需要对每个细节都要留心,认真做好每一步这样才不至于出错,这就加强了平时不注意的问题得到回应,从而加深了细节问题的处理方式。在上机的学习之后更加了解了数据库表及其数据完整性是vfp重要的一个对象,命令熟练操作直接关系到数据库的成败。 第三次的上机操作,我了解了命令的使用方式对于建立数据库表及其数据完整性很重要,要学好各种命令以及数据库表及其数据完整性的使用方法,还需在多做习题加强学习。 六、附录

数据结构_实验三_栈和队列及其应用

实验编号:3四川师大《数据结构》实验报告2016年10月29日 实验三栈和队列及其应用_ 一.实验目的及要求 (1)掌握栈和队列这两种特殊的线性表,熟悉它们的特性,在实际问题背景下灵活运用它们; (2)本实验训练的要点是“栈”的观点及其典型用法; (3)掌握问题求解的状态表示及其递归算法,以及由递归程序到非递归程序的转化方法。 二.实验内容 (1)编程实现栈在两种存储结构中的基本操作(栈的初始化、判栈空、入栈、出栈等); (2)应用栈的基本操作,实现数制转换(任意进制); (3)编程实现队列在两种存储结构中的基本操作(队列的初始化、判队列空、入队列、出队列); (4)利用栈实现任一个表达式中的语法检查(括号的匹配)。 (5)利用栈实现表达式的求值。 注:(1)~(3)必做,(4)~(5)选做。 三.主要仪器设备及软件 (1)PC机 (2)Dev C++ ,Visual C++, VS2010等 四.实验主要流程、基本操作或核心代码、算法片段(该部分如不够填写,请另加附页)(1)编程实现栈在两种存储结构中的基本操作(栈的初始化、判栈空、入栈、出栈等); A.顺序储存: 代码部分: 栈" << endl; cout << " 2.出栈" << endl; cout << " 3.判栈空" << endl; cout << " 4.返回栈顶部数据" << endl; cout << " 5.栈长" << endl; cout << " 0.退出系统" << endl;

cout << "你的选择是:" ; } 链式储存: 代码部分: 栈"<>select; switch (select){ case 0:break; case 1: cout<<"push data:"; cin>>e; if(push(L,e)){

数据结构实验报告

数据结构实验报告 一.题目要求 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

数据结构实验报告图实验

邻接矩阵的实现 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; } }

数据结构堆栈与队列实验报告

实验二堆栈和队列 实验目的: 1.熟悉栈这种特殊线性结构的特性; 2.熟练并掌握栈在顺序存储结构和链表存储结构下的基本运算; 3.熟悉队列这种特殊线性结构的特性; 3.熟练掌握队列在链表存储结构下的基本运算。 实验原理: 堆栈顺序存储结构下的基本算法; 堆栈链式存储结构下的基本算法; 队列顺序存储结构下的基本算法; 队列链式存储结构下的基本算法; 实验内容: 第一题链式堆栈设计。要求 (1)用链式堆栈设计实现堆栈,堆栈的操作集合要求包括:初始化StackInitiate(S),非空否StackNotEmpty(S),入栈StackiPush(S,x),出栈StackPop(S,d),取栈顶数据元素StackTop(S,d); (2)设计一个主函数对链式堆栈进行测试。测试方法为:依次把数据元素1,2,3,4,5入栈,然后出栈并在屏幕上显示出栈的数据元素; (3)定义数据元素的数据类型为如下形式的结构体, Typedef struct { char taskName[10]; int taskNo; }DataType; 首先设计一个包含5个数据元素的测试数据,然后设计一个主函数对链式堆栈进行测试,测试方法为:依次吧5个数据元素入栈,然后出栈并在屏幕上显示出栈的数据元素。 第二题对顺序循环队列,常规的设计方法是使用対尾指针和对头指针,对尾指针用于指示当前的対尾位置下标,对头指针用于指示当前的対头位置下标。现要求: (1)设计一个使用对头指针和计数器的顺序循环队列抽象数据类型,其中操作包括:初始化,入队列,出队列,取对头元素和判断队列是否为空; (2)编写主函数进行测试。 程序代码: 第一题: (1)源程序"LinStack.h"如下: #define NULL 0 typedef struct snode { DataType data; struct snode *next; } LSNode; /*(1)初始化StackInitiate(LSNode ** head) */ void StackInitiate(LSNode ** head) /*初始化带头结点链式堆栈*/

数据结构实验报告图实验

图实验一,邻接矩阵的实现 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++) {

数据结构实验报告模板

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.实验目的 (1)掌握图的逻辑结构 (2)掌握图的邻接矩阵的存储结构 (3)验证图的邻接矩阵存储及其遍历操作的实现 2.实验内容 (1)建立无向图的邻接矩阵存储 (2)进行深度优先遍历 (3)进行广度优先遍历 3.设计与编码 #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 #include using namespace std; #include "" 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;

数据结构栈和队列实验报告.doc

南京信息工程大学实验(实习)报告 实验(实习)名称栈和队列日期2017.11.8 得分指导老师崔萌萌 系计算机系专业软件工程年级2016 班次(1) 姓名学号 一、实验目的 1、学习栈的顺序存储和实现,会进行栈的基本操作 2、掌握递归 3、学习队列的顺序存储、链式存储,会进行队列的基本操作 4、掌握循环队列的表示和基本操作 二、实验内容 1、用栈解决以下问题: (1)对于输入的任意一个非负十进制数,显示输出与其等值的八进制数,写出程序。(2)表达式求值,写出程序。 2、用递归写出以下程序: (1)求n!。 (2)汉诺塔程序,并截图显示3、4、5个盘子的移动步骤,写出移动6个盘子的移动次数。

3、编程实现:(1)创建队列,将asdfghjkl依次入队。(2)将队列asdfghjkl依次出队。 4、编程实现创建一个最多6个元素的循环队列、将ABCDEF依次入队,判断循环队列是否队满。 三、实验步骤 1.栈的使用 1.1 用栈实现进制的转换: 代码如下: #include #include using namespace std; int main() { stack s; //栈s; int n,radix; printf("请输入要转换的十进制非负整数: "); scanf("%d",&n); printf("请输入目标进制: "); scanf("%d",&radix);

printf("转换为%d进制: ",radix); while(n) { s.push(n%radix); n /= radix; } while(!s.empty()) { //非空 printf("%d",s.top()); s.pop(); } printf("\n"); return 0; } 运行结果如下: 2.2 求表达式的值 代码如下: #include #include #include #include #define true 1 #define false 0 #define OPSETSIZE 8 typedef int Status;

数据结构实验报告-答案.doc

数据结构实验报告-答案 数据结构(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“typedefstructnode//定义结点{chardata[10];//结点的数据域为字符串structnode*next;//结点的指针域}ListNode;typedefListNode*LinkList;//自定义LinkList单链表类型LinkListCreatListR1();//函数,用尾插入法建立带头结点的单链表LinkListCreatList(void);//函数,用头插入法建立带头结点的单链表ListNode*LocateNode();//函数,按值查找结点voidDeleteList();//函数,删除指定值的结点voidprintlist();//函数,打印链表中的所有值voidDeleteAll();//函数,删除所有结点,释放内存

华仔数据结构实验报告

本科实验报告 课程名称:数据结构 实验项目:线性结构、树形结构、图结构、查找、排序实验地点: 专业班级:学号: 学生姓名: 指导教师: 2011年12 月24 日

实验项目:线性结构 实验目的和要求 熟练掌握线性结构的基本操作在顺序表和链式表上的实现。 二、实验内容和原理 设顺序表递增有序,编写一个程序,将x插入,使之仍然有序。 三、主要仪器设备 使用的计算机:Nopated++ 四、操作方法与实验步骤 #include #define maxlen 50 typedef int elemtype; typedef elemtype sqlist[maxlen]; int creat(sqlist A) { int i,n; printf("Please input length:\n"); scanf("%d",&n); for(i=0;i=A[n-1]) {

A[n]=x; } else { while(A[i]=i;j--) A[j+1]=A[j]; A[i]=x; } return n+1; } void main() { sqlist A; int x,n; n=creat(A); disp(A,n); printf("Please input you want to insert:\n"); scanf("%d",&x); n=Insert(A,n,x); disp(A,n); } 五、实验数据记录和处理 六、实验结果与分析 这个程序为比较基础的程序 七、讨论、心得 该程序可以帮助我加深对线性表的理解,引发我对数据结构这门课的兴趣

《数据结构》实验报告

《数据结构》实验报告 实验序号:4 实验项目名称:栈的操作

附源程序清单: 1. #include #define MaxSize 100 using namespace std; typedef int ElemType; typedef struct { ElemType data[MaxSize]; int top; }SqStack; void InitStack(SqStack *st) //初始化栈 { st->top=-1; } int StackEmpty(SqStack *st) //判断栈为空{ return (st->top==-1); } bool Push(SqStack *st,ElemType x) //元素进栈{ if(st->top==MaxSize-1)

{ return false; } else { st->top++; //移动栈顶位置 st->data[st->top]=x; //元素进栈 } return true; } bool Pop(SqStack *st,ElemType &e) //出栈 { if(st->top==-1) { return false; } else { e=st->data[st->top]; //元素出栈 st->top--; //移动栈顶位置} return true; } //函数名:Pushs //功能:数组入栈 //参数:st栈名,a->数组名,i->数组个数 bool Pushs(SqStack *st,ElemType *a,int i) { int n=0; for(;n数组名,i->数组个数 bool Pops(SqStack *st,ElemType *a,int i) { int n=0; for(;n

数据结构图及其应用实验报告+代码

附件2: 北京理工大学珠海学院实验报告 ZHUHAI CAMPAUS OF BEIJING INSTITUTE OF TECHNOLOGY 实验题目图及其应用实验时间 2011.5.10 一、实验目的、意义 (1)熟悉图的邻接矩阵(或邻接表)的表示方法; (2)掌握建立图的邻接矩阵(或邻接表)算法; (3)掌握图的基本运算,熟悉对图遍历算法; (4)加深对图的理解,逐步培养解决实际问题的编程能力 二、实验内容及要求 说明1:学生在上机实验时,需要自己设计出所涉及到的函数,同时设计多组输入数据并编写主程序分别调用这些函数,调试程序并对相应的输出作出分析;修改输入数据,预期输出并验证输出的结果,加深对有关算法的理解。 具体要求: (1)建立图的邻接矩阵(或邻接表); (2)对其进行深度优先及广度优先遍历。 三、实验所涉及的知识点 1.创建一个图: CreateUDN(MGraph &G) 2.查找v顶点的第一个邻接点: FirstAdjVex(MGraph G,int v) 3. 查找基于v顶点的w邻接点的下一个邻接点: NextAdjVex(MGraph G,int v,int w) 4.图的矩阵输出: printArcs(MGraph G) 5:顶点定位: LocateVex(MGraph G,char v) 6. 访问顶点v输出: printAdjVex(MGraph G,int v) 7. 深度优先遍历: DFSTraverse(MGraph G,Status (*Visit)(MGraph G,int v)) 8. 广度优先遍历BFSTraverse(MGraph G,Status (*Visit)(MGraph G,int v)) 9. DFS,从第v个顶点出发递归深度优先遍历图G: DFS(MGraph G,int v) 四、实验记录 1.对顶点的定位其数组下标,利用了找到之后用return立即返回,在当图顶点 多的情况下节省了搜索时间,程序如下 //对顶点v定位,返回该顶点在数组的下标索引,若找不到则返回-1 int LocateVex(MGraph G,char v){ for (int i=0;i

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

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;

数据结构实验报告

《用哈夫曼编码实现文件压缩》 实验报告 课程名称数据结构 实验学期2015至2016学年第一学期 学生所在系部计算机学院 年级2014专业班级物联B142班 学生姓名杨文铎学号201407054201 任课教师白磊 实验成绩

用哈夫曼编码实现文件压缩 1、了解文件的概念。 2、掌握线性表的插入、删除的算法。 3、掌握Huffman树的概念及构造方法。 4、掌握二叉树的存储结构及遍历算法。 5、利用Haffman树及Haffman编码,掌握实现文件压缩的一般原理。 微型计算机、Windows系列操作系统、Visual C++6.0软件 根据ascii码文件中各ascii字符出现的频率情况创建Haffman树,再将各字符对应的哈夫曼编码写入文件中,实现文件压缩。 本次实验采用将字符用长度尽可能短的二进制数位表示的方法,即对于文件中出现的字符,无须全部都用S为的ascii码进行存储,根据他们在文件中出现的频率不同,我们利用Haffman算法使每个字符能以最短的二进制数字符进行存储,已达到节省存储空间,压缩文件的目的,解决了压缩需要采用的算法,程序的思路已然清晰: 1、统计需压缩文件中的每个字符出现的频率 2、将每个字符的出现频率作为叶子节点构建Haffman树,然后将树中结点引向 其左孩子的分支标“0”,引向其右孩子的分支标“1”;每个字符的编码 即为从根到每个叶子的路径上得到的0、1序列,这样便完成了Haffman 编码,将每个字符用最短的二进制字符表示。 3、打开需压缩文件,再将需压缩文件中的每个ascii码对应的haffman编码按bit 单位输出。 4、文件压缩结束。 (1)构造haffman树的方法一haffman算法 构造haffman树步骤: I.根据给定的n个权值{w1,w2,w3…….wn},构造n棵只有根结点的二叉 树,令起权值为wj。 II.在森林中选取两棵根结点权值最小的树作左右子树,构造一棵新的二叉树,置新二叉树根结点权值为其左右子树根结点权值之和。 III.在森林中删除这两棵树,同时将得到的二叉树加入森林中。 IV.重复上述两步,知道只含一棵树为止,这棵树即哈夫曼树。 对于haffman的创建算法,有以下几点说明: a)这里的Haffman树采用的是基于数组的带左右儿子结点及父结点下标作为

数据结构图实验报告

数据结构教程 上机实验报告 实验七、图算法上机实现 一、实验目的: 1.了解熟知图的定义和图的基本术语,掌握图的几种存储结构。 2.掌握邻接矩阵和邻接表定义及特点,并通过实例解析掌握邻接 矩阵和邻接表的类型定义。 3.掌握图的遍历的定义、复杂性分析及应用,并掌握图的遍历方 法及其基本思想。 二、实验内容: 1.建立无向图的邻接矩阵 2.图的深度优先搜索 3.图的广度优先搜索 三、实验步骤及结果: 1.建立无向图的邻接矩阵: 1)源代码: #include "" #include "" #define MAXSIZE 30 typedef struct

{ char vertex[MAXSIZE]; ertex=i; irstedge=NULL; irstedge; irstedge=p; p=(EdgeNode*)malloc(sizeof(EdgeNode)); p->adjvex=i; irstedge; irstedge=p; } } int visited[MAXSIZE]; ertex); irstedge;

ertex=i; irstedge=NULL; irstedge;irstedge=p; p=(EdgeNode *)malloc(sizeof(EdgeNode)); p->adjvex=i; irstedge; irstedge=p; } } typedef struct node { int data; struct node *next; }QNode; ertex); irstedge;ertex); //输出这个邻接边结点的顶点信息 visited[p->adjvex]=1; //置该邻接边结点为访问过标志 In_LQueue(Q,p->adjvex); //将该邻接边结点送人队Q }

数据结构栈和队列实验报告

《数据结构》课程实验报告 实验名称栈和队列实验序号实验日期 姓名院系班级学号 专业指导教师成绩 教师评语 一、实验目的和要求 (1)理解栈和队列的特征以及它们之间的差异,知道在何时使用那种数据结构。 (2)重点掌握在顺序栈上和链栈上实现栈的基本运算算法,注意栈满和栈空的条件。 (3)重点掌握在顺序队上和链队上实现队列的基本运算算法,注意循环队队列满和队空的条件。 (4)灵活运用栈和队列这两种数据结构解决一些综合应用问题。 二、实验项目摘要 编写一个程序algo3-1.cpp,实现顺序栈的各种基本运算,并在此基础上设计一个主程序并完成如下功能:(1)初始化栈s; (2)判断栈s是否非空; (3)依次进栈元素a,b,c,d,e; (4)判断栈s是否非空; (5)输出栈长度; (6)输出从栈顶到栈底元素; (7)输出出栈序列; (8)判断栈s是否非空; (9)释放栈。 编写一个程序algo3-3.cpp,实现顺序环形队列的各种基本运算,并在此基础上设计一个主程序并完成如下功能: (1)初始化队列q; (2)判断队列q是否非空; (3)依次进队列a,b,c; (4)出队一个元素,输出该元素; (5)输出队列q的元素个数; (6)依次进队列元素d,e,f; (7)输出队列q的元素个数; (8)输出出队序列; (9)释放队列。

三、实验预习内容 栈的顺序存储结构及其基本运算实现(初始化栈,销毁栈,求栈的长度,判断栈是否为空,进栈,取栈顶元素,显示栈中元素) 队列的顺序存储结构及其基本运算实现(初始化队列,销毁队列,判断队列是否为空,入队列,出队列) 三、实验结果与分析 3-1 #define maxsize 100 #include #include using namespace std; typedef char ElemType; typedef struct { ElemType data[maxsize]; int top; } SqStack; void InitStack(SqStack * &s) { s=(SqStack *)malloc(sizeof(SqStack)); s->top=-1; } int StackEmpty(SqStack *s) { return(s->top==-1); } int Push(SqStack *&s,ElemType e) { if(s->top==maxsize-1) return 0; s->top++; s->data[s->top]=e; return 1; } int Pop(SqStack *&s,ElemType &e) { if(s->top==-1) return 0; e=s->data[s->top];

相关文档
最新文档