已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
21华 北 科 技 学 院课程设计说明书(数据结构课程设计)班级: 姓名:学号:设计题目:设计时间:指导教师:评 语:_ _评阅成绩: 评阅教师: 数据结构课程设计实验报告开课实验室: 基础实验室 一 2010 年9 月16 日实验题目敢死队问题1.实验题目敢死队问题2.实验设备及环境pc兼容机、windows操作系统、vb软件等。3.功能模块简介和系统结构图系统结构图本程序有四个功能模块,包括三个解决敢死队问题方案的模块和一个退出系统模块。三个解决方案分别采用了循环聊表储存结构、线性表储存结构、循环队列储存结构。功能模块如下图所示。敢死队问题循环单链表储存结构线性表储存结构循环队列储存结构退出功能模块具体简介如下:(1).循环单链表以单循环链表为存储结构,包含三个模块: 1.主程序模块 包含敢死队人数的输入,死亡数字的输入,函数的调用,结果的输出。2.构造链表并初始化 构造链表,给每个结点赋值,给队员编号。3删除 当报数到死亡数字时队员出列去执行任务,删除该节点。开始声明类型定义变量并初始化初始化单链表循环模块输入敢死队员总数剩下的队员数1?队员报数报数值=死亡数?队员出列输出结果(2).线性表储存结构功能设计本程序其实质是约瑟夫环问题,本次实验用了线性表数据结构,并运用模块化的程序设计思想,算法的实现是这样的:定义类类型1. 定义变量并初始化2. 线性表初始化3. 当队员数小于等于1时,输出结果算法流程图开始声明数据类型定义变量并初始化初始化线性表输入敢死队员总数敢死队员人数线性表长度队员报数报数值=5?队员出列剩下的队员数1?输出增加存储分配循环队列储存结构解决功能设计本程序其实质是约瑟夫环问题,本次实验用了循环队列数据结构,并运用模块化的程序设计思想,算法的实现是这样的:这个方法是用队列循环来做的,实现的方法是这样的:首先从第一号开始报数,循环到指定的偏移位置删除结点,直至剩下一个结点。然后再比较一下它的号码是不是等于1,如果等于则输出开始计数位置,如果不等,继续循环查找,直到找出符合条件的计数起始位置,输出结果。算法流程图开始声明数据类型定义变量并初始化初始化循环队列输入敢死队员总数队列满?队员报数报数值=5?队员出列即清零剩下的队员数1?输出增加存储分配编号=1?给队员编号入队列4. 系统的主要界面设计及运行说明:进入用户主界面,选者实现结果的方法以10个队员,死亡数字为5来运行,结果如下 选择第2项功能,运用线性表储存结构 选择第3项功能,运用循环队列来实现结果5.程序的主要代码:#include #include#include#include/-循环单链表-typedef struct node int data; struct node *next;lnode;/* 定义结点类型 */lnode* creat(int n) /* 创建循环链表 */ lnode *s,*q,*t; int i; if(n!=0) t=q=(lnode *)malloc(sizeof(lnode); q-data=1;/* 生成第一个结点并使其data值为1 */ for(i=2;inext=s; q-next-data=i;/*赋值*/ q=q-next; q-next=t; return t;delete (lnode* t,int m)/* 链表的删除 */ lnode *a;int i; while (t-next!=t) for (i=1;inext; a=t-next; t-next=a-next; free(a); t=t-next; printf(n); return (t-data);/-/-线性表-#define list_init_size 100#define listinccrement 10#define ok 1#define error 0typedef int elemtype;typedef struct klist /*定义数据结构体类型*/elemtype *elem; /*存储空间基址*/int length; /*当前长度*/int listsize; /*当前分配的存储容量(以sizeof(elemtype)为单位)*/sqlist;int initlist_sq(sqlist &l) /*创建线性表函数*/l.elem=(elemtype *)malloc(list_init_size * sizeof(elemtype); if(!l.elem)printf(存储分配失败);return error; elsel.length=0; /*空表长度为0*/l.listsize=list_init_size;return ok;/*初始存储容量*/int listinsert_sq(sqlist &l) /*线性表再分配函数*/*sqlist l;*/int *newbase;newbase=(elemtype *)realloc(l.elem, (l.listsize+listinccrement)*sizeof(elemtype); /*为顺序表增加一个大小为存储listinccrement个数据元素的空间*/if(!newbase) printf(存储分配失败);return error;else l.elem=newbase; /*新基址*/ l.listsize+=listinccrement; /*增加存储容量*/ return ok; /-/-循环队列-#define queuesize 1000 /假定预分配的队列空间最多为1000个元素typedef struct int dataqueuesize; int front;int rear; int count; /计数器,记录队中元素总数cirqueue;void initial(cirqueue *q) /将顺序队列置空q-front=q-rear=0; q-count=0; /计数器置 / 判队列空int empty(cirqueue *q) return q-front=q-rear; /判队列满int full(cirqueue *q) return q-rear=queuesize-1+q-front; /进队列void enqueue(cirqueue *q,int x) if (isfull(q) printf(队列上溢); /上溢,退出运行exit(1); q-count +; /队列元素个数加q-dataq-rear=x; /新元素插入队尾q-rear=(q-rear+1)%queuesize; /循环意义下将尾指针加 /出队列int dequeue(cirqueue *q) int temp; if(isempty(q) printf(队列为空); /下溢,退出运行exit(1); temp=q-dataq-front; q-count-; /队列元素个数减q-front=(q-front+1)%queuesize; /循环意义下的头指针加1return temp; /-void main () sqlist l; int s,i,m,count=0; /*声明变量*/ lnode *p; int z,y; int num;int opt; abc: printf(_n);printf(| 1.循环链表 |n);printf(| 2.线性表 |n);printf(| 3.循环队列 |n);printf(| 4.退出 |n); printf(_n);printf(请选择实现结果的方法:(14)nn);scanf(%d,&opt);if(opt4 | opt1) printf(输入有误请重新输入n);goto abc;switch(opt)case 1:system(cls);printf(您使用是循环链表储存结构nn);efg:printf(请输入敢死队的人数:n);scanf(%d,&num);if(numnum | m1) printf(输入有误请重新输入); goto m; else p=creat(num); y=delete(p,m); z=num-y+2; if(z%num=0) printf (从第 %dth:开始计数n,z); else printf(从第%d号战士开始计数才能让排长最后一个留下来而不去执行任务。n,(num-y+2)%num);break;case 2:system(cls);printf(您使用的是线性表储存结构nn);e:printf(请输入敢死队的人数:n);scanf(%d,&num);if(numl.listsize ) /*当顺序表当前分配的存储空间大小不足时进行再分配*/ listinsert_sq(l); for(i=0;i1) /*当所剩敢死队员总数为1时,总循环结束*/ for(i=0;inum;i+) if(l.elemi!=0) count+; if(count=5) /*报数循环*/ l.elemi=0; /*表示队员出列*/ count=0; /*计数器清零*/ s-; /*敢死队员数-1*/ for(i=0;inum;i+) /*输出*/if(l.elemi!=0)if(num-l.elemi+2)%num=0) printf(从第%d号战士开始计数才能让排长最后一个留下来而不去执行任务。n,num);elseprintf(从第%d号战士开始计数才能让排长最后一个留下来而不去执行任务。n,(num-l.elemi+2)%num); break;case 3:system(cls);printf(您使用的是循环队列储存结构nn);int start,count,j; cirqueue s; g:printf(请输入敢死队的人数:n);scanf(%d,&num);if(num1)printf(输入有误请重新输入n);goto g;for(start=1;start=num;start+)/start为测试起点 initial(&s); for(i=1;i=num;i+) enqueue(&s,i); for(i=1;istart;i+) j=dequeue(&s); enqueue(&s,j); count=1; while(countnum) for(i=1;i5;i+) j=dequeue(&s); enqueue(&s,j); j=dequeue(&s); count+; if(s.datas.front=1) break; printf(从第%d号战士开始计数才能让排长最后一个留下来而不去执行任务。n,start); break; case 4:exit(0);goto abc;6.实验总结:通过这次课程设计我又学到了很多东西,如程序的模块化设计思想,同时也加深了对数据结构这门课程的理解和学会了如何在实际中应用数据结构。在做程序之前,觉得敢死队这个问题,很难解决。在通过自己一次次的画图,推算结果时,明白了该程
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 ISO 15015:2025 EN Plastics - Extruded sheets of impact-modified acrylonitrile-styrene copolymers (ABS,AEPDS and ASA) - Requirements and test methods
- 2023年许昌辅警招聘考试题库含答案详解(模拟题)
- 2024年宁德 辅警协警招聘考试真题及完整答案详解1套
- 2024年天津辅警协警招聘考试备考题库附答案详解(培优a卷)
- 2024年包头辅警招聘考试真题及完整答案详解一套
- 2024年保山辅警协警招聘考试备考题库及答案详解(考点梳理)
- 2023年鹤壁辅警招聘考试题库附答案详解(模拟题)
- 2023年连江县辅警招聘考试题库附答案详解(b卷)
- 2023年菏泽辅警协警招聘考试备考题库含答案详解(基础题)
- 2023年韶关辅警招聘考试题库含答案详解(完整版)
- 《工程建设领域农民工工资专用账户资金管理三方协议(样本)》
- fof投资管理制度
- QGDW1175-2013变压器高压并联电抗器和母线保护及辅助装置标准化设计规范
- 园区物业服务方案(3篇)
- 新解读《DZ-T 0130.11 - 2006地质矿产实验室测试质量管理规范 第11部分:岩石物理力学性质试验》新解读
- 工程代签免责协议书
- 承接查验委托协议书
- 快艇买卖合同协议书
- 年产200吨高纯金属铯铷项目报告书
- 导弹基本知识
- 采血后预防淤青的按压方式
评论
0/150
提交评论