当前位置:文档之家› 数据结构实验2 四则运算

数据结构实验2 四则运算

数据结构实验2 四则运算
数据结构实验2 四则运算

南华大学

实验报告(201 6 ~201 7 学年度第一学期)

数据结构

课程名称

表达式求值

实验名称

姓名XX 学号XX

专业计算机类班级计类九班

地点南华大学教师余童兰

1.实验目的及要求

实验二栈与队列

1.实验目的:

掌握栈的特点及其描述方法,掌握顺序表与链式存储结构实现一个栈或队列,掌握栈与队列中各种等基本操作及典型应用算法。要求自行设计链式栈和链式队列类。

2.实验内容与要求:以下题目任选其一,实验报告格式与实验1一致。

要求自行设计基础类:链式栈或链式队列类(必须是链式存

储)。

1)表达式求值。用户输入一个包含“+”、“-”、“*”、“/”、正整数和圆括号的合法数学表达式,利用栈完成该表达式的求解;

2)迷宫问题。以一维数组Maze[m+2][n+2]数组描述一个迷宫,元素。

值为0表示通道,值为1表示墙壁,以Maze[1][1]表示迷宫的入口,

而maze[m][n]表示迷宫的出口,外层数据全为1表示外围墙壁,Maze

数组内层数据表达一个迷宫(数据来源于输入或随机赋值),打印一

条如何从Maze[1][1]到达出口Maze[m][n]的路径,若无解,则打印“无

解”信息;

3)舞会模拟。设舞厅能同时容纳m对舞伴共舞,期间播放n支舞曲。

会上男士们和女士们进入舞厅时,各自排成一队。跳舞开始时,依次

从男队和女队的队头上各出一人配成舞伴,跳完后重新排队。请输入

男队队员个数与名字,女队队员个数与名字,n与舞曲名称,舞厅容

量m,打印各舞曲播放时,跳舞的舞伴配对情况;

2.实验内容

1.1各算法基本思想及各函数流程图

该节描述实验中各类的UML类图及关联;类中各个操作的基本思想,算法流程图及时空复杂度分析;

30分,评分标准:图,表,术,语等规范度15;完整详细度15;)LinkStack类UML图:

Complex_Caculate() 核心函数流程图

Caculate函数流程图:

Complex_Caculate()函数思想:对输入的字符进行一个个处理,如果是多位数就调用atof()转换成浮点数。同时对括号进行特殊处理运算。考虑四种情况:当前运算符大于栈顶运算符,左右括号;当前运算符小于栈顶运算符;当前运算符等于栈顶运算符;结束标志#。对着四种情况进行相应的处理。

用链栈作为数据结构,空间复杂度随实践规模大小决定为O(n)。

对输入的表达式字符一个个读取进行处理,时间复杂度为O(n)。

2.2 源程序(要求有20%以上的注释)

(25分;评分标准:注释10;程序风格5;程序功能完整5;容错性及程序效率5;)

//Main.cpp

#include

#include "LinkStack.h"

#include

#include

#include

using namespace std;

//设为全局变量是为了方便Computer的调用

LinkStack OPND;//存放数字的栈

LinkStack OPTR;//存放运算符的栈

int to=-1,excel[]={0,0,2,1,2,1,0,2},i=0,counter=0;//依次为栈顶运算符优先级,运算符优先级表...

char a[100];//临时存放表达式

double Caculate(double b,double c,char d)

{

switch (d)

{

case '+': /*处理加法*/

return b+c;

case '-': /*处理减法*/

return b-c;

case '*': /*处理乘法*/

return b*c;

case '/': /*处理除法*/

if (0 == c) //除零情况

{

cout<<"Division by zero!\n"<

system("pause");

exit(1);

}

else

return b/c;

case '^':

return pow(b,c);

case '%':

return (int)b%(int)c;

default://存在非法运算符的处理

cout<<"计算停止!有非法字符: "<

exit(1);

}

return 0;

}

void Computer()//出栈两个运算对象,出栈一个运算符,进行计算。更新顶部运算符优先级

{

double b=OPND.Pop();//运算对象1

double c=OPND.Pop();//运算对象2

char d=OPTR.Pop();//运算符

to=excel[a[i]%10];//更新顶部运算符优先级

OPND.Push(Caculate(c,b,d));//运算结果入栈

}

