C语言问题:约瑟夫环,程序出了点毛病,求大佬帮助

编号为1,2…n的人按顺时针方向围坐一圈,每个人持有一个密码(正整数)。开始任选一个整数作为报数上限m,从第一个人顺时针自1开始顺时针报数,报到m时停止报数。报到m的人出列,将他的密码作为新的m值,从他顺时针方向上的下一个人开始重新从1报下去,如此下去,直到所有的人全部出列为止。

例如,m的初值为20;n=7,7个人的密码依次是3,1,7,2,4,8,4。求出列的顺序。

求解思路:利用不带头结点的循环单链表求解

在本程序中,节点内有三部分,序号、密码和指针域

存在问题:无法输入初始报数人数,输入完密码回车后就开始死循环打印

#include <stdio.h>
#include <stdlib.h>

typedef struct Node
{
    int data;//密码
    int data_order;//序号
    struct Node* next;
}Node,*LinkList;

//初始化循环单链表,返回值为指针
Node* IntCLinkList()
{
    Node *CL;
    CL=(Node*)malloc(sizeof(Node));
    CL->next=NULL;
    return(CL);
 } 
//建立循环单链表
int CreateCLinkList(LinkList CL)
{
    Node *rear,*s;
    int c;
    rear=CL;
    int i=1,count=0;
    printf("Please input the key if no.%d preson:",i);
    while(scanf("%d",&c)!=0)
    {
        s=(Node*)malloc(sizeof(Node));
        s->data=c;
        s->data_order=i;
        rear->next=s;
        rear=s;
        i++;
        count++;
        printf("Please input the key if no.%d preson:",i);
    }
    return(count);//返回节点数 (初始人数) 
 } 
 //删除节点并返回新key 
 int DelNode(LinkList CL,int count,int *order_save)
 {
    int i,key; 
    Node *p,*q;
    p=CL;//令P指向表头 
    //令P指向最后一个报数的前一个人 

    //定位到上一次删除节点的下一个 
    for(i=0;i<count;i++)
    {
        if(p->data_order!=(*order_save))
         p=p->next;
        else
         break;
    }
    for(i=0;i<count-1;i++)
    {
        p=p->next; 
    }
    q=p->next->next;
    p->next=q;
    p=p->next;
    key=p->data;
    *order_save=q->data_order;
    printf("\n%5d",p->data_order);
    return(key);
  } 

//显示输入
void showInput(LinkList CL)
{
    Node *p;
    p=CL->next;
    while(p->next!=CL)
    {
        printf("%d  %d\n",p->data,p->data_order);
        p=p->next;
    }
 } 

