标题:请问我编写的这个实现 约瑟夫环 的问题哪里错了?
只看楼主
抹茶裙边
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2015-10-3
结帖率:60%
已结贴  问题点数:11 回复次数:19 
请问我编写的这个实现 约瑟夫环 的问题哪里错了?
程序代码:
#include<stdio.h>
#include<stdlib.h>

struct Node
{
    int data;
    struct Node *next;
};

typedef struct Node ListNode;
typedef struct Node *LinkList;

LinkList CreatCyclelist(int n)//创建一个不带头节点的循环单链表
{
    LinkList head = NULL;
    int e;
    int i;
    ListNode *p, *q;
    q = NULL;
    for (i = 1; i <= n; i++)
    {
        printf("请输入元素:\n");
        scanf_s("%d",&e);
        
        if (i == 1)
        {
            head = (LinkList)malloc(sizeof(ListNode));
            head->data = e;
            head->next = NULL;
            q = head;
        }
        else
        {
            p = (LinkList)malloc(sizeof(ListNode));
            p->data = e;
            p->next = NULL;
            q = p;
        }
    }
    if (q != NULL)
        q->next = head;

    int m,counter=2;
    ListNode *s;
    ListNode *Q;
    s = Q = NULL;
    
    s = head->next;
    printf("请输入一个正整数作为报数上限值");
    scanf_s("%d",&m);
    if (m == 1)
    {
        q->next = head->next;
        free(head);
    }
    else
    {
        while (counter < m)
        {
            s = (LinkList)malloc(sizeof(ListNode));
            s=s->next;
            counter++;
        }
        if (counter == m)
        {
            Q = (LinkList)malloc(sizeof(ListNode));
            Q = s;
            s = head;
            while (s->next != Q)  s = s->next;
            s->next = Q->next;
            free(Q);
        }

    }
    return head;
}

void DisplayCycleList(LinkList head)
{
    ListNode *p;
    p = head;
    if (p == NULL)
    {
        printf("该链表是空表");
        return;
    }
    while (p->next != head) {
        printf("%d", p->data);
        p = p->next;
    }
    printf("%4d", p->data);
}

main()
{
    int n;
    LinkList h;
    printf("请输入顺序链表的表尾值:");
    scanf_s("%d",&n);
    h = CreatCyclelist(n);
    DisplayCycleList(h);
    return 0;
}
搜索更多相关主题的帖子: 约瑟夫 
2015-10-04 15:48
抹茶裙边
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2015-10-3
得分:0 
编译能通过 就是运行的时候会提示已停止工作 那就是出错了嘛 请问错在哪里了阿 谢谢
2015-10-04 15:49
抹茶裙边
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2015-10-3
得分:0 
我又修改了一下程序 以前写的不太对

程序代码:
#include<stdio.h>
#include<stdlib.h>
#define Status int
#define OK 1

struct Node
{
    int data;
    struct Node *next;
};

typedef struct Node ListNode;
typedef struct Node *LinkList;

Status CreatCyclelist(int n)//创建一个不带头节点的循环单链表
{
    LinkList head = NULL;
    int e;
    int i;
    ListNode *p, *q;
    q = NULL;
    for (i = 1; i <= n; i++)
    {
        printf("请输入元素:\n");
        scanf_s("%d",&e);
        
        if (i == 1)
        {
            head = (LinkList)malloc(sizeof(ListNode));
            head->data = e;
            head->next = NULL;
            q = head;
        }
        else
        {
            p = (LinkList)malloc(sizeof(ListNode));
            p->data = e;
            p->next = NULL;
            q = p;
        }
    }
    if (q != NULL)
        q->next = head;

    int m,counter=2;
    ListNode *s;
    ListNode *Q;
    s = Q = NULL;
    
    s = head->next;
    printf("请输入一个正整数作为报数上限值");
    scanf_s("%d",&m);
    if (m == 1)
    {
        q->next = head->next;
        free(head);
    }
    else
    {
        do
        {
            while (counter < m)
            {
                s = (LinkList)malloc(sizeof(ListNode));
                s = s->next;
                counter++;
            }
            if (counter == m)
            {
                Q = (LinkList)malloc(sizeof(ListNode));
                Q = s;
                s = head;
                while (s->next != Q)  s = s->next;
                s->next = Q->next;
                free(Q);
            }
        } while (s->next = NULL);
    }
    return OK;
}

void DisplayCycleList(LinkList head)
{
    ListNode *p;
    p = head;
    if (p == NULL)
    {
        printf("该链表是空表");
        return;
    }
    while (p->next != head) {
        printf("%d", p->data);
        p = p->next;
    }
    printf("%4d", p->data);
}

main()
{
    int n;
    LinkList h;
    printf("请输入顺序链表的表尾值:");
    scanf_s("%d",&n);
    h = CreatCyclelist(n);
    DisplayCycleList(h);
    return 0;
}
2015-10-04 16:05
抹茶裙边
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2015-10-3
得分:0 
但还是不能运行成功
2015-10-04 16:05
林月儿
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:湖南
等 级:版主
威 望:138
帖 子:2276
专家分:10647
注 册:2015-3-19
得分:0 
代码有明显逻辑问题,自己写的吗

剑栈风樯各苦辛,别时冰雪到时春
2015-10-04 16:48
林月儿
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:湖南
等 级:版主
威 望:138
帖 子:2276
专家分:10647
注 册:2015-3-19
得分:0 
说说代码功能,想要什么效果

剑栈风樯各苦辛,别时冰雪到时春
2015-10-04 16:51
林月儿
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:湖南
等 级:版主
威 望:138
帖 子:2276
专家分:10647
注 册:2015-3-19
得分:0 
#define Status int
#define OK 1
Status CreatCyclelist(int n)//创建一个不带头节点的循环单链表
这个函数的返回值类型应该是int型
然而
你在main函数里出现这句
    LinkList h;
    printf("请输入顺序链表的表尾值:");
    scanf_s("%d",&n);
    h = CreatCyclelist(n);
这里就有数据类型转换异常的报错,那么请说说代码主干部分想要达到的功能,不然我不知道怎么改。

剑栈风樯各苦辛,别时冰雪到时春
2015-10-04 17:04
抹茶裙边
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2015-10-3
得分:0 
回复 5楼 林月儿
嗯嗯= =自己写的

约瑟夫环是这样的:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为1的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。

而我是想 先创建一个不带头节点的循环单链表 然后当counter<m的时候,指针s一直向后挪动,当报到m时,counter=m,删除这个报m的人,然后继续。直到所有人都出列。
2015-10-04 18:58
抹茶裙边
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2015-10-3
得分:0 
回复 7楼 林月儿
已经改啦,还是不行呢。

好纠结
2015-10-04 19:00
抹茶裙边
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2015-10-3
得分:0 
回复 7楼 林月儿
抱歉刚刚出去了没看到 谢谢你拉~好热心的
2015-10-04 19:19



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-457922-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.623270 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved