猴子选大王循环链表实现.doc_第1页
猴子选大王循环链表实现.doc_第2页
猴子选大王循环链表实现.doc_第3页
猴子选大王循环链表实现.doc_第4页
猴子选大王循环链表实现.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C+n只猴子围成一圈,顺时针方向从1到n编号。之后从1号开始没顺时针方向让猴子从1,2,.,m依次报数,凡是报到m的猴子,就让其出圈,取消候选资格。然后不停地按顺时针方向逐一让报到m者出圈,是的剩下的一个就是猴王。 #include usingnamespacestd; structmonkey/结构声明 intnum;/整型数,用于记录猴子号 monkey*next;/monkey结构指针 ; monkey*head,*tail;/monkey结构指针,全局变量 voidcreat(intnn)/被调用函数 /函数体开始 inti;/整型变量i,用于计数 monkey*p,*q;/声明monkey结构指针p,q p=newmonkey;/为p分配内存空间 p-num=1;/初始化p结点num域为1 p-next=NULL;/初始化p结点next域为空 head=p;/链表头指针head赋值为p q=p;/q赋值为p for(i=2;inum=i;/初始化p结点num域为i,表示猴子号 q-next=p;/将p点加到链表尾部 q=p;/让指向链表尾部结点 p-next=NULL;/链表尾部指向空 tail=q;/链表尾 tail-next=head;/链表尾部指向链表头,形成循环链表 /被调用函数select,mm表示结点删除间隔 voidselect(intmm) /函数体开始 intx=0;/声明整型值x,并初始化为0 monkey*p,*q;/声明指针变量p,q q=tail;/q赋值给tail,指向循环链表尾部 do/直到型循环,用于循环删除指定间隔的结点 p=q-next;/p赋值给相邻的下一个结点 x=x+1;/x加1 if(x%mm=0)/x是否整除mm cout被删除的猴子号为numnext=p-next;/删除此结点 deletep;/释放空间 p=NULL; else q=p;/q指向相邻的下一个结点p while(q!=q-next);/剩余结点数不为1,则继续循环 head=q;/head指向结点q,q为链表中剩余的一个结点 /函数体结束 intmain()/函数体开始 intn,m;/声明整型变量n,m head=NULL;/初始化head为空 coutn;/输入待插入结点的数据 coutm;/输入间隔 creat(n);/调用函数creat建立循环链表 select(m);/调用函数select,找出剩下的猴子 cout猴王是numdata = 1;/为什么错误数据会返回“第一号猴子”的值?是这里初始化的么?(如果是可以换成0的说) for (i = 2; i data = i; p-next = q; p = q; p-next =(*L);void King(LinkList *L, int n, int m) Node *p, *q; int k; int j = 1; p = (*L); for (; m 1; m-) k = 1; while (k != n) p = p-next; k+; printf(第%d个出队列的是%d号猴子,n, j+, p-data); p-data = p-next-data; q = p-next; p-next = p-next-next; free(q); printf(最终结果:大王是第%d号猴子。n,p-data);int main(void) int m, n;LinkList L; printf(请输入猴子总数m,和数到那个猴子出队n,(逗号隔开):);scanf(%d%d,&m,&n);/在这后面加判断、提示部分。for循环判断.CreatLinkList(&L, m); King(&L, n, m); sistem(pause); return 0;题目描述:n只猴子要选大王,选举方法如下:所有猴子按 1,2 n 编号并按照顺序围成一圈,从第 k 个猴子起,由1开始报数,报到m时,该猴子就跳出圈外,下一只猴子再次由1开始报数,如此循环,直到圈内剩下一只猴子时,这只猴子就是大王。输入数据:猴子总数n,起始报数的猴子编号k,出局数字m输出数据:猴子的出队序列和猴子大王的编号代码修改了一天才完成,第一次是用多个函数写的,但是发觉C语言没有引用参数这个特性,使得形参指针不能被直接修改,必须靠返回值来修改才行,这样太麻烦了.于是第二次写的时候就没有使用函数,直接在main()里完成了循环链表的操作,感觉应该没什么问题,哪位大牛看出问题跟我说下,thx.123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384/*约瑟夫问题(猴子选大王)循环链表C语言实现Slyar 2009.3.31*/#include #include /* 定义链表节点类型 */typedef struct node int data; struct node *next;linklist;int main() int i, n, k, m, total; linklist *head, *p, *s, *q; /* 读入问题条件 */ printf(请输入猴子的个数:); scanf(%d, &n); printf(请输入要从第几个猴子开始报数:); scanf(%d, &k); printf(请输入出局数字:); scanf(%d, &m); /* 创建循环链表,头节点也存信息 */ head = (linklist*) malloc(sizeof(linklist); p = head; p-data = 1; p-next = p; /* 初始化循环链表 */ for (i = 2; i data = i; s-next = p-next; p-next = s; p = p-next; /* 找到第 k 个节点 */ p = head; for (i = 1; i next; /* 保存节点总数 */ total = n; printf(n出局序列为:); q = head; /* 只剩一个节点时停止循环 */ while (total != 1) /* 报数过程,p指向要删除的节点 */ for (i = 1; i next; /* 打印要删除的节点序号 */ printf(%d , p-data); /* q 指向 p 节点的前驱 */ while (q-next != p) q = q-next; /* 删除 p 节点 */ q-next = p-next; /* 保存被删除节点指针 */ s = p; /* p 指向被删除节点的后继 */ p = p-next; /* 释放被删除的节点 */ free(s); /* 节点个数减一 */ total-; /* 打印最后剩下的节点序号 */ printf(nn猴子大王为第 %d 号nn, p-data); free(p); /system(pause); return 0;实验二#include#include#include#define OK 1#define ERROR 0#define OVERFLOW 0typedef int Status; typedef struct LNodeint data;struct LNode *next;LNode,*LinkList;void CreatList_L(LinkList &L,int n)L=(LinkList)malloc(sizeof(LNode);L-next=NULL;int i;LinkList q,p;q=L;for(i=n;i0;-i)p=(LinkList)malloc(sizeof(LNode);cinp-data;q-next=p;p-next=NULL;q=p;/尾插法 void output(LinkList &L) LinkList p; p=L-next; while(p) coutdata; p=p-next; /输出函数 Status ListInsert_L(LinkList &L,int i,int e)LinkList p,s;int j; p=L;j=0; while(p&jnext;+j; if(!p|ji-1)return ERROR; s=(LinkList)malloc(sizeof(LNode); s-data=e;s-next=p-next; p-next=s; return OK; void main()LinkList L;CreatList_L(L,4);output(L);ListInsert_L(L,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论