void Complex_Caculate()//表达式求值主要函数

{

OPTR.Push('#');//初始化终止符

int to2=-1,flag=0,k=1;//遇到括号前的运算符优先级、是否存在括号的标志

char c;

while((c=getchar())!='\n')//输入四则运算符表达式

{

a[counter++]=c;

}

a[counter]='#';//尾部终止符

while(1)//遍历处理字符

{

if(a[i]=='#')//终止符情况(结束运算)

{

while(OPTR.GetTop()!='#')//处理两个栈中剩下的对象

{

double b=OPND.Pop();

double c=OPND.Pop();

char d=OPTR.Pop();

if(d!='(')

OPND.Push(Caculate(c,b,d));

}

break;

}

if(a[i]>='0'&&a[i]<='9')//数字就存入运算对象栈

{ int j=i;

char b[16];

k=0;

while(a[j]>='0'&&a[j]<='9')//处理多位数

{

b[k]=a[j];

k++,j++;

}

b[k]='\0';

OPND.Push(atof(b));//ATOF转换为浮点数

}else if(a[i]>65&&a[i]!='^'&&a[i]!='%')

{

cout<<"有非法字符!"<

exit(1);

}

else if(excel[a[i]%10]>to||a[i]==')'||a[i]=='(')//当前字符是运算符且优先级比OPTR栈顶元素高,或者运算符是()的情况

{ if(a[i]=='(')

{

flag=1;//有括号标志记为1

OPTR.Push(a[i]);

to2=to;//记录括号之前运算符的优先级

to=excel[a[i]%10];//记录当前运算符的优先级

}

else if(a[i]==')')//括号匹配

{

while(OPTR.GetTop()!='(')//处理左括号之前的所有的运算对象和运算符

{ double b=OPND.Pop();

double c=OPND.Pop();

char d=OPTR.Pop();

if(d!='(')

{

OPND.Push(Caculate(c,b,d));//入栈计算结果

}

else

break;

}

flag=0;//有括号标志记为0

OPTR.Pop();//出栈左括号

to=to2;//运算符优先级变为左括号之前的运算符优先级

}

else{

//当前字符是运算符且优先级比OPTR栈顶元素高

OPTR.Push(a[i]);

to=excel[a[i]%10];

}

} else if(excel[a[i]%10]

{

if(flag!=1)//无括号时处理,应对例如1+1*2只计算1*2而未计算剩下的加法1+2

{

while(OPTR.GetTop()!='#')

Computer();

OPTR.Push(a[i]);

}

else//有括号时处理,应对例如1+1*2只计算1*2而未计算剩下的加法1+2

{

while(OPTR.GetTop()!='(')

Computer();

OPTR.Push(a[i]);

}

}

else//当前字符是运算符且优先级与OPTR栈顶元素相同

{

if(flag!=1)//无括号时

{

Computer();

OPTR.Push(a[i]);

}

else{

//有括号时

while(OPTR.GetTop()!='(')

Computer();

OPTR.Push(a[i]);

}

}

i+=(k);//下一个字符

k=1;

}

cout<<"结果:"<

}

int main()

{

Complex_Caculate();

return 0;

}

//LinkStack.h

template

struct Node

{

DataType data;

struct Node * next;

};

template

class LinkStack

{

public:

LinkStack(){top=NULL;};

~LinkStack(){};

void Push(DataType x);//入栈函数

DataType Pop();

DataType GetTop(){if(top!=NULL) return top->data;}//返回栈顶元素

private:

Node *top;//头指针

};

template

void LinkStack::Push(DataType x)//头插法原理入栈

{

Node *s;

s=new Node;

s->data=x;

s->next=top;

top=s;

}

template

DataType LinkStack::Pop()//出栈

{ DataType x;

Node *p;

if(top==NULL)

throw "下溢";

x=top->data;

p=top;

top=top->next;

delete p;

return x;

}

3.实验结果

(5分;切屏显示)

b4. 实验总结分析

(15分;实验过程心得感受;评分标准:表达流畅5;完整详细10)

实验用栈的数据结构实现,个人觉得难点在于有括号时的运算,一旦有括号则运算顺序就会不同,所以要记录括号之前的运算符优先级,等括号匹配完成运算符优先级变回到无括号时的。从一开始只能计算单重括号的情况到能计算多重括号,过程经历了几次排BUG,最终程序能经历各种各样的复杂运算。在原实验要求的基础上增加了平方运算 ^ ,取模运算 % ,两个运算符优先级与乘除相同。有需要还可以增加开平方,开立方…等运算。将其封装为一个函数。自己独立完成后上网查看了其他的算法,总结了各自算法的优缺点,并与自己的相比较。5. 实验自评等级

(优良中及等级自评,自评为优或良有机会参加现场答辩。)

注:

实验2发布时间:2016年11月2日12时.00 免考勤截止时间:2016年11月9日22时.00 正常截止时间:11.30日晚22点00分。

各班学委请于11.30日晚22点30分前将实验全部打包,命名为 **班数据结构实验2,并将实验2的考勤和时间评分表文件发qq邮箱37438259。

实验评分标准参考:《2016年秋季学期数据结构提交要求及评分标准》

学习委员请下载《2016秋季学期数据结构考勤及提交时间评分表》

数据结构实验4

(一)题目 1. 按下述原则编写快排的非递归算法: (1) 一趟排序之后,若子序列已有序(无交换),则不参加排序,否则先对长度较短的子序列进行排序,且将另一子序列的上、下界入栈保存; (2) 若待排记录数<=3,则不再进行分割,而是直接进行比较排序。 测试实例:{49 38 65 97 76 13 27 49 88 21 105} (二)算法思路 (1) 建立存储序列上下界的栈序列。 (2) 对栈顶作如下判断: A. 若栈顶中记录的头与尾相距小于3,对对应的子序列进行排序,然后出栈,进入(3); B. 若栈顶中记录的头与尾相距大于等于3,则进行分块,判断分块是否有序, a.若两分块都有序,则出栈,进入(3); b.若只有一分块有序,则改变栈顶内容为无序分块内容,进入(3); c.若两分块都无序,则改变栈顶内容为较长的无序块,然后把较短的无序块 压进栈。进入(3) (3)重复(2)的操作,直至栈空,得到最终结果。 (三)程序结构 定义的结构体及声明 (四)源码

using namespace std; typedef struct _stack{ int left; //lowerbound int right; //upperbound struct _stack *next; }qstack; //to store the child sequence's left and right void sort(int *arr, int left, int right){ //sort child sequence less than 3 for(int i = left; i <= right; i++){ int k = i; for(int j = i+1; j <= right; j++){ if(arr[k] > arr[j]) k = j; } if(k != i){ int t; t = arr[k]; arr[k] = arr[i]; arr[i] = t; } } } bool sorted(int *arr, int left, int right){ for(int i = left; i < right; i++){ if(arr[i] > arr[i+1]) return false; } return true; } void qsort(int *arr, int left, int right){ qstack *head; head = new qstack; head->left = left; head->right = right; head->next = NULL; qstack *p; while(head != NULL){ if(head->right - head->left < 3){ //if less than 3, sort and pop sort(arr, head->left, head->right);

数据结构实验报告格式

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

北京理工大学《数据结构与算法设计》实验报告实验四

《数据结构与算法设计》 实验报告 ——实验四 学院: 班级: 学号: 姓名:

一、实验目的 1. 通过实验实践、巩固线性表的相关操作; 2. 熟悉VC 环境,加强编程、调试的练习; 3. 用C 语言实现线性表的抽象数据类型,实现线性表构造、插入、取数据等基本操作; 4. 理论知识与实际问题相结合,利用上述基本操作实现三种排序并输出。 二、实验内容 从键盘输入10个数,编程实现分别用插入排序、交换排序、选择排序算法进行排序,输出排序后的序列。 三、程序设计 1、概要设计 为了实现排序的功能,需要将输入的数字放入线性表中,进行进一步的排序操作。 (1)抽象数据类型: ADT SqList{ 数据对象:D={|,1,2,,,0}i i a a ElemSet i n n ∈=≥ 数据关系:R1=11{,|,,1,2,,}i i i i a a a a D i n --<>∈= 基本操作: InPut(SqList &L) 操作结果:构造一个线性表L 。 OutPut(SqList L) 初始条件:线性表L 已存在。 操作结果:按顺序在屏幕上输出L 的数据元素。 InsertSort(SqList &L) 初始条件:线性表L 已存在。 操作结果:对L 的数据元素进行插入排序。 QuickSort(SqList &L) 初始条件:线性表L 已存在。 操作结果:对L 的数据元素进行快速排序。 SelectSort(SqList &L) 初始条件:线性表L 已存在。 操作结果:对L 的数据元素进行选择排序。 }ADT SqList ⑵主程序流程 由主程序首先调用InPut(L)函数创建顺序表,调用InsertSort(L)函数进行插入排序, 调用OutPut(L)函数显示排序结果。调用QuickSort(L)函数进行交换排序,调用OutPut(L) 函数显示排序结果。调用SelectSort(L)函数进行选择排序,调用OutPut(L)函数显示排序 结果。 ⑶模块调用关系 由主函数模块调用创建顺序表模块,排序模块与显示输出模块。

数据结构实验报告全集

数据结构实验报告全集 实验一线性表基本操作和简单程序 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班__ _ 学号:_____201258014054 ___ 姓名:_____周贵宇___________ 课程名称:___ 数据结构 _ 指导教师:_____胡章平__________ 2013年 06 月 25 日

实验序号 1 实验名称实验一线性表基本操作实验地点S-C1303 实验日期2013年04月22日 实验内容1.编程实现在顺序存储的有序表中插入一个元素(数据类型为整型)。 2.编程实现把顺序表中从i个元素开始的k个元素删除(数据类型为整型)。 3.编程序实现将单链表的数据逆置,即将原表的数据(a1,a2….an)变成 (an,…..a2,a1)。(单链表的数据域数据类型为一结构体,包括学生的部分信息:学号,姓名,年龄) 实验过程及步骤1. #include #include #include #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define ElemType int #define MAXSIZE 100 /*此处的宏定义常量表示线性表可能达到的最大长度*/ typedef struct

{ ElemType elem[MAXSIZE]; /*线性表占用的数组空间*/ int last; /*记录线性表中最后一个元素在数组elem[ ]中的位置(下标值),空表置为-1*/ }SeqList; #include "common.h" #include "seqlist.h" void px(SeqList *A,int j); void main() { SeqList *l; int p,q,r; int i; l=(SeqList*)malloc(sizeof(SeqList)); printf("请输入线性表的长度:"); scanf("%d",&r); l->last = r-1; printf("请输入线性表的各元素值:\n"); for(i=0; i<=l->last; i++) { scanf("%d",&l->elem[i]); } px(l,i); printf("请输入要插入的值:\n");

数据结构实验报告

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

北理工《数据结构与算法》在线作业_2

北理工《数据结构与算法》在线作业 试卷总分:100 测试时间:-- 试卷得分:99.5 一、单选题(共40 道试题,共99.5 分。)得分:99.5 1. 下列说法正确的是() A. 堆栈是在两端操作、先进后出的线性表 B. 堆栈是在一端操作、先进后出的线性表 C. 队列是在一端操作、先进先出的线性表 D. 队列是在两端操作、后进先出的线性表 正确答案:B 满分:2.5 分得分:2.5 2. 判定一个队列Q(最多元素为m0)为满队列的条件是() A. rear-front= = m0 B. rear-front-1= =m0 C. front= =rear D. front= =rear+1 正确答案:D 满分:2.5 分得分:2.5 3. 评价排序算法好坏的标准主要是()。 A. 执行时间 B. 辅助空间 C. 算法本身的复杂度 D. 执行时间和所需的辅助空间 正确答案:D 满分:2.5 分得分:2.5 4. 设有50行60列的二维数组A[50][60],其元素长度为4字节,按行优先顺序存储,基地址为200,则元素A[18][25]的存储地址为()。 A. 3700 B. 4376 C. 3900 D. 4620 正确答案:D 满分:2.5 分得分:2.5 5. 根据二叉树的定义可知二叉树共有()种不同的形态。 A. 4 B. 5 C. 6 D. 7 正确答案:B 满分:2.5 分得分:2.5 6. 以下排序方法中,稳定的排序方法是()。 A. 直接插入排序和希尔排序 B. 直接插入排序和冒泡排序 C. 希尔排序和快速排序 D. 冒泡排序和快速排序 正确答案:B 满分:2.5 分得分:2.5 7. 下述几种排序方法中,平均查找长度最小的是()。 A. 插入排序 B. 选择排序 C. 快速排序

数据结构实验报告(四)

《数据结构》实验报告 班级: 学号: 姓名:

实验四二叉树的基本操作实验环境:Visual C++ 实验目的: 1、掌握二叉树的二叉链式存储结构; 2、掌握二叉树的建立,遍历等操作。 实验内容: 通过完全前序序列创建一棵二叉树,完成如下功能: 1)输出二叉树的前序遍历序列; 2)输出二叉树的中序遍历序列; 3)输出二叉树的后序遍历序列; 4)统计二叉树的结点总数; 5)统计二叉树中叶子结点的个数; 实验提示: //二叉树的二叉链式存储表示 typedef char TElemType; typedef struct BiTNode{ TElemType data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree;

