注册 登录
编程论坛 数据结构与算法

请问我编写的这个实现 约瑟夫环 的问题哪里错了?

抹茶裙边 发布于 2015-10-04 15:48, 2559 次点击
程序代码:
#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;
}
19 回复
#2
抹茶裙边2015-10-04 15:49
编译能通过 就是运行的时候会提示已停止工作 那就是出错了嘛 请问错在哪里了阿 谢谢
#3
抹茶裙边2015-10-04 16:05
我又修改了一下程序 以前写的不太对

程序代码:
#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;
}
#4
抹茶裙边2015-10-04 16:05
但还是不能运行成功
#5
林月儿2015-10-04 16:48
代码有明显逻辑问题,自己写的吗
#6
林月儿2015-10-04 16:51
说说代码功能,想要什么效果
#7
林月儿2015-10-04 17:04
#define Status int
#define OK 1
Status CreatCyclelist(int n)//创建一个不带头节点的循环单链表
这个函数的返回值类型应该是int型
然而
你在main函数里出现这句
    LinkList h;
    printf("请输入顺序链表的表尾值:");
    scanf_s("%d",&n);
    h = CreatCyclelist(n);
这里就有数据类型转换异常的报错,那么请说说代码主干部分想要达到的功能,不然我不知道怎么改。
#8
抹茶裙边2015-10-04 18:58
回复 5楼 林月儿
嗯嗯= =自己写的

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

而我是想 先创建一个不带头节点的循环单链表 然后当counter<m的时候,指针s一直向后挪动,当报到m时,counter=m,删除这个报m的人,然后继续。直到所有人都出列。
#9
抹茶裙边2015-10-04 19:00
回复 7楼 林月儿
已经改啦,还是不行呢。

好纠结
#10
抹茶裙边2015-10-04 19:19
回复 7楼 林月儿
抱歉刚刚出去了没看到 谢谢你拉~好热心的
#11
林月儿2015-10-04 19:20
程序代码:
#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;

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->next = p;
            q=q->next;
        }
    }
    if (q != NULL)
        q->next = head;

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

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("请输入顺序链表的表尾值:");
    printf("请输入顺序链表的的长度:");
    scanf_s("%d",&n);
    h = CreatCyclelist(n);
    DisplayCycleList(h);
    return 0;
}
#12
抹茶裙边2015-10-04 19:27
回复 11楼 林月儿
大神 太感谢太感谢太感谢了!不胜感激感恩戴德都是我对你此时此刻的感受阿!!

太爱你拉><谢谢~好人一生平安

已经通过啦也运行成功~再次感谢!
#13
抹茶裙边2015-10-04 20:13
程序代码:
#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
    {
        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 s;
}

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;
}
#14
林月儿2015-10-04 20:31
程序代码:
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)//我觉得吧,counter等于m只会有一次相当于y=x和y=n交点只能有一个
            {
                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 s;
#15
抹茶裙边2015-10-04 20:58
那个循环链表的下一节点我是想的是剩下最后一个节点了,它的指针域一定是NULL。我其实是不太懂怎么表示就剩下一个节点..



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)//我觉得吧,counter等于m只会有一次相当于y=x和y=n交点只能有一个
            {
                Q = (LinkList)malloc(sizeof(ListNode));
                Q = s;
                s = head;
                while (s->next != Q)  s = s->next;
                s->next = Q->next;
                free(Q);
            }
          counter=0;//这里将counter重新清零,能不能改正它们只有一次相等的错误?
        } while (s->next = NULL);//循环链表下一结点怎么会空?(我想的是最后删除的只剩下一个节点了,此时这个节点的指针域一定是空啊。其实这里我是想表达就剩下一个节点了)
    }
    return s;
#16
抹茶裙边2015-10-04 20:59
回复 14楼 林月儿
程序代码:
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)//我觉得吧,counter等于m只会有一次相当于y=x和y=n交点只能有一个
            {
                Q = (LinkList)malloc(sizeof(ListNode));
                Q = s;
                s = head;
                while (s->next != Q)  s = s->next;
                s->next = Q->next;
                free(Q);
            }
          counter=0;//这里将counter重新清零,能不能改正它们只有一次相等的错误?
        } while (s->next = NULL);//循环链表下一结点怎么会空?(我想的是最后删除的只剩下一个节点了,此时这个节点的指针域一定是空啊。其实这里我是想表达就剩下一个节点了)
    }
    return s;
#17
林月儿2015-10-04 21:00
以下是引用抹茶裙边在2015-10-4 20:59:01的发言:

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)//我觉得吧,counter等于m只会有一次相当于y=x和y=n交点只能有一个
            {
                Q = (LinkList)malloc(sizeof(ListNode));
                Q = s;
                s = head;
                while (s->next != Q)  s = s->next;
                s->next = Q->next;
                free(Q);
            }
          counter=0;//这里将counter重新清零,能不能改正它们只有一次相等的错误?
        } while (s->next = NULL);//循环链表下一结点怎么会空?(我想的是最后删除的只剩下一个节点了,此时这个节点的指针域一定是空啊。其实这里我是想表达就剩下一个节点了)
    }
    return s;

额。。。
#18
抹茶裙边2015-10-04 21:01
回复 14楼 林月儿
错了,是counter=2;
#19
抹茶裙边2015-10-04 21:02
回复 17楼 林月儿
#20
Susake2015-10-04 21:06
加油
1