文档库 最新最全的文档下载
当前位置:文档库 › 数据结构实验三

数据结构实验三

数据结构实验三
数据结构实验三

实验三的实验报告

学期: 2019 至_2020 第 2 学期 2/17/2020

课程名称: 数据结构专业:信息与计算科学 09 级5班实验编号: 03 实验项目:栈和队列实验指导教师 _冯山_

姓名:王朝辉学号: 2017060231 实验成绩:

一实验目的:

(1)熟练掌握栈和队列的抽象数据类型及其结构特点;

(2)实现基本的栈和队列的基本操作算法程序。

二实验内容:(类C算法的程序实现,任选其一)

(1) 设计与实现基本的堆栈和队列结构下的各种操作(如堆栈的PUSH、POP

等操作)(必做);

(2)以表达式计算为例,完成一个可以进行算术表达式计算功能的算法设计

与实现(选做);

(3)以迷宫问题为例,以堆栈结构完成迷宫问题的求解算法和程序(选做)。三实验准备:

1) 计算机设备;2)程序调试环境的准备,如TC环境;3)实验内容的算法分

析与代码设计与分析准备。

四实验步骤:

1.录入程序代码并进行调试和算法分析;

2.编写实验报告。

五实验过程

一设计与实现基本的堆栈结构下的各种操作(如堆栈的PUSH、POP等操作)(1)问题描述

实现堆栈各种基本操作,如Pop,Push,GetTop等操作,即输入数据,通过Push入栈,再通过Pop操作输出出栈的元素,即入栈a,b,c,d,出栈d,c,b,a (2)算法实现及基本思想

堆栈是后进先出的线性表,由Push输入元素,Pop输出元素,堆栈的Push 操作思想,即插入元素e为新的的栈顶元素,先判断栈满与否,追加存储空间,然后将e值赋给栈顶指针Top。输入数据时用for循环

堆栈的Pop操作思想,先判断栈是否为空,若栈不空,则删除栈的栈顶元素,用e返回其值,

(3)数据结构

栈的顺序存储结构

Typedef struct

{

SelemType *base;//栈底指针,在栈构造之前和销毁之后,base的值为NULL

SelemType *top;//栈顶指针

int stacksize;//当前已分配的存储空间,以元素为单位。

}SqStack;

(4)算法描述

//构造一个空栈

Status InitStack(SqStack &S)//构造一个空栈S

{

S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SelemType));

If(!S.base) exit(OVERFLOW);//存储分配失败

S.top=S.base;

S.stacksize=STACK_INIT_SIZE;

Return OK;

}

Status GetTop(SqStack S,SelemType &e)

//若栈不空,则用e返回S的栈顶元素,并返回OK,否则返回Error

if (S.base==S.top) return ERROR;

e= *(S.top-1);

return OK;

Status Push(SqStack &S,SelemType e)

//插入元素e为新的栈顶元素,即压栈

if(S.top-S.base>=S.stacksize)

S.base=(SelemType *)

realloc(S.base,(S.stacksize+STACKINCREAMENT)*sizeof(SelemType));

if(!S.base) exit(OVERFLOW)

S.top=S.base+S.stacksize;

S.stacksize+=STACKINCREAMENT;

*S.top++=e;

Status Pop((SqStack &S,SelemType &e)

//删除s的栈顶元素,用e返回其值

if(S.top==S.base) return ERROR;

e=* --S.top;

return OK;

Status StackEmpty(SqStack S)//空栈的判定

{

if(S.top=S.base) return TURE;

else return FALSE;

}

(5)程序的源代码

堆栈的Pop和Push操作源代码:

#include

#include

#define OVERFLOW 1

#define OK 2

#define ERROR 0

#define STACK_INIT_SIZE 100

#define STACKINCREMENT 10

typedef struct

{

int *base;

int *top;

int stacksize;

}Sqstack;

int Initstack(Sqstack *S)

{

S->base=(int *)malloc(STACK_INIT_SIZE * sizeof(int));

if(!S->base) exit(OVERFLOW);

S->top=S->base;

S->stacksize=STACK_INIT_SIZE;

return OK;

}

int Push(Sqstack *S,int e)

{

if(S->top-S->base>=S->stacksize)

{

S->base=(int *)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(int));

if(!S->base) exit(OVERFLOW);

S->top=S->base+S->stacksize;

S->stacksize+=STACKINCREMENT;

}

*(S->top++)=e;

return OK;

}

int Pop(Sqstack *S,int *e)

{

if(S->top==S->base) return ERROR;

*e=*(--S->top);

return OK;

}

void main()

{

Sqstack S;

int i,j,e;

Initstack(&S);

printf("please input the number of the stack:");

scanf("%d",&j);

printf("please input the elements of the stack:");

for(i=0;i

{

scanf("%d",&e);

Push(&S,e);

}

printf("The sequence of the stack:\n");

for(i=0;i

{

Pop(&S,&e);

printf("%d\n",e);

}

}

(6)代码测试

1)当进栈元素为有序的{1,2,3},出栈元素为{3,2,1},结果正确

please input the number of the stack:3

please input the elements of the stack:1 2 3

The sequence of the stack:

3

2

1

2)当进栈元素为无序的{7,5,9},出栈元素为{9,5,7},结果正确

please input the number of the stack:3

please input the elements of the stack:7 5 9

The sequence of the stack:

9

5

7

(7)测试分析

由上述代码测试结果可知,堆栈的输入和输出与元素有序或者无序没有关系,且都是由后进先出的顺序输出。

二队列结构下的基本操作

(1)问题描述

实现队列的各种基本操作,如EnQueue,DeQueue等操作,即输入数据,通过EnQueue入队,再通过DeQueue操作输出队列的元素,即入队元素为a,b,c,d, 出队元素为a,b,c,d

(2)算法实现及基本思想

队列是一种先进先出的线性表,由EnQueue输入队列元素,DeQueue输出队列元素

(3)数据结构

队列的链式存储结构

typedef struct Qnode

{

QelemType data;

Struct Qnode *next;

}Qnode,*QueuePtr;

typedef struct

{

QueuePtr front;//队头指针

QueuePtr rear;//队尾指针

}linkQueue;

(4)算法描述

//构造一个空队列

int InitQueue(LinkQueue Q)

{

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

if(!Q.front) exit(OVERFLOW);

Q.front->next=NULL;

return OK;

//插入元素e为队列Q的新的队尾元素

int EnQueue(LinkQueue Q,int e)

{

LinkQueue p;

p=(QueuePtr *)malloc(sizeof(QNode));

if(!p) exit(OVERFLOW);

p->data=e;p->next=NULL;

Q.rear->next=p;

Q.rear=p;

return OK;

}

//出队,删除Q的队头元素,用e返回其值

int DeQueue(LinkQueue Q,int *e)

{

LinkQueue p;

if(Q.front==Q.rear) return ERROR;

p=Q.front->next;

e=p->data;

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

if(Q.rear==p) Q.rear=Q.front;

free(p);

return OK;

}

(5)程序的源代码

队列的EnQueue和DeQueue操作源代码:

#include

#define NULL 0

#define OVERFLOW 1

#define OK 2

#define ERROR 0

typedef struct QNode

{

int data;

struct QNode *next;

}QueuePtr;

typedef struct

{

QueuePtr *front;

QueuePtr *rear;

}LinkQueue;

int InitQueue(LinkQueue *Q)

{

Q->front=Q->rear=(QueuePtr *)malloc(sizeof(QueuePtr)); if(!Q->front) exit(OVERFLOW);

Q->front->next=NULL;

return OK;

}

int EnQueue(LinkQueue *Q,int e)

{

QueuePtr *p;

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

if(!p) exit(OVERFLOW);

p->data=e;p->next=NULL;

Q->rear->next=p;

Q->rear=p;

return OK;

}

int DeQueue(LinkQueue *Q,int *e)

{

QueuePtr *p;

if(Q->front==Q->rear) return ERROR;

p=Q->front->next;

*e=p->data;

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

if(Q->rear==p) Q->rear=Q->front;

free(p);

return OK;

}

int main(void)

{

LinkQueue Q;

int i,j,e;

clrscr();

InitQueue(&Q);

printf("please input the length of LinkQueue:");

scanf("%d",&j);

for(i=0;i

{ scanf("%d",&e);

EnQueue(&Q,e);

}

printf("The result is:\n");

for(i=0;i

{

DeQueue(&Q,&e);

printf("%d\n",e);

}

return 0;

}

(6)代码测试

队列测试,输入入队元素为{1,8,9,7},出队元素为{1,8,9,7},运行正确。

please input the length of LinkQueue:4

please input the elements of LinkQueue:1 8 9 7

The result is:

1

8

9

7

(7)测试分析

由上述代码测试结果可知,队列的输入和输出与元素有序或者无序没有关系,且都是由先进先出的顺序输出,并且元素的重复也没有关系。

(8)进一步改进

三表达式求值问题

(1)问题描述

设计一个程序,演示用算符优先法对算术表达式求值的过程。利用算符优先关系,实现对算术四则混合运算表达式的求值。

输入的形式:表达式,例如2*(3+4),在表达式中包含的运算符只能有'+' 、'-' 、'*' 、'/' 、'('、')';输出运算结果,例如2*(3+4)=14;即对表达式求值并输出。

(2)算法实现及基本思想

为实现算符优先算法,使用了两个工作栈,一个称为Numstack,用以存放操作数和运算结果,另一个称为OpStack,用以存放运算符,表达式起始符“#”为运算符栈的栈底元素,依次读入表达式中的每个字符,若是操作数进NumStack,若是运算符则和OpStack栈的栈顶运算符比较优先权后作相应的操作,直到运算完毕,输出结果,在本程序中,运用了头文件为下的isdigit函数,它的功能是检查输入的ch是否为数字,是返回1,否则返回0.

(3)数据结构

静态栈的数据结构

typedef struct

{

int top;

double array[N]; //存放实数的栈

}NumStack;

typedef struct

{

int top;

char array[N];

}OpStack; //存放操作符的栈

(4)算法描述

//进行运算的函数

double Calc(double a,double b,char c)

{

double result;

switch(c)

{

case '+':result=a+b;break;

case '-':result=a-b;break;

case '*':result=a*b;break;

case '/':result=a/b;break;

}

return result;

}

//判断运算符优先级的函数

char Priority(char y,char x)

{

char priority='<';

switch(x)

{

case '+':

case '-':if(y=='(' || y=='#')priority='>';break;

case '*':

case '/':if(y=='(' || y=='#'|| y=='+' || y=='-')priority='>';break;

case '(':priority='>';break;

case ')':if(y=='(')priority='=';break;

case '#':if(y=='#')priority='=';break;

default:priority='E';

}

return priority;

}

//对输入的表达式求值

void EvaluateProcess(NumStack *numstack,OpStack *opstack,char x) {

double a,b;

char c;

static double tempnum=0.00000000;

static int len=10;

static int dot=0,flags=0;

if(isdigit(x) || x=='.') //判断输入的x为数字或是否带有小数点{

if(x=='.')dot=1;

else

{

if(dot==0)

tempnum=tempnum*10+Cint(x);

else

{

tempnum=tempnum+(double)Cint(x)/len;

len*=10;

}

}

}

else

{

if(flags==0 && x!='(')

{

PushNum(numstack,tempnum);

tempnum=0.00000000;

len=10;

dot=0;

}

switch(Priority(opstack->array[opstack->top-1],x))

{

case '>':PushOp(opstack,x);flags=0;break;

case '<':

PopOp(opstack,&c);

PopNum(numstack,&b);

PopNum(numstack,&a);

PushNum(numstack,Calc(a,b,c));flags=1;

EvaluateProcess(numstack,opstack,x);break;

case '=':PopOp(opstack,&c);flags=1;break;

default:printf("Wrong Express!");exit(0);

}

}

}

(5)程序的源代码

#include

#include

#include

#define N 50

typedef struct

{

int top;

double array[N];

}NumStack;

typedef struct

{

int top;

char array[N];

}OpStack;

int Cint(char mychar)

{

return (mychar-48);

}

void PushNum(NumStack *numstack,double num) {

numstack->top++;

numstack->array[numstack->top-1]=num;

}

void PopNum(NumStack *numstack,double *num) {

*num=numstack->array[numstack->top-1];

numstack->top--;

}

void PushOp(OpStack *opstack,char s)

{

opstack->top++;

opstack->array[opstack->top-1]=s;

}

void PopOp(OpStack *opstack,char *s)

{

*s=opstack->array[opstack->top-1];

opstack->top--;

}

double Calc(double a,double b,char c)

{

double result;

switch(c)

{

case '+':result=a+b;break;

case '-':result=a-b;break;

case '*':result=a*b;break;

case '/':result=a/b;break;

}

return result;

}

char Priority(char y,char x)

{

char priority='<';

switch(x)

{

case '+':

case '-':if(y=='(' || y=='#')priority='>';break;

case '*':

case '/':if(y=='(' || y=='#'|| y=='+' || y=='-')priority='>';break;

case '(':priority='>';break;

case ')':if(y=='(')priority='=';break;

case '#':if(y=='#')priority='=';break;

default:priority='E';

}

return priority;

}

void EvaluateProcess(NumStack *numstack,OpStack *opstack,char x) {

double a,b;

char c;

static double tempnum=0.00000000;

static int len=10;

static int dot=0,flags=0;

if(isdigit(x) || x=='.')

{

if(x=='.')dot=1;

else

{

if(dot==0)

tempnum=tempnum*10+Cint(x);

else

{

tempnum=tempnum+(double)Cint(x)/len;

len*=10;

}

}

}

else

{

if(flags==0 && x!='(')

{

PushNum(numstack,tempnum);

tempnum=0.00000000;

len=10;

dot=0;

}

switch(Priority(opstack->array[opstack->top-1],x))

{

case '>':PushOp(opstack,x);flags=0;break;

case '<':

PopOp(opstack,&c);

PopNum(numstack,&b);

PopNum(numstack,&a);

PushNum(numstack,Calc(a,b,c));flags=1;

EvaluateProcess(numstack,opstack,x);break;

case '=':PopOp(opstack,&c);flags=1;break;

default:printf("Wrong Express!");exit(0);

}

}

}

main()

{

NumStack numstack;

OpStack opstack;

char s[N];

int i=0;

numstack.top=0;

opstack.top=0;

PushOp(&opstack,'#');

printf("\nEnter your expression and end it with #:");

scanf("%s",s);

for(i=0;i

EvaluateProcess(&numstack,&opstack,s[i]);

printf("The result is %f",numstack.array[numstack.top-1]);

}

(6)代码测试

1)输入表达式:3*4/2+(10-(5+3)*2)-(-2)=2,结果正确。

Enter your expression and end it with #:3*4/2+(10-(5+3)*2)-(-2)# The result is 2.000000

2)输入表达式:10=,结果为:The result is 1.#INF00

Enter your expression and end it with #:1/0#

The result is 1.#INF00

(7)测试分析

输入语法正确的、不含变量的数学表达式(运算符只能是'+' 、'-' 、'*' 、'/' 、'('、')'),回车即输出结果,由测试数据1可知,对于测试数据2,当输入的分母为0时,是无效的表达式。

数据结构实验报告3--链串

宁波工程学院电信学院计算机教研室 实验报告 课程名称:___ 数据结构 ___ __ 实验项目:链串的基本算法 指导教师: 实验位置:电子楼二楼机房姓名: 学号: 班级:计科102 日期: 2011/10/13 一、实验目的 1)熟悉串的定义和串的基本操作。 2)掌握链串的基本运算。 3)加深对串数据结构的理解,逐步培养解决实际问题的编程能力。 二、实验环境 装有Visual C++6.0的计算机。 三、实验内容 编写一个程序,实现链串的各种基本运算,并在此基础上设计一个主程序。具体如下: 编写栈的基本操作函数 链串类型定义如下所示: typedef struct snode{ char data; struct snode *next; }listring; (1)串赋值Assign(s,t) 将一个字符串常量赋给串s,即生成一个其值等于t的串s (2)串复制StrCopy(s,t)

