收藏 分享(赏)

软基实验第三次上机.pdf

上传人:精品资料 文档编号:10387649 上传时间:2019-11-05 格式:PDF 页数:16 大小:604.90KB
下载 相关 举报
软基实验第三次上机.pdf_第1页
第1页 / 共16页
软基实验第三次上机.pdf_第2页
第2页 / 共16页
软基实验第三次上机.pdf_第3页
第3页 / 共16页
软基实验第三次上机.pdf_第4页
第4页 / 共16页
软基实验第三次上机.pdf_第5页
第5页 / 共16页
点击查看更多>>
资源描述

1、软件技术基础上机实验报告(学生姓名)(学号)上机实验三ex3 _1:链栈基本题1)链栈结点类型定义为:typedef struct node int data;struct node *next;node_type;2)编写进栈函数push3)编写出栈函数pop4)编写main函数,首先建立一空链栈;调用进栈函数,将从键盘输入的数据元素逐个进栈,输入0结束;显示进栈后的数据元素;调用两次出栈函数,显示出栈后的数据元素。ex3 _2:循环队列基本题1)顺序循环队列类型定义为:#define N 2 0typedef struct int dataN;int front, rear;queue_t

2、ype;2)编写循环队列出队函数dequeue3)编写循环队列入队函数enqueue4)编写函数:void aa(queue_type *q);其功能为,调用出队函数把队列q中的元素一一出队,如果是负数直接抛弃;如果是正数,则调用入队函数,插入到q的队尾。5)编写main函数,首先建立一个队列,其中的数据元素为:2 , 3 , -4 , 6 , -5 , 8 , -9 , 7 , -1 0 , 2 0 ;然后调用aa函数,并将aa函数调用前后队列的数据元素分别输出到屏幕上。ex3 _3:教材第一章习题1 2题扩展题1)两个栈共用一个数组空间,它们的栈底分别在数组两端,栈顶相向而行。编写入栈和出

3、栈函数,实现两个栈元素分别的(但共用)入栈和出栈。2)main中函数完成以下测试:a、能否在共用空间上实现两个独立的栈:即能否向两个栈分别输入元素;能否分别从两个栈取出元素,每个栈取出的元素的顺序符合各自栈的特点b、能否在共用空间用满时,及时制止新的入栈行为。例如:假设数组大小为6,main函数实现以下动作,向栈1接连入栈4个元素后,向栈2入栈2个元素致栈满,再向栈2输入一个元素,将报错。接着从栈1出栈1个元素,再向栈2入栈,就会成功。最后,两个栈分别出空,观察输出顺序是否满足栈的特点。ex3 _4:教材第一章习题1 3题扩展题1)实现一种扩展的循环队列,使得全部的数组空间都能使用,基本思路是

4、当传统循环队列放满时:即(rear+1 )%MAXNUM =front为真时,可以再入队一个元素,接着rear = (rear+1 )%MAXNUM后就会与front相等,此时将另外一个变量flag设置为1,表示此时的rear=front不是为空,而是满。否则flag为0时,如果出现rear=front,则表示队列为空。2)main()函数实现以下测试:a、能否实现全部“装满”,即装入元素个数为MAXNUMb、能否按照循环队列那样绕着存放空间循环存放。c、能否在装满后,拒绝再装。d、能否在装满后,不会变成“空”的即可以还可正常出队。e、能否在全部出空后,不会变成“满”的即可还可正常入队。例如:

5、假设循环队列最大空间为5,main()函数实现以下动作,接连成功入队5个元素,入队第6个元素时,报错。接着出队3个元素,入队3个元素,均成功。再入队1个,报错。继续连续成功出队6个元素,出队第7个时报错。最后,再成功入队2个元素。*一、程序流程说明有条理的文字或流程图*由于此次上机题目较多,为了让老师看得更加容易,条理体现在代码注释中。二、完整程序训练:(注:同样的,由于代码长达4 0 0多行,所有方法的编写和调用都已经尽可能按照实验PPT题目的顺序来,所以基础部分和扩展题的代码都不分开编写,已经在代码中有详细注释。)代 码 :/实 验 三 栈 和 队 列#include “stdafx.h“

6、#include“malloc.h“#include“stdlib.h“#define N 20#define MAX 6/*ex3_1*/ex3_1定 义 基 础 题 1 链 栈 节 点 类 型typedef struct LinkStackNode int data;LinkStackNode *next;*LinkNode;/定 义 栈 顶 指 针 类 型typedef struct LinkStackNode *top;*LinkStackTop;/链 栈 初 始 化 函 数void initLinkStack(LinkStackTop / 将 栈 内 元 素 输 出void Prin