一、程序源代码 #include #include #define MAXSIZE 30 typedef char ElemType; typedef struct TNode *BiTree; struct TNode { char data; BiTree lchild; BiTree rchild; }; int IsEmpty_BiTree(BiTree *T) { if(*T == NULL) return 1; else return 0;

} void Create_BiTree(BiTree *T){ char ch; ch = getchar(); //当输入的是"#"时,认为该子树为空 if(ch == '#') *T = NULL; //创建树结点 else{ *T = (BiTree)malloc(sizeof(struct TNode)); (*T)->data = ch; //生成树结点 //生成左子树 Create_BiTree(&(*T)->lchild); //生成右子树 Create_BiTree(&(*T)->rchild); } } void TraverseBiTree(BiTree T) { //先序遍历 if(T == NULL) return;

数据结构实验二11180

理工学院实验报告 系部计算机系班级学号 课程名称数据结构实验日期 实验名称链表的基本操作成绩 实验目的: (1)掌握线性表的链式存储结构的特点; (2)掌握线性表的基本操作:初始化、插入、删除、查找数据元素等运算在链式存储结构上的实现。 实验条件:计算机一台,vc++6.0 实验容与算法思想: 容: 建立一有序的链表,实现下列操作: 1.把元素x插入表中并保持链表的有序性; 2.查找值为x的元素,若找到将其删除; 3.输出表中各元素的值。 算法思想:先创建并初始化一个顺序表(void init_linklist(LinkList)),通过循环,输入一串数据void CreateFromTail(LinkList L);创建主函数;编写算法,完成子函数(查找locate,插入insList,删除DelList,输出output)模块;调用子函数,完成实验要求 运行结果:

附:源程序: #include #include #define OK 1 #define ERROR 0 typedef char ElemType; typedef struct Node { ElemType data; struct Node* next; }Node,*LinkList; void init_linklist(LinkList *l) { *l=(LinkList)malloc(sizeof(Node)); (*l)->next=NULL; } void CreateFromTail(LinkList L) { Node *r, *s; char c; int flag =1; r=L; while(flag) { c=getchar(); if(c!='$') {

北理工《实用数据结构与算法》在线作业

北理工《实用数据结构与算法》在线作业 一、单选题: 1.(单选题)当两个元素比较出现反序时就相互交换位置的排序方法称为()。 (满分 A归并排序 B选择排序 C交换排序 D插入排序 正确:C 2.(单选题)设数组Data[0..m]作为循环队列SQ的存储空间,front为队头指针,rear为队尾指针,则执行出队操作的语句为() (满分 Afront=front+1 Bfront=(front+1)%m Crear=(rear+1)%m Dfront=(front+1)%(m+1) 正确:D 3.(单选题)快速排序方法在()情况下最不利于发挥其长处。 (满分 A被排序的数据量太大 B被排序数据中含有多个相同值 C被排序数据已基本有序 D被排序数据数目为奇数 正确:C 4.(单选题)具有65个结点的完全二叉树其深度为(根的层次号为1)()。 (满分 A8 B7 C6 D5 正确: 5.(单选题)稀疏矩阵一般的压缩存储方法有两种,即()。 (满分 A二维数组和三维数组 B三元组表和散列表 C三元组表和十字链表 D散列表和十字链表 正确: 6.(单选题)从未排序序列中依次取出一个元素与已排序序列中的元素依次进行比较,然后将其放在已排序序列的合适位置,该排序方法称为()排序法。 (满分:) A插入 B选择 C交换 D二路归并 正确: 7.(单选题)下列排序方法中效率最高的排序方法是()。 (满分:) A起泡排序 B堆排序 C快速排序 D直接插入排序 正确: 8.(单选题)栈与一般的线性表的区别在于()。 (满分:) A数据元素的类型不同 B运算是否受限制 C数据元素的个数不同

数据结构实验二

洛阳理工学院实验报告 系部计算机系班级学号姓名 课程名称数据结构实验日期 实验名称链表的基本操作成绩 实验目的: (1)掌握线性表的链式存储结构的特点; (2)掌握线性表的基本操作:初始化、插入、删除、查找数据元素等运算在链式存储结构上的实现。 实验条件:计算机一台,vc++6.0 实验内容与算法思想: 内容: 建立一有序的链表,实现下列操作: 1.把元素x插入表中并保持链表的有序性; 2.查找值为x的元素,若找到将其删除; 3.输出表中各元素的值。 算法思想:先创建并初始化一个顺序表(void init_linklist(LinkList)),通过循环,输入一串数据void CreateFromTail(LinkList L);创建主函数;编写算法,完成子函数(查找locate,插入insList,删除DelList,输出output)模块;调用子函数,完成实验要求 运行结果:

附:源程序: #include #include #define OK 1 #define ERROR 0 typedef char ElemType; typedef struct Node { ElemType data; struct Node* next; }Node,*LinkList; void init_linklist(LinkList *l) { *l=(LinkList)malloc(sizeof(Node)); (*l)->next=NULL; } void CreateFromTail(LinkList L) { Node *r, *s; char c; int flag =1; r=L; while(flag) { c=getchar(); if(c!='$') {

数据结构实验报告模板

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

数据结构实验4_99XXX

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

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

{ printf("栈上溢出!\n"); } else { st->top++; //移动栈顶位置 st->data[st->top]=x; //元素进栈 } } void Pop(SqStack *st,ElemType &e) //出栈 { if(st->top==-1) { printf("栈下溢出\n"); } else { e=st->data[st->top]; //元素出栈 st->top--; //移动栈顶位置} } int main() { SqStack L; SqStack *st=&L; ElemType c; int i; InitStack(st); printf("输入回车结束入栈"); while((c=getchar())!='\n') { if(c=='(') Push(st,c); if((i=StackEmpty(st))==-1) { if(c==')') Pop(st,c); } if(c==')' && (i=StackEmpty(st))==0) { printf("右括号多出,配对失败"); goto loop;

数据结构实验报告

姓名: 学号: 班级: 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

数据结构实验四

数据结构实验四 1.实验要求 置换-选择排序的实现 【问题描述】 对文件中的记录的关键字采用外部排序的置换-选择算法实现。 【实验要求】 设计置换-选择排序的模拟程序。 (1)记录存储在文件中。 (2)采用多路归并算法实现。 (3)采用置换-选择算法实现。

2实验描述 外部排序过程中,为了减少外存读写次数需要减小归并趟数(外部排序的过程中用到归并),外部排序1(其中k为归并路数,n为归并段的个数)。增加k和减小n都可以达到减小归并趟数的目的。置换-选择排序就是一种减小n的、在外部排序中创建初始归并段时用到的算法。它可以让初始归并段的长度增减,从而减小初始归并段的段数(因为总的记录数是一定的)。 置换-选择排序是在树形选择排序的基础上得来的,它的特点是:在整个排序(得到初始归并段)的过程中,选择最小(或最大)关键值和输入、输出交叉或并行进行。它的主要思路是:用败者树从已经传递到内存中的记录中找到关键值最小(或最大)的记录,然后将此记录写入外存,再将外存中一个没有排序过的记录传递到内存(因为之前那个记录写入外存后已经给它空出内存),然后再用败者树的一次调整过程找到最小关键值记录(这个调整过程中需要注意:比已经写入本初始归并段的记录关键值小的记录不能参见筛选,它要等到本初始段结束,下一个初始段中才可以进行筛选),再将此最小关键值记录调出,再调入新的记录.......依此进行指导所有记录已经排序过。内存中的记录就是所用败者树的叶子节点。开发环境:VC6.0。 3.置换-选择排序的实现 //A是从外存读入n个元素后所存放的数组 template void replacementSelection(Elem * A, int n, const char * in, const char * out){ Elem mval; //存放最小堆的最小值 Elem r; //存放从输入缓冲区中读入的元素 FILE * iptF; //输入文件句柄 FILE * optF; //输出文件句柄 Buffer input; //输入buffer Buffer output; // 输出buffer //初始化输入输出文件 initFiles(inputFile, outputFile, in, out); //初始化堆的数据,读入n个数据 initMinHeapArry(inputFile, n, A); //建立最小值堆 MinHeap H(A, n, n); //初始化inputbuffer,读入部分数据 initInputBuffer(input, inputFile); for(int last = (n-1); last >= 0;){ mval = H.heapArray[0]; //堆的最小值 sendToOutputBuffer(input,output,iptF,optF, mval); input.read(r); //从输入缓冲区读入一个记录 if(!less(r, mval)) H.heapArray[0] = r; else {//否则用last位置记录代替根结点,把r放到last H.heapArray[0] = H.heapArray[last]; H.heapArray[last] = r;

数据结构(第4版)习题及实验参考答案数据结构复习资料完整版(c语言版)

数据结构基础及深入及考试 复习资料 习题及实验参考答案见附录 结论 1、数据的逻辑结构是指数据元素之间的逻辑关系。即从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。 2、数据的物理结构亦称存储结构,是数据的逻辑结构在计算机存储器内的表示(或映像)。它依赖于计算机。存储结构可分为4大类:顺序、链式、索引、散列 3、抽象数据类型:由用户定义,用以表示应用问题的数据模型。它由基本的数据类型构成,并包括一组相关的服务(或称操作)。它与数据类型实质上是一个概念,但其特征是使用与实现分离,实行封装和信息隐蔽(独立于计算机)。 4、算法:是对特定问题求解步骤的一种描述,它是指令的有限序列,是一系列输入转换为输出的计算步骤。 5、在数据结构中,从逻辑上可以把数据结构分成( C ) A、动态结构和表态结构 B、紧凑结构和非紧凑结构 C、线性结构和非线性结构 D、内部结构和外部结构 6、算法的时间复杂度取决于( A ) A、问题的规模 B、待处理数据的初态 C、问题的规模和待处理数据的初态 线性表 1、线性表的存储结构包括顺序存储结构和链式存储结构两种。 2、表长为n的顺序存储的线性表,当在任何位置上插入或删除一个元素的概率相等时,插入一个元素所需移动元素的平均次数为( E ),删除一个元素需要移动的元素的个数为( A )。 A、(n-1)/2 B、n C、n+1 D、n-1 E、n/2 F、(n+1)/2 G、(n-2)/2 3、“线性表的逻辑顺序与存储顺序总是一致的。”这个结论是( B ) A、正确的 B、错误的 C、不一定,与具体的结构有关 4、线性表采用链式存储结构时,要求内存中可用存储单元的地址( D ) A、必须是连续的 B、部分地址必须是连续的C一定是不连续的D连续或不连续都可以 5、带头结点的单链表为空的判定条件是( B ) A、head==NULL B、head->next==NULL C、head->next=head D、head!=NULL 6、不带头结点的单链表head为空的判定条件是( A ) A、head==NULL B、head->next==NULL C、head->next=head D、head!=NULL 7、非空的循环单链表head的尾结点P满足( C ) A、p->next==NULL B、p==NULL C、p->next==head D、p==head 8、在一个具有n个结点的有序单链表中插入一个新结点并仍然有序的时间复杂度是( B ) A、O(1) B、O(n) C、O(n2) D、O(nlog2n) 9、在一个单链表中,若删除p所指结点的后继结点,则执行( A )

数据结构实验二-

实 验 报 告 一、实验目的 1) 加深对图的表示法和图的基本操作的理解,并可初步使用及操作; 2) 掌握用图对实际问题进行抽象的方法,可以解决基本的问题; 3) 掌握利用邻接表求解非负权值、单源最短路径的方法,即利用Dijkstra 算法求最短 路径,同时掌握邻接表的建立以及使用方法,能够解决相关的问题; 4) 学会使用STL 中的map 抽象实际问题,掌握map ,List,,priority_queue 等的应 用。 二、实验内容与实验步骤 (1) 实验内容: 使用图这种抽象的数据结构存储模拟的欧洲铁路路线图,通过Dijkstra 算法求出欧洲旅行最少花费的路线。该实验应用Dijkstra 算法求得任意两个城市之间的最少路费,并给出路费最少的路径的长度和所经过的城市名。 (2) 抽象数据类型及设计函数描述 1) 抽象数据类型 class City : 维护一个城市的信息,包括城市名name ,是否被访问过的标记visted ,从某个城市到达该城市所需的总费用total_fee 和总路径长度total_distance ,求得最短路径后路径中到达该城市的城市名from_city 。 class RailSystem : 用邻接表模拟欧洲铁路系统,该邻接表使用数据结构map 实现,map 的key-value 课程名称:数据结构 班级: 实验成绩: 实验名称:欧洲旅行 学号: 批阅教师签字: 实验编号:实验二 姓名: 实验日期:2013 年6 月 18 日 指导教师: 组号: 实验时间:

值对的数据类型分别为string和list<*Service>,对应出发城市名和该城市与它能 够到达的城市之间的Service链表。 class Service: 为铁路系统模拟了两个城市之间的直接路线,包括两个城市之间直接到达的费用 fee,两城市之间的直接距离distance。 部分设计函数描述 ●RailSystem(const string& filename) 构造函数,调用load_services(string const &filename)函数读取数据 ●load_services(string const &filename) 读取传入的文件中的数据并建立上述两个map以模拟欧洲铁路路线图 ●reset(void) 遍历cities图,初始化所有城市的信息:visted未访问,total_distance最大 值,total_fee费用最大值,from_city为空 ●~RailSystem(void) 析构函数,用delete将两个map中所有使用new操作符开辟的空间删除 ●void output_cheapest_route(const string& from, const string& to, ostream& out); 输出两城市间的最少费用的路径,调用calc_route(string from, string to)函 数计算最少费用 ●calc_route(string from, string to) 使用Dijkstra算法计算from和to两个城市间的最少费用的路径 (3)采用的存储结构 1)map > outgoing_services 用来保存由一个城市出发可以直接到达的城市名及这两个城市之间的路径信息。 2)list 以service为指针的list表,保存两城市间的路径。 3)map cities 用来保存所有城市信息,通过城市名查找该城市有关信息。 4)priority_queue, Cheapest> candidates 存储候选的遍历城市,City*是优先队列存储的对象类型,vector是该对象的向量集合,Cheapest是比较规则。 三、实验环境 操作系统:Windows 8 调试软件:Microsoft visual studio 2012 上机地点:综合楼311 机器台号:笔记本