?将串t赋给串s (3)计算串长度StrLength(s) ?返回串s中字符个数 (4)判断串相等StrEqual(s,t) ?若两个串s与t相等则返回1;否则返回0。 (5)串连接Concat(s,t) ?返回由两个串s和t连接在一起形成的新串。 (6)求子串SubStr(s,i,j) ?返回串s中从第i(1≤i≤StrLength(s))个字符开始的、由连续j 个字符组成的子串。 (7)插入InsStr (s,i,t) ?将串t插入到串s的第i(1≤i≤StrLength(s)+1)个字符中,即将t 的第一个字符作为s的第i个字符,并返回产生的新串(8)串删除DelStr (s,i,j) ?从串s中删去从第i(1≤i≤StrLength(s))个字符开始的长度为j 的子串,并返回产生的新串。 (9)串替换RepStr (s,s1,s2) ?在串s中,将所有出现的子串s1均替换成s2。 (10)输出串DispStr(s) ?输出串s的所有元素值 (11)判断串是否为空IsEmpty(s) 编写主函数 调用上述函数实现下列操作: (1)建立串s=“abcdefghijklmn”,串s1=“xyz”,串t=“hijk” (2)复制串t到t1,并输出t1的长度 (3)在串s的第9个字符位置插入串s1而产生串s2,并输出s2 (4)删除s第2个字符开始的5个字符而产生串s3,并输出s3 (5)将串s第2个字符开始的3个字符替换成串s1而产生串s4,并输出s4 (6)提取串s的第8个字符开始的4个字符而产生串s5,并输出s5 (7)将串s1和串t连接起来而产生串s6,并输出s6 (8)比较串s1和s5是否相等,输出结果 程序清单: #include

数据结构实验报告格式

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

北邮信通院数据结构实验报告三哈夫曼编码器之欧阳光明创编

数据结构实验报告 欧阳光明(2021.03.07) 实验名称:实验三树——哈夫曼编/解码器 学生姓名: 班级: 班内序号: 学号: 日期: 2014年12月11日 1.实验要求 利用二叉树结构实现赫夫曼编/解码器。 基本要求: 1、初始化(Init):能够对输入的任意长度的字符串s进行统 计,统计每个字符的频度,并建立赫夫曼树 2、建立编码表(CreateTable):利用已经建好的赫夫曼树进行编 码,并将每个字符的编码输出。 3、编码(Encoding):根据编码表对输入的字符串进行编码,并 将编码后的字符串输出。 4、译码(Decoding):利用已经建好的赫夫曼树对编码后的字符 串进行译码,并输出译码结果。 5、打印(Print):以直观的方式打印赫夫曼树(选作) 6、计算输入的字符串编码前和编码后的长度,并进行分析, 讨论赫夫曼编码的压缩效果。 测试数据: I love data Structure, I love Computer。I will try my best to study

data Structure. 提示: 1、用户界面可以设计为“菜单”方式:能够进行交互。 2、根据输入的字符串中每个字符出现的次数统计频度,对没有 出现的 字符一律不用编码。 2. 程序分析 2.1 存储结构 Huffman树 给定一组具有确定权值的叶子结点,可以构造出不同的二叉树,其中带权路径长度最小的二叉树称为Huffman树,也叫做最优二叉树。

weight lchild rchildparent 2-1-1-1 5-1-1-1 6-1-1-1 7-1-1-1 9-1-1-1 weight lchild rchild parent

数据结构实验

实验2 查找算法的实现和应用?实验目的 1. 熟练掌握静态查找表的查找方法; 2. 熟练掌握动态查找表的查找方法; 3. 掌握hash表的技术. ?实验内容 1.用二分查找法对查找表进行查找; 2.建立二叉排序树并对该树进行查找; 3.确定hash函数及冲突处理方法,建立一个hash表并实现查找。 程序代码 #include using namespace std; int main() { int arraay[10]={1,2,3,4,5,6,7,8,9,10}; int binary_search(int a[10],int t); cout<<"Enter the target:"; int target; cin>>target; binary_search(arraay,target); return 0; } int binary_search(int a[10],int t) { int bottom=0,top=9; while(bottom

cout<<"Not present!"; } return 0; } 结果 二叉排序树 #include #include #include using namespace std; typedef int keyType; typedef struct Node { keyType key; struct Node* left; struct Node* right; struct Node* parent; }Node,*PNode; void inseart(PNode* root, keyType key) { PNode p = (PNode)malloc(sizeof(Node)); p -> key = key;

数据结构实验报告

数据结构实验报告 一.题目要求 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)掌握使用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始终指向生成的单链表的最后一个节点

北邮数据结构实验3哈夫曼编码