int main() {
    int m=0,count,key,order_save;//保存上一次删除节点下一个节点的位置信息
    Node *CL=IntCLinkList();
    count=CreateCLinkList(CL);

    showInput(CL);
    printf("\nPlease input the sum of the first count:");
    scanf("%d",&m);

    if(m>count)
     count=m%count;
    while(count!=0)
    {
        key=DelNode(CL,count,&order_save);
        m=key;
        count--;
        if(m>count)
          count=m%count;
    }

    return 0;
}

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C语言/约瑟夫环问题
#include #include struct number { int num; struct number * next; }; void main () { int m, n; struct number * p, * head=NULL, * tail; printf("please input M and N:\n"); scanf("%d %d", &m, &
约瑟夫环 C语言
在VS C++2010下测试通过 如要在VC6.0下运行,需去除stdafx.h的头文件
约瑟夫环C语言
单链表结构的约瑟夫环
(C语言)约瑟夫环问题
题目描述 有n个人围成一圈,按顺序排号。从第一个人开始报数,凡报到m的人退出游戏,然后下一个接着重新开始报数。比如n = 6,m = 3,当报到3时3号退出游戏,接着4号又从1开始报数......问最后留下的是原来第几号的那位? 输入 输入有多组测试数据。 每组测试数据在一行中给出正整数n和m,(0 当读取到文件结尾时输入结束。 输出 对每组测试数据,在一
【C语言】 约瑟夫环问题
用一个数组储存,每到需要出去的数,把他令为0,下一次遍历到这个数,判断他是否为0,如果为0则不进行增加 #include "stdio.h" int main() {  int a[10] = {1,2,3,4,5,6,7,8,9,10};  int i = 0;  int x = 10;  int k = 0;         //记录次数  int
c语言约瑟夫环
有关数据结构的约瑟夫算法,使用C语言做的
C语言——约瑟夫环
设编号1,2…..n的n个人围坐在一圈,任选一个正整数作为报数的上限值,从第k个人开始按顺时针报数,数到m的那个人出局,他的顺时针方向下一位又从1开始报数,数到m的那个人又出局,以此类推,直到所有人出局为止,请用链表写一个函数找出每轮的幸存者。(假设n个人已经插入链表) struct{ int num; struct node *next; } typedef struct node N
C语言 约瑟夫环
大一上学期C语言实验课练习 约瑟夫环的实现 C语言C语言
C语言约瑟夫环
循环链表实现约瑟夫环 typedef struct cnode { int data,secret; struct cnode* next; }*circlelist,cnode;
【C语言】约瑟夫环/约瑟夫问题的实现
1、什么是约瑟夫环/约瑟夫问题 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从0~n-1,最后结果+1即为原问题的解。 2、约瑟夫环、约瑟夫问题的实...
最近电脑出了点毛病
比如我玩3D游戏的时候,游戏里面的‘指向物品然后双击’是打开相应货柜的,结果双击变成了拉近距离(3D游戏)……rn什么错误提示都没有。rn然后部分操作是乱的。rn今天看暴风影音,程序面板上打开播放列表那个键,对应功能又突然变成了全屏。rn感觉怪怪的,这个是CPU坏了吗?rn请各位大大帮我一下啊。
新手求帮助!约瑟夫环的问题!
刚开始接触C,关于约瑟夫环的问题。rn有m个人,用户输入m,围成一圈,每个人的编号为1到m。从第一个人开始顺时针点到,点到n时,此人出列,n为用户输入。下一个人开始报数,报到n时出列。以此规律重复下去,知道所有人出列。打印出列的顺序。rn在网上找了好多,都是用链表和指针做的。我想求哪位高手帮忙给看下有没有不用链表指针什么的。只用一些循环呀,控制语句什么的。谢谢了!
简单的程序 c语言实现约瑟夫环
用c语言编写的小程序实现约瑟夫环,用无头节点链表实现,可由用户输入个数以及密码
C语言:写一个约瑟夫环的程序
又看到了一个《用C语言 写了一个约瑟夫环》的问题。提供了程序,大约 60~70 行。怎么看,也看不懂。好像,还用上了结构、链表。题目链接:http://zhidao.baidu.com/question/810245459674796572其实,问题很简单。做而论道编程如下:     (2015-04-02 23:24)以前写过这程序。 远远没有你写的这么长。 #include  #define
用C语言写的约瑟夫环的程序
这是一个数据结构的课程设计题目,用C语言完成的约瑟夫环的设计。虽然功能不是很强大,但是完全符合题目要求。
用C语言编写的约瑟夫环程序
本程序主要是以建立单循环链表的形式,利用单向循环链表存储结构模拟此过程,建立起一个约瑟夫环,然后根据之前创立的结点,输入结点里的一些数据,程序有主函数开始,首先,提示输入创建约瑟夫环环数以及每个环上所带的密码。然后,开始调用JosephuNode *Creat_Node函数,利用单循环链表建立起约瑟夫环,tail->next = head;就是将最后一个结点的后继指向头结点,函数结尾 return head; 将约瑟夫环的头指针返回,并将它赋值head,然后主函数继续调用Josephu函数,通过讲head和Password引入函数,以建立两个嵌套循环输出并实现功能
约瑟夫环问题 C语言问题
约瑟夫环问题 C语言问题约瑟夫环问题 C语言问题
一个程序出了点毛病求大神指正啊啊啊
[b]要求[/b] 已知L为无头结点单链表中第一个结点的指针,每个结点数据域存放一个字符,该字符可能是英文字母字符或数字字符或其它字符,编写算法构造三个以带头结点的单循环链表表示的线性表,使每个表中只含同一类字符。(要求用最少的时间和最少的空间)rnrn啊啊啊,头疼死了。。。求大神有空看一下有什么错误rn等待指正的程序:rnrn[code=c]#includern#includern#includerntypedef struct listrn char date;rn struct list *next;rnlist;rnlist *build()//*构建无头结点的字符串*// rnrn char q=getchar();rn list *l,*s,*p;rn l=(list *)malloc(sizeof(list));rn l->next=NULL;rn p=l;rn while(q!='$')rn s=(list *)malloc(sizeof(list));rn s->date=q;rn p->next=s;rn p=s;rn q=getchar();rn //*字符链输入以$结束*// rn p->next=NULL;rn p=l->next;rn free(l);rn return p;rn//buildrnvoid sort(list *l,list *a,list *b,list *c)rnrn list *d,*e,*f;rn d=a,e=b,f=c; rn while(!l)rn if(l->date>=48&&l->date<=57)rn a->next=l;rn a=a->next;rn l=l->next;rn //*数据是0到9字符的链放到a链中*// rn else if((l->date<=90&&l->date>=65)||(l->date>=97&&l->date<=122))rn b->next=l;rn b=b->next;rn l=l->next;rn //*数据是字母的链放到b链中*// rn else rn c->next=l;rn c=c->next;rn l=l->next;rn //*数据是其他字符的链放到c链中*// rn rn a->next=d;rn b->next=e;rn c->next=f;//*构成循环链表*// rn//sortrnvoid print(list *x)rn list *y;rn y=x;rn while(x->next!=y)rn printf("%c ",x->next->date);//*输出单循环链 *//rn x=x->next;rn rn printf("\n");rn//printrnint main()rnrn list *l,*a,*b,*c;rn a=(list *)malloc(sizeof(list));rn b=(list *)malloc(sizeof(list));rn c=(list *)malloc(sizeof(list));//*构建三个头结点*// rn l=build();rn sort(l,a,b,c);rn print(a);rn print(b);rn print(c);rn return 0;rn[/code]
(C语言)约瑟夫环 Joseph
用C语言实现的约瑟夫环!是陈雁主编的<数据结构>那本书里第二章的第2个题!
约瑟夫环(数据结构C语言)
约瑟夫环问题 数据结构C语言
约瑟夫环c语言源代码
约瑟夫环c语言源代码,希望大家喜欢!编辑器是VC++.
c语言实现约瑟夫环
做的一般,还请见谅啊。c语言实现约瑟夫环
约瑟夫环 C语言 单循环链表
/*---------约瑟夫环---------*/ /*---------问题描述---------*/ /*编号为1,2,…,n的n个人围坐一圈,每人持一个密码(正整数)。 一开始任选一个正整数作为报数上限值m, 从第一个人开始自1开始顺序报数,报到m时停止。 报m的人出列,将他的密码作为新的m值,从他的下一个人开始重新从1报数, 如此下去,直至所有人全部出列为...
C语言实现约瑟夫环
伪链表实现  1  2  3  4  5  6  7  8  9 10 11  0   0   1   2   3   4  5   6  7   8   9   10  11     数组下标 伪链表本质是数组,用其下标表示每个人的序号,每个数组元素中存的是下一个人的下标(序号) 代码如下: //默认从1开始
数据结构 约瑟夫环 C语言
有编号从1到N的N个人坐成一圈报数,报到M的人出局,下一位再从1开始, 如此持续,直止剩下一位为止,报告此人的编号X。输入N,M,求出X。
约瑟夫环(C语言编写)
约瑟夫环代码 迷宫问题代码 矩阵乘法代码 转置矩阵代码 可运行 C语言编写 属于数据结构课程设计
数据结构约瑟夫环(C语言)
数据结构约瑟夫环算法,C语言描述。菜单显示
C语言 实现约瑟夫环
C语言 实现约瑟夫环 数据结构基本练习 循环链表
约瑟夫环c语言实现
用C语言实现约瑟夫环算法(环形链表的应用)
约瑟夫环 C语言 版本
很多数据结构初学者面临的第一个实验,比较简单,编出来 说明C语言入门了。
c语言(约瑟夫环)2017.4.23
/*有n个人围成一圈,顺序排号(从1开始)。从第一个人开始报数(从1到3报数),凡报到m的人退出圈子,问最后留下的是原来第几号的那位。 如 输入 10 ,最后留下4号 */ #include #define N 100 int main() {     int pos=-1;     int i=0,j=0,n,m,count=1;     int a[N]={0};  
约瑟夫环c语言代码
/* 此为小程序多文件的写法,有 joseph.c joseph.h main.c makefile 四个文件 */ // include include include “joseph.h” joseph *joseph_insert(int num) { joseph *l = NULL; joseph *p = NULL; j...
C语言-实现约瑟夫环
链式解法: #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; typedef struct sqlist { int data; struct sqlist *next; } SqList; //创建解约瑟夫环需要的链表,该链表不带头节点 SqList *CreatList(int Length) { SqList...
约瑟夫环C语言递归实现
#include&amp;lt;stdio.h&amp;gt;int yuesf(int m,int n){    if(m==1)    {        return 0;    }    else    return (yuesf(m-1,n) + n) % m;}int main(){    int a,b;    while(scanf(&quot;%d%d&quot;,&amp;amp;a,&amp;amp;b)!=EOF)    { ...
C语言 如何约瑟夫环
记得一年前,还不知道,或者说 无法理解:什么是约瑟夫环。 甚至给个代码,也无法看懂,无法理解。rn现在终于 实现了 顺序表的基本算法来实现了:约瑟夫环的问题了。 在此分享一下,呵呵。rnrn#includern#includern#define Maxsize 30rnstruct SqListrnrn int Data[Maxsize];rnrn int length;rn;rnrntypedef struct SqList SqList;rnrnvoid InitList(SqList *&L)rnrn L = (SqList *)malloc(sizeof(SqList));rnrn L->length = 0;rnrnrnvoid CreateList(SqList *&L)rnrn int i;rnrn int people;rnrn printf("请输入参加报数的人数:\n");rnrn scanf("%d",&people);rnrn for (i=0; iData[i] = i + 1;rnrn printf("%d ", L->Data[i]);rn rn rn printf("\n");rnrn L->length = people;rnrnrnvoid DisplayList(SqList *L)rnrn int m, i, j;rnrn int k=0;rnrn printf("请输入报数出队的次数: \n");rnrn scanf("%d", &m);rnrn for (i=L->length; i>0; i--)rn rn k=(k+m-1)%i;rnrn printf("%d ",L->Data[k]);rnrn for (j=k;jData[j] = L->Data[j+1];rn rnrn L->length = L->length - 1;rn rnrn printf("\n");rnrnvoid main()rnrn SqList *L;rnrn InitList(L);rnrn CreateList(L);rnrn DisplayList(L);rnrnrn更详细在下面rn[url=http://blog.163.com/wenxianliang08@126/blog/static/83583263201123082555788/]http://blog.163.com/wenxianliang08@126/blog/static/83583263201123082555788/[/url]
约瑟夫环 c语言实现
约瑟夫环的c语言实现,主要是运用c语言来写的约瑟夫环的简单程序。程序简洁易懂,适合于初学者。
C语言约瑟夫环源码
C语言约瑟夫环源码,数据结构,实验报告
C语言 版 约瑟夫环
约瑟夫环 数据结构 C语言版,栈。密码,任务,报数
c语言:约瑟夫环的实现
#include#include #include #define LEN sizeof(struct Node) using namespace std; typedef struct Node { int data; struct Node *next; }Node; typedef Node *linklist; void CreatNode (linklist &L,int n)
约瑟夫环课程设计(C语言)
运用循环链表做约瑟夫环课程设计是一个很方便快捷的方法,而且本软件采用C语言。
相关热词 c#异步发送kafka c#窗体编号 c# 操作二进制文件 c# 反射 机制 c#线程 窗体失去响应 c#角度转弧度 c# 解析gps数据 c# vs设置 语法版本 c# json含回车 c#多线程demo