- 8
- 0
- 约5.87千字
- 约 16页
- 2017-11-26 发布于河南
- 举报
2013314209张协鎏
Foshan University《数据结构与算法期末实验题》学院:电子与信息工程学院专业:13计算机科学与技术2班学号:2013314209学生姓名:张协鎏二〇一五 年 一 月一、题目:卡片问题 等级B一、问题描述有一叠n张卡片,从上到下依次编号为1~n,从最上面的一张开始按如下的顺序进行操作:把最上面的第一张卡片拿掉,把下一张卡片放在这一叠卡片的最下面;再把最上面的第一张卡片拿掉,把下一张卡片放在这一叠卡片的最下面;依次重复这样做,直到手中剩下一张卡片。当n=500时,请按拿走卡片的顺序,列出每次拿掉的卡片数字。二、算法的基本思想①新建循环队列;②向循环队列中插入元素;③依次删除队头元素,将队尾指针赋予新的队头元素的值,对队头指针后移;④将剩余的最后一个元素输出;1.数据结构定义typedef struct{ //定义循环队列QElemtype *base; int front;int rear;}SqQueue;SqQueue Q;QElemtype e,x;2.各模块之间的调用关系主函数 void main()定义循环队列指针SqQueue *p= Q初始化循环队列InitQueue(p)调用入队操作EnQueue(p,x)调用出队操作DeQueue(p)调用队列顺序改变操作kapian(p)三、 测试数据四、源程序#includestdio.h#includestdlib.h #define ERROR -1#define OK 1#define n 10000typedef int QElemType;typedef struct{ QElemType *base; int front; int rear;}SqQueue;SqQueue Q;int InitQueue(SqQueue *Q){//构造一个空队列Q Q-base=(QElemType*)malloc((n+1)*sizeof(QElemType)); if(!Q-base) return ERROR; Q-front=Q-rear=0; return OK;}int EnQueue(SqQueue *Q,QElemType x){//插入元素X为新的队尾元素 if((Q-rear+1)%(n+1)==Q-front) return ERROR; Q-base[Q-rear]=x; Q-rear=(Q-rear+1)%(n+1); return OK;}int DeQueue(SqQueue *Q,QElemType x){//删除队头元素,用X返回其值 x=Q-base[Q-front]; if(Q-front==Q-rear) return ERROR;Q-front=(Q-front+1)%(n+1); return OK;}int kapian(SqQueue *Q){ Q-base[Q-rear]=Q-base[Q-front]; Q-front=(Q-front+1)%(n+1); Q-rear=(Q-rear+1)%(n+1); return OK;}void main(){int i,m,s;printf(请输入卡片数量s=);scanf(%d,s);printf(卡片取出顺序为:\n);SqQueue *p= Q; InitQueue(p); for(i=1;i=s;i++) EnQueue(p,i); while((Q.rear-1)%(n+1)!=Q.front%(n+1)) {DeQueue(p,m); kapian(p); printf(%4d,m);}printf(\n);}二、题目:约瑟夫问题 等级C一、问题描述问题描述:有N个小孩围成一圈,从第K个儿童从1开始依次报数,直到数到M,数到M的同学出列,下一个同学再从1开始报数到M,依次循环,直到最后剩下一个同学,问最后一个同学是谁。当n=50,k=12时,请按次序列出出列的同学序号。二、算法的基本思想首先设计实现约瑟夫环问题的存储结构。由于约瑟夫环问题本身具有循环性质,考虑利用循环链表。为了统一对表中任意结点的操作,循环链表不带头结点。其次,建立一个不带头结点的循环链表并由头结点指示。最后,设计约瑟夫环问题的算法。先定义一个结构体存储人员结点类型和结点指针类型。再设计约瑟夫环问题的算法。以无头结点的单循环链表为存储结构模拟此过程。判断输入的总人数n是否大于0,是就执行下一步,否则返回main()函数。创建新结点,对线性表初始化,并赋值1到n,令最后一个结点指向第1个结点。循环求得前n-1个出队结点,输出其人员编号,并删除
原创力文档

文档评论(0)