数据结构实验报告 实验名称:实验3——哈夫曼编码 学生姓名: 班级: 班内序号: 学号: 日期:2013年11月24日 1.实验要求 利用二叉树结构实现赫夫曼编/解码器。 基本要求: 1、初始化(Init):能够对输入的任意长度的字符串s进行统计,统计每个 字符的频度,并建立赫夫曼树 2、建立编码表(CreateTable):利用已经建好的赫夫曼树进行编码,并将每 个字符的编码输出。 3、编码(Encoding):根据编码表对输入的字符串进行编码,并将编码后的 字符串输出。 4、译码(Decoding):利用已经建好的赫夫曼树对编码后的字符串进行译 码,并输出译码结果。 5、打印(Print):以直观的方式打印赫夫曼树(选作) 6、计算输入的字符串编码前和编码后的长度,并进行分析,讨论赫夫曼 编码的压缩效果。 2. 程序分析 2.1存储结构: struct HNode { char c;//存字符内容 int weight; int lchild, rchild, parent; }; struct HCode

{ char data; char code[100]; }; //字符及其编码结构 class Huffman { private: HNode* huffTree; //Huffman树 HCode* HCodeTable; //Huffman编码表 public: Huffman(void); void CreateHTree(int a[], int n); //创建huffman树 void CreateCodeTable(char b[], int n); //创建编码表 void Encode(char *s, string *d); //编码 void Decode(char *s, char *d); //解码 void differ(char *,int n); char str2[100];//数组中不同的字符组成的串 int dif;//str2[]的大小 ~Huffman(void); }; 结点结构为如下所示: 三叉树的节点结构: struct HNode//哈夫曼树结点的结构体 { int weight;//结点权值 int parent;//双亲指针 int lchild;//左孩子指针 int rchild;//右孩子指针 char data;//字符 }; 示意图为: int weight int parent int lchild int rchild Char c 编码表节点结构:

数据结构实验报告

姓名: 学号: 班级: 2010年12月15日

实验一线性表的应用 【实验目的】 1、熟练掌握线性表的基本操作在顺序存储和链式存储上的实现。、; 2、以线性表的各种操作(建立、插入、删除、遍历等)的实现为重点; 3、掌握线性表的动态分配顺序存储结构的定义和基本操作的实现; 4、通过本章实验帮助学生加深对C语言的使用(特别是函数的参数调用、指针类型的 应用和链表的建立等各种基本操作)。 【实验内容】 约瑟夫问题的实现:n只猴子要选猴王,所有的猴子按1,2,…,n编号围坐一圈,从第一号开始按1,2…,m报数,凡报到m号的猴子退出圈外,如此次循环报数,知道圈内剩下一只猴子时,这个猴子就是猴王。编写一个程序实现上述过程,n和m由键盘输入。【实验要求】 1、要求用顺序表和链表分别实现约瑟夫问题。 2、独立完成,严禁抄袭。 3、上的实验报告有如下部分组成: ①实验名称 ②实验目的 ③实验内容:问题描述:数据描述:算法描述:程序清单:测试数据 算法: #include #include typedef struct LPeople { int num; struct LPeople *next; }peo; void Joseph(int n,int m) //用循环链表实现 { int i,j; peo *p,*q,*head; head=p=q=(peo *)malloc(sizeof(peo)); p->num=0;p->next=head; for(i=1;inum=i;q->next=p;p->next=head; } q=p;p=p->next; i=0;j=1; while(i

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

实验编号: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、顺序储存: ?代码部分: //Main、cpp: #include"SStack、h" int main() { SqStack S; SElemType e;

int elect=1; InitStack(S); cout << "已经创建一个存放字符型得栈" << endl; while (elect) { Muse(); cin >> elect; cout << endl; switch (elect) { case 1: cout << "input data:"; cin >> e; Push(S, e); break; case 2: if(Pop(S, e)) {cout << e <<" is pop"<< endl; } else{cout<<"blank"<

数据结构实验报告模板

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

数据结构实验

长春大学计算机学院网络工程专业 数据结构实验报告 实验名称:实验二栈和队列的操作与应用 班级:网络14406 姓名:李奎学号:041440624 实验地点:日期: 一、实验目的: 1.熟练掌握栈和队列的特点。 2.掌握栈的定义和基本操作,熟练掌握顺序栈的操作及应用。 3.掌握链队的入队和出队等基本操作。 4.加深对栈结构和队列结构的理解,逐步培养解决实际问题的编程能力。 二、实验内容、要求和环境: 注:将完成的实验报告重命名为:班级+学号+姓名+(实验二),(如:041340538张三(实验二)),发邮件到:ccujsjzl@https://www.wendangku.net/doc/8f18454411.html,。提交时限:本次实验后24小时之内。 阅读程序,完成填空,并上机运行调试。 1、顺序栈,对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数 (1)文件SqStackDef. h 中实现了栈的顺序存储表示 #define STACK_INIT_SIZE 10 /* 存储空间初始分配量*/ #define STACKINCREMENT 2 /* 存储空间分配增量*/ typedef struct SqStack { SElemType *base; /* 在栈构造之前和销毁之后,base 的值为NULL */ SElemType *top; /* 栈顶指针*/ int stacksize; /* 当前已分配的存储空间,以元素为单位*/ }SqStack; /* 顺序栈*/ (2)文件SqStackAlgo.h 中实现顺序栈的基本操作(存储结构由SqStackDef.h 定义) Status InitStack(SqStack &S) { /* 构造一个空栈S */ S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!S.base) exit(OVERFLOW); /* 存储分配失败*/ S.top=S.base; S.stacksize=STACK_INIT_SIZE; return OK; } int StackLength(SqStack S) { // 返回S 的元素个数,即栈的长度, 编写此函数

数据结构实验3二叉树

一、实验目的 1.进一步掌握指针变量的含义。 2.掌握二叉树的结构特征,以及各种存储结构的特点及使用范围。 3.掌握用指针类型描述、访问和处理二叉树的运算。 二、实验要求 1.认真阅读和掌握本实验的参考程序。 2.按照对二叉树的操作需要,在创建好二叉树后再通过遍历算法验证创建结果。3.保存程序的运行结果,并结合程序进行分析。 三、实验内容 以下参考程序是按完全二叉树思想将输入的字符串生成二叉树,并通过遍历来验证二叉树创建正确与否,但不能创建非完全二叉树,请认真研究该程序,然后模仿教材例6.4初始化方式创建二叉树:所有的空指针均用#表示,如教材图 6-13对应的二叉树,建立时的初始序列为:AB#D##CE##F##。然后通过遍历算法验证二叉树是否正确(先递归验证后非递归验证)。 参考程序略 程序代码如下: #include "stdio.h" #include "stdlib.h" typedef char Datatype; #define MAXSIZE 100 typedef struct bnode { Datatype data; struct bnode *lchild,*rchild; }BNode,*BTree; typedef struct{ BTree data[MAXSIZE]; int front,rear; }seqqueue,*Pseqqueue; typedef struct{ BNode *node; int flag; }Data; typedef struct node { Data Data[MAXSIZE]; int top; }SeqStack,*PSeqStack; PSeqStack Init(void)

北邮数据结构实验四-链表排序

数据结构实验报告 实验名称:实验四——链表的排序 学生姓名: 班级: 班内序号: 学号: 日期: 1.实验要求 [内容要求] 使用链表实现下面各种排序算法,并进行比较。 排序算法: 1、插入排序 2、冒泡排序 3、快速排序 4、简单选择排序 5、其他 要求: 1、测试数据分成三类:正序、逆序、随机数据 2、对于这三类数据,比较上述排序算法中关键字的比较次数和移动次数(其 中关键字交换计为3次移动)。 3、对于这三类数据,比较上述排序算法中不同算法的执行时间,精确到微秒 (选作) 4、对2和3的结果进行分析,验证上述各种算法的时间复杂度 编写测试main()函数测试线性表的正确性 代码要求 1、必须要有异常处理,比如删除空链表时需要抛出异常; 2、保持良好的编程的风格: 代码段与段之间要有空行和缩近 标识符名称应该与其代表的意义一致 函数名之前应该添加注释说明该函数的功能 关键代码应说明其功能 3、递归程序注意调用的过程,防止栈溢出

2. 程序分析 2.1 存储结构 [内容要求] 存储结构:双链表 2.2 关键算法分析 [内容要求] 定义类: template class LinkList { public: LinkList(){front = new Node ;front->next=rear;front->prior=NULL;rear=new Node;rear->next=NULL;rear->prior=front;} LinkList(T a[],int n); void BackLinkList(T a[]);//恢复原链表 ~LinkList();//析构函数 void PrintList();//打印数列 void InsertSort();//插入排序 void BubbleSort();//冒泡排序 Node * Partion(Node *i,Node *j);//快速排序中寻找轴值的函数 void Qsort(Node *i,Node *j);//快速排序 void SelectSort();//选择排序 Node*front; Node*rear; }; 成员函数包括:构造函数:单链表,打印单链表,插入排序,快速排序,冒泡排序,选择排序,析构函数 公有成员:头指针和尾指针 1、构造函数: LinkList::LinkList(T a[],int n) { front=new Node; rear=new Node; front->prior=NULL;front->next=rear; rear->next=NULL;rear->prior=front; Node *s; for (int i=n-1;i>=0;i--) {

数据结构 实验报告三

实验三的实验报告 学期: 2010 至_2011 第 2 学期 2011年 3月 27日课程名称: 数据结构专业:信息与计算科学 09 级5班实验编号: 03 实验项目:栈和队列实验指导教师 _冯山_姓名:朱群学号: 2009060548 实验成绩: 一实验目的: (1)熟练掌握栈和队列的抽象数据类型及其结构特点; (2)实现基本的栈和队列的基本操作算法程序。 二实验内容:(类C算法的程序实现,任选其一) (1) 设计与实现基本的堆栈和队列结构下的各种操作(如堆栈的PUSH、POP 等操作)(必做); (2)以表达式计算为例,完成一个可以进行算术表达式计算功能的算法设计 与实现(选做); (3)以迷宫问题为例,以堆栈结构完成迷宫问题的求解算法和程序(选做)。三实验准备: 1) 计算机设备;2)程序调试环境的准备,如TC环境;3)实验内容的算法分 析与代码设计与分析准备。 四实验步骤: 1.录入程序代码并进行调试和算法分析; 2.编写实验报告。 五实验过程 一设计与实现基本的堆栈结构下的各种操作(如堆栈的PUSH、POP等操作)(1)问题描述 实现堆栈各种基本操作,如Pop,Push,GetTop等操作,即输入数据,通过Push入栈,再通过Pop操作输出出栈的元素,即入栈a,b,c,d,出栈d,c,b,a (2)算法实现及基本思想 堆栈是后进先出的线性表,由Push输入元素,Pop输出元素,堆栈的Push 操作思想,即插入元素e为新的的栈顶元素,先判断栈满与否,追加存储空间,然后将e值赋给栈顶指针Top。输入数据时用for循环 堆栈的Pop操作思想,先判断栈是否为空,若栈不空,则删除栈的栈顶元素,用e返回其值, (3)数据结构 栈的顺序存储结构 Typedef struct {

北邮信通院数据结构实验报告三哈夫曼编码器

数据结构实验报告 实验名称:实验三树——哈夫曼编/解码器 学生姓名: 班级: 班内序号: 学号: 日期:2014年12月11日 1.实验要求 利用二叉树结构实现赫夫曼编/解码器。 基本要求: 1、初始化(Init):能够对输入的任意长度的字符串s进行统计,统计每个 字符的频度,并建立赫夫曼树 2、建立编码表(CreateTable):利用已经建好的赫夫曼树进行编码,并将每 个字符的编码输出。 3、编码(Encoding):根据编码表对输入的字符串进行编码,并将编码后的 字符串输出。 4、译码(Decoding):利用已经建好的赫夫曼树对编码后的字符串进行译 码,并输出译码结果。 5、打印(Print):以直观的方式打印赫夫曼树(选作) 6、计算输入的字符串编码前和编码后的长度,并进行分析,讨论赫夫曼 编码的压缩效果。 测试数据: I love data Structure, I love Computer。I will try my best to study data Structure. 提示: 1、用户界面可以设计为“菜单”方式:能够进行交互。 2、根据输入的字符串中每个字符出现的次数统计频度,对没有出现的 字符一律不用编码。

2. 程序分析 2.1 存储结构 Huffman树 给定一组具有确定权值的叶子结点,可以构造出不同的二叉树,其中带权路径长度最小的二叉树称为Huffman树,也叫做最优二叉树。 weight lchild rchild parent

2-1-1-1 5-1-1-1 6-1-1-1 7-1-1-1 9-1-1-1 weight lchild rchild parent 2-1-15 5-1-15 6-1-16 7-1-16 9-1-17 7017

(精选)云南大学软件学院数据结构实验3

实验难度: A □ B □ C □序号学号姓名成绩 指导教师(签名) 学期:2017秋季学期 任课教师: 实验题目: 组员及组长: 承担工作: 联系电话: 电子邮件: 完成提交时间:年月日

一、【实验构思(Conceive)】(10%) (本部分应包括:描述实验实现的基本思路,包括所用到的离散数学、工程数学、程序设计等相关知识,对问题进行概要性地分析) 魔王语言的解释规则: 大写字母表示魔王语言的词汇,小写字母表示人的词汇语言,魔王语言中可以包含括号,魔王语言的产生式规则在程序中给定,当接收用户输入的合法的魔王语言时,通过调用魔王语言翻译函数来实现翻译。 在 A 的基础上,(根据产生式)自定义规则,将一段魔王的话翻译为有意义的人类语言(中文):输入wasjg,则魔王语言解释为“我爱数据结构”。 运用了离散数学的一些基本知识及程序设计知识。 二、【实验设计(Design)】(20%) (本部分应包括:抽象数据类型的定义和基本操作说明,程序包含的模块以及各模块间的调用关系,关键算法伪码描述及程序流程图等,如有界面则需包括界面设计,功能说明等) //---------------抽象数据类型的定义------------------// #define STACK_INIT_SIZE 50 #define STACKINCREMENT 10 #define OVERLOW -2 #define ERROR -1 typedef struct { char *base; //顺序栈的栈底指针 int top; //顺序栈的栈顶 int size; //栈元素空间的大小 }SqStack; //结构体类型顺序栈 typedef struct { char *base; int front; int rear; }SqQueue; //结构体类型队列 //---------------各个模块功能的描述------------------// void Init_SqStack(SqStack &s) //初始化顺序桟 void Push_SqStack(SqStack &s, char c) //压入数据 int Pop_SqStack(SqStack &s, char &e) //出桟 char GetTop_SqStack(SqStack s)//或得栈顶

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

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;

数据结构实验三实验报告

三题目:哈夫曼编/译码器 班级:姓名:学号:完成日期:15.11.14 一、题目要求 描述:写一个哈夫曼码的编/译码系统,要求能对要传输的报文进行编码和解码。构造哈夫曼树时,权值小的放左子树,权值大的放右子树,编码时右子树编码为1,左子树编码为0. 输入:输入表示字符集大小为n(n <= 100)的正整数,以及n个字符和n个权值(正整数,值越大表示该字符出现的概率越大); 输入串长小于或等于100的目标报文。 输出:经过编码后的二进制码,占一行; 以及对应解码后的报文,占一行; 最后输出一个回车符。 输入样例: 5 a b c d e 12 40 15 8 25 bbbaddeccbbb 输出样例: 00011111110111010110110000 bbbaddeccbbb 提示:利用编码前缀性质。 二、概要设计 1.设计需要的数据结构:树型结构 2.需要的抽象数据类型: ADT Tree{ 数据对象D:D是具有相同特性的数据元素的集合。 数据关系R:若D为空集,则称为空树; 若D仅含有一个数据元素,则R为空集,否则R={H},H是如下二元关系: (1) 在D中存在唯一的称为根的数据元素root,它在关系H下无前驱; (2) 若D-{root}≠NULL,则存在D-{root}的一个划分D1,D2,D3,…,Dm(m>0),对于任意j≠k(≤j,k≤m)有Dj∩Dk=NULL,且对任意的i(1≤i≤m),唯一存在数据元素xi?Di有?H; (3) 对应于D-{root}的划分,H-{,…,}有唯一的一个划分H1,H2,…,Hm(m>0),对任意j≠k(1≤j,k≤m)有Hj∩Hk=NULL,且对任意i(1≤i≤m),Hi是Di上的二元关系,(Di,{Hi}) 是一棵符合本定义的树,称为根root的子树。 基本操作: InitTree(&T); 操作结果:构造空树T。

数据结构实验报告图实验

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

相关文档