标题:请问我编写的这个实现 约瑟夫环 的问题哪里错了?
只看楼主
林月儿
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:湖南
等 级:版主
威 望:138
帖 子:2276
专家分:10647
注 册:2015-3-19
得分:11 
程序代码:
#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;
}

剑栈风樯各苦辛,别时冰雪到时春
2015-10-04 19:20
抹茶裙边
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2015-10-3
得分:0 
回复 11楼 林月儿
大神 太感谢太感谢太感谢了!不胜感激感恩戴德都是我对你此时此刻的感受阿!!

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

已经通过啦也运行成功~再次感谢!
2015-10-04 19:27
抹茶裙边
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2015-10-3
得分:0 
程序代码:
#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;
}
2015-10-04 20:13
林月儿
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:湖南
等 级:版主
威 望:138
帖 子:2276
专家分:10647
注 册:2015-3-19
得分:0 
程序代码:
 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;

剑栈风樯各苦辛,别时冰雪到时春
2015-10-04 20:31
抹茶裙边
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2015-10-3
得分:0 
那个循环链表的下一节点我是想的是剩下最后一个节点了,它的指针域一定是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;
2015-10-04 20:58
抹茶裙边
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2015-10-3
得分:0 
回复 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;
2015-10-04 20:59
林月儿
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:湖南
等 级:版主
威 望:138
帖 子:2276
专家分:10647
注 册:2015-3-19
得分:0 
以下是引用抹茶裙边在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;

额。。。

剑栈风樯各苦辛,别时冰雪到时春
2015-10-04 21:00
抹茶裙边
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2015-10-3
得分:0 
回复 14楼 林月儿
错了,是counter=2;
2015-10-04 21:01
抹茶裙边
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2015-10-3
得分:0 
回复 17楼 林月儿
2015-10-04 21:02
Susake
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:女儿国的隔壁
等 级:贵宾
威 望:23
帖 子:2288
专家分:6481
注 册:2012-12-14
得分:0 
加油

仰望星空...........不忘初心!
2015-10-04 21:06



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




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

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