北京理工大学数据结构实验报告4

《数据结构与算法统计》 实验报告 ——实验四 学院: 班级: 学号: 姓名:

一、实验目的 1、熟悉VC 环境,学会使用C 语言利用顺序表解决实际问题。 2、通过上机、编程调试,加强对线性表的理解和运用的能力。 3、锻炼动手编程,独立思考的能力。 二、实验内容 从键盘输入10个数,编程实现分别用插入排序、交换排序、选择排序算法进行排序,输出排序后的序列。 三、程序设计 1、概要设计 为了实现排序的功能,需要将输入的数字放入线性表中,进行进一步的排序操作。 (1)抽象数据类型: ADT SqList{ 数据对象:D={|,1,2,,,0}i i a a Elem Set i n n ∈=≥ 数据关系:R1=11{,|,,1,2,,}i i i i a a a a D i n --<>∈= 基本操作: InPut(SqList &L) 操作结果:构造一个线性表L 。 OutPut(SqList L) 初始条件:线性表L 已存在。 操作结果:按顺序在屏幕上输出L 的数据元素。 InsertSort(SqList &L) 初始条件:线性表L 已存在。 操作结果:对L 的数据元素进行插入排序。 QuickSort(SqList &L) 初始条件:线性表L 已存在。 操作结果:对L 的数据元素进行快速排序。 SelectSort(SqList &L) 初始条件:线性表L 已存在。 操作结果:对L 的数据元素进行选择排序。 }ADT SqList ⑵主程序流程 由主程序首先调用InPut(L)函数创建顺序表,调用InsertSort(L)函数进行插入排序,调用OutPut(L)函数显示排序结果。 再由主程序首先调用InPut(L)函数创建顺序表,调用QuickSort(L)函数进行交换排序,调用OutPut(L)函数显示排序结果。 再由主程序首先调用InPut(L)函数创建顺序表,调用SelectSort(L)函数进行选择排序,调用OutPut(L)函数显示排序结果。 ⑶模块调用关系

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