回 帖 发 新 帖 刷新版面

主题:约瑟夫环问题--看看了好几次,还是不知道错在那,高手帮忙之

我的程序是在vc环境下运行的,如输入10 ,3,本应输出
3,6,9,2,7,1,8,5,10,4,却只输出3,还弹出错
误窗口,请高手帮忙看一下,改一改,谢个先!


#include "stdafx.h"
#include "stdio.h"
#include "malloc.h"

typedef int DataType;
typedef struct LNode
{
    DataType data;
    struct LNode *next;
}LinkList;


LinkList *CreatList(int n)
{     //建立一个不带头结点的环形单链表,并返回表头指针
    LinkList *head=NULL;
    LinkList *p,*q;    //p指向新生的节点,q始终指向当前链表的尾节点
    int i;
    if(n>0)
    {
        p=(LinkList *)malloc(sizeof(LinkList));
        head=p;
        for(i=1;i<=n;i++)
        {
            p->data=i;
            q=(LinkList *)malloc(sizeof(LinkList));
            q->data=NULL;
            p->next=q;
            p=q;
        }
    }
    return (head);
}

void josephus(int n,int k)
{
    LinkList *p,*q;
    int i=0,j;
    p=CreatList(n);     //创建环形链表p 指向数据域为1的节点
    q=p;          //q指向数据域为1的前驱节点
    while (i<n)
    {
        for(j=1;j<k;j++)
            p=p->next;     //p指向待输出的前驱节点;
        q=p;     //q指向带输出的节点;
        printf("%d\t\n",q->data);
        p->next=q->next;
        free(q);
        i++;
    }
}



int main(int argc, char* argv[])
{
    int n,k;
    printf("Please Enter The Number N And K:");
    scanf("%d%d",&n,&k);
    josephus(n,k);
    return 0;
}

回复列表 (共4个回复)

沙发

int main(int argc, char* argv[])
死套结构作什么
int main()
这样就可以阿

主要问题还是在这里吧:
        for(j=1;j<k;j++)
            p=p->next;
        q=p;
        printf("%d\t\n",q->data);
        p->next=q->next;
        free(q);
        i++;
q被释放了之后是不是该重新申请空间?

板凳

验出来了
你构造的不是环形单链

3 楼

LinkList *CreatList(int n)
{     //建立一个不带头结点的环形单链表,并返回表头指针
    LinkList *head=NULL;
    LinkList *p,*q;    //p指向新生的节点,q始终指向当前链表的尾节点
    int i;
    if(n>0)
    {
        p=(LinkList *)malloc(sizeof(LinkList));
        head=p;
        for(i=1;i<=n;i++)
        {
            p->data=i;
            q=(LinkList *)malloc(sizeof(LinkList));
            q->data=NULL;
            p->next=q;
            p=q;
        }
    }
    [color=ff0000]p->next=head;//你缺这闭合环的关键一句
    return (head);
}

4 楼

太谢谢了,纠正了不少错误!

我来回复

您尚未登录,请登录后再回复。点此登录或注册