7、tdataOfLinkStack(LinkStackTop /ex3_1(2)编 写 进 栈 函 数 pushvoid push(LinkStackTop /ex3_1(3)编 写 出 栈 函 数 popvoid pop(LinkStackTop /*ex3_2*/ex3_2循 环 队 列 基 本 题 : 循 环 队 列 类 型 定 义 如 下 :typedef struct Queue int dataN;int front;int rear;*Queueptr;/初 始 化 一 个 空 队 列void initQueue(Queueptr /ex3_2(2)编 写 循 环 队 列 出 队

8、函 数int DeQueue(Queueptr /ex3_2(3)编 写 入 队 函 数void InsertQueue(Queueptr /ex3_2(4)编 写 函 数 aavoid aa(Queueptr /输 出 队 列 元 素void printQueueData(Queueptr /*ex3_3*/定 义 栈 类 型typedef struct dhStackint top1;int top2;int dataMAX;*dhStackPtr;/ 初 始 化void initStack(dhStackPtr /出 栈 函 数void popex3_3(dhStackPtr /入 栈

9、函 数void pushex3_3(dhStackPtr /打 印 栈 1 元 素void printStack1(dhStackPtr /打 印 栈 2 元 素void printStack2(dhStackPtr /*ex3_4*/typedef struct EXQueue int front;int rear;int flag;int dataMAX;*EXQueueptr;/初 始 化void initEXQueue(EXQueueptr /入 队 操 作void insertEXQueue(EXQueueptr /出 队 操 作void deEXQueue(EXQueueptr /

10、输 出 所 有 元 素void printEXQueueData(EXQueueptr void main() /*以 下 是 基 础 题 ex3_1 的 测 试 代 码 */LinkStackTop stack=NULL;int popData;initLinkStack(stack);while (scanf_s(“%d“, /入 栈elsebreak;printf(“nBefore pop:“);PrintdataOfLinkStack(stack);for( int i = 0; i top = NULL;printf(“init successn“);/将 栈 内 元 素 输 出vo

11、id PrintdataOfLinkStack(LinkStackTop p = stack-top;if (stack-top= NULL) printf(“/nStack Empt!“);exit(-1);printf(“nThe data of stack are:n“);while (p) printf(“%dt“,p-data);p= p-next;/ex3_1(2)编 写 进 栈 函 数 pushvoid push(LinkStackTop node = (LinkStackNode*)malloc(sizeof(LinkStackNode);if (node = NULL)exi

12、t(-1);node-data = pushdata;node-next = stack-top;stack-top = node;/ex3_1(3)编 写 出 栈 函 数 popvoid pop(LinkStackTop LinkStackNode *node;if (stack-top = NULL) printf(“nstack empty!“);exit(-1);node = stack-top;x = node-data;stack-top = stack-top-next;free(node);/*以 下 是 基 础 题 ex3_2的 代 码 */初 始 化 一 个 空 队 列vo

13、id initQueue(Queueptr if (!queue) printf(“initQueue Error!n“);exit(-1);printf(“initQueue success!n“);queue-front = queue-rear = 0;/ex3_2(2)编 写 循 环 队 列 出 队 函 数int DeQueue(Queueptr if (queue-front=queue-rear) queue-front = queue-rear = 0;printf(“Queue Empty!“);exit(-1);x = queue-dataqueue-front;queue-

14、front = (queue-front+1) % N;return x;/ex3_2(3)编 写 入 队 函 数void InsertQueue(Queueptr exit(-1);queue-dataqueue-rear = x;queue-rear = (queue-rear+1) % N;/ex3_2(4)编 写 函 数 aavoid aa(Queueptr int j = abs(queue-front)-(queue-rear)+N)%N); /求 队 列 元 素 个 数for (int i=0;i 0) /正 数 则 入 队InsertQueue(queue, x);else c

15、ontinue; /若 为 负 数 跳 到 下 一 个 循 环/输 出 队 列 元 素void printQueueData(Queueptr if (queue-front = queue-rear)printf(“nQueue Empty!n“);else j = queue-front; /队 前 指 示printf(“nThe queues data are:n“);for (i = 0; i rear - queue-front + N) %N; i+)printf(“%dt“, queue-dataj);j+;/*以 下 是 扩 展 题 ex3_3的 代 码 */初 始 化void

16、 initStack(dhStackPtr stack-top1 = -1;stack-top2 = MAX;/出 栈 函 数void popex3_3(dhStackPtr exit(-1);if (i = 1) /对 栈 1进 行 出 栈 操 作if (stack-top1 = -1) printf(“Stack Empty!“);exit(-1);else stack-top1-;if (i = 2) /对 栈 2 进 行 出 栈 操 作if (stack-top2 = MAX) printf(“Stack Empty!“);exit(-1);else stack-top2+;/入 栈

17、函 数void pushex3_3(dhStackPtr /编 号 错 误exit(-1);else if (stack-top2 - stack-top1 = 1) /栈 满printf(“nStack Full“);return;else if (i = 1)stack-data+stack-top1 = pushData;if (i = 2)stack-data-stack-top2 = pushData;/打 印 栈 1元 素void printStack1(dhStackPtr exit(-1);else printf(“nThe data of stack1 are:n“);int

18、 j = stack-top1;for (int i = 0; i top1; i+) printf(“%dt“, stack-dataj);j-; /这 里 用 自 减 因 为 , 栈 底 下 标 较 小/打 印 栈 2元 素void printStack2(dhStackPtr exit(-1);else printf(“nThe data of stack2 are:n“);int j = stack-top2;for (int i = stack-top2; i dataj);j+; /这 里 要 用 加 号 , 因 为 栈 底 下 标 较 大/*以 下 是 扩 展 题 ex3_4 的

19、 代 码 */初 始 化 队 列void initEXQueue(EXQueueptr if (!queue) printf(“initQueue Error!n“);exit(-1);printf(“initQueue success!n“);queue-front = queue-rear = 0;queue-flag = 0; /队 列 未 满 标 记/入 队 操 作void insertEXQueue(EXQueueptr return;queue-dataqueue-rear = data;queue-rear = (queue-rear + 1) % MAX;if (queue-r

20、ear=queue-front) /队 满 了 , flag标 记 为 1queue-flag = 1;/出 队 操 作void deEXQueue(EXQueueptr exit(-1);queue-front = (queue-front + 1) % MAX;if (queue-flag = 1) /出 队 前 队 满 , 出 队 后 将 不 满 了 , 把 flag设 置 为 0queue-flag = 0;/打 印 EXQueue元 素void printEXQueueData(EXQueueptr if (queue-front = queue-rear)elseprintf(“n

21、The queues data are:n“);/若 队 列 满 进 行 该 项 操 作if (queue-rear = queue-front) i data(queue-front + i) % MAX);/队 列 未 满 的 打 印 操 作else for (i = 0; i rear - queue-front + MAX) % MAX; i+)printf(“%dt“, queue-data(queue-front + i ) % MAX);注意:1、反映题目关键内容的程序段必须完整2、后一实验使用与前一实验相同的代码段可只需注明,不必再次抄写3、子函数应以加注释的方式说明其功能三、

22、测试数据*(上机前分析的结果)为了方便起见测试数据将不对所有的函数进行数据一一输入,而是采用连续调用的方式;1 .基础题ex3 _1调用:输出结果:2 .基础题ex3 _2Main函数中的调用:输出结果:3、扩展题ex3 _3main函数中的调用:输出结果:4、扩展题ex3 _4输出结果:四、上机时遇到的问题(可分为编译问题和逻辑问题)*1.在调用函数时传指针时出现错误,比如初始栈时:如果为void initStack(dhStackPtrstack);无 法 初 始 化 成 功 , 应 改 为 : void initStack(dhStackPtr 2. 在 进 行 队 列 操 作 时 ,

23、没 有 明 确 队 列 的 头 和 尾 的 位 置 , 导 致 在 进 行 出 队 入 队 还 有 遍 历 打 印 队列 时 出 现 错 误 ; 特 别 是 在 出 队 后 , 仅 仅 只 是 队 首 移 动 , 里 面 的 元 素 并 没 有 真 正 的 “ 出 ” , 还 在 数 组 当中 , 在 遍 历 时 如 果 队 头 队 尾 的 位 置 不 找 准 , 很 可 能 难 以 发 现 错 误 ;解 决 办 法 : 先 在 草 稿 本 上 画 图 分 析 , 再 代 码 实 现 。 然 后 输 入 少 量 数 据 逐 句 调 试 ;五、实际运行效果:(经过调试修改后与预期一致)*见上(三)*六、小结体会*:编写函数时要注意函数中实参与形参的区别,若要对实参进行修改应向函数传入指向实参的指针;如实参是指针,应传入指向它的指针;注意:1、要求提前完成的是一、二、三2、除二以外,其余部分为纸质手写。3、二,可以是电子档,提前发给助教(各种手段),由助教定。没有提前交的,要带到实验室,由助教抽查。二在上机前不要求完全做完并排错,将根据实际完成程度评分。4、上机报告正式递交时间为期末。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报