| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 972 人关注过本帖
标题:关于约瑟夫环问题,连接和编译都没问题,但一执行就出现错误,希望别人指教 ...
取消只看楼主 加入收藏
qiqid
Rank: 2
等 级:论坛游民
帖 子:36
专家分:12
注 册:2013-3-31
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:2 
关于约瑟夫环问题,连接和编译都没问题,但一执行就出现错误,希望别人指教指教。
#include<stdio.h>
#include<stdlib.h>

typedef struct node
{
    int number;
    int password;
    struct node *next;
}person;
typedef person *personlist;
/* 得到一个头指针 */

void initlist(person *l)
{
    person *head,*rear;
    head=(person*)malloc(sizeof(person));    /* 得到一个头结点 */
    rear=head;                                /* 让该链表为一条循环单链表 */
}
/* 初始化链表 */

void Dellist(personlist l,int e)
{
    person *r,*p;
    p=l->next;                /* 让指针p指向头结点,从链表开始从头查找*/
    while(p->next!=l->next)    /* 当头结点指向自己的时候,表示删除完毕*/
    {
        p=p->next;            /* 指针在链表上移动*/
        if((p->number)==e)
            {
                r=p->next;
                p->next=r->next;
                free(r);
            }            /* 当指针指向的当前该结点的值时,删除该结点,并且释放结点空间*/
    }
}
/* 删除链表中与e相等的值 */

int createlist(personlist l)
{
    person *rear,*s;
    int x,y;            /* 让x和y分别赋值给结点上的号码与密码 */
    int n;
    n=0;                /* n为输入的人数 */
    int flag=1;
    rear=l->next;
    while(flag)
    {
        if(x!=(-1))        /*当输入的号码为-1时,结束输出 */
        {
            s=(personlist)malloc(sizeof(person));
            scanf("%d,%d",&x,&y);
            s->number=x;
            s->password=y;
            rear->next=s;
            rear=s;
            n++;
        }
        else
        {
            flag=0;
            rear->next=l->next;    /* 让末尾结点指针指向头结点 */
        }
    }
return n;
}
/* 成功建立了一个链表 */

int showlist(personlist l,int k)
{
    person *p;
    int n;
    int flag;
    p=l->next->next;
    n=1;
    flag=1;
    while(flag)
    {
        if(n<=k)
        {
            printf("%d",*p);
            p=p->next;
            n++;
        }        
        else
            flag=0;
    }
return n;
}
/* 为了检验,输出所有人的密码 */

void yuesefu(person *l,int m)
{
    person *p;
    p=l->next;
    while(p->next!=l->next)
    {
        p=p->next;
        if((p->number)==m)
        {
            printf("%d,%d",p->number,p->password);
            m=(p->password);
        }
        Dellist(l,m);
    }
}
/* 让指针在链表上移动并查找与m相匹配密码的人,输出,且将其删除 */

int main()
{
    person *l;
    initlist(l);

    int y;
    y=createlist(l);

    showlist(l,y);

    int x;
    x=20;
    yuesefu(l,x);

    return 0;
}
/* 编写主函数 */
搜索更多相关主题的帖子: next void password include person 
2013-04-23 12:38
qiqid
Rank: 2
等 级:论坛游民
帖 子:36
专家分:12
注 册:2013-3-31
收藏
得分:0 
这是一道算法与数据结构题目,我下面写一下我的思路。
1、建立一个头指针,后续的结点数据域是number,password。
2、接下来是定义一系列的链表基本操作,如:initlist(初始化链表),Dellist(删除链表中的结点)。
3、将建立好的链表一一输出。
4、编写实现约瑟夫环问题的函数。
对于那个m,我是想让环内的人一一报数,当数到m时,输出这个人的号码与密码,然后删除这个结点,再让这个人的密码为这个m值,重复操作,直至链表删除完毕。
看了一下你的程序,为什么在主函数里面要定义一个指针p和整型变量c、i但后面又没有去用它,还有为甚么要又申请一个结点。我想应该是多余的吧,还是你输入错了?
最后谢谢你啊!
2013-04-24 12:44
qiqid
Rank: 2
等 级:论坛游民
帖 子:36
专家分:12
注 册:2013-3-31
收藏
得分:0 
#include<stdio.h>
#include<stdlib.h>

typedef struct node
{
    int number;
    int password;
    struct node *next;
}person;
typedef person *personlist;
/* 得到一个头指针 */

void initlist(personlist *l)
{
   
    (*l)=(person*)malloc(sizeof(person));        /* 得到一个头结点 */
    (*l)->next=(*l);                            /* 让该链表为一条循环单链表 */
}
/* 初始化链表 */

int Dellist(personlist p,int *s)                /* p代表当前指针指向的结点,s是为了给m重新赋值 */
{
    person *r;
    int t;
               
    r=p->next;
    t=r->number;
    *s=r->password;                                /* 将m的值改为被删除的人的密码 */

    p->next=r->next;
    free(r);                                    /* 删除结点 */
   
    return t;
}
/* 删除链表中与e相等的值 */

int createlist(personlist l)
{
    person *p,*s;
    int i=1,y;            /* 让i和y分别赋值给结点上的号码与密码 */

    int x;
   
    p=l;

    printf("请输入人数:");
    scanf("%d",&x);
    for(int n=0;n<x;n++)
    {
        p=p->next;
        s=(personlist)malloc(sizeof(person));
        printf("请输入第%d个人的密码:",i);
        scanf("%d",&y);

        s->number=i;
        s->password=y;
        
        p->next=s;
        s->next=l;                    /* 让末尾结点指针指向头结点,构成循环链表 */

        i++;
    }   
    return n;
}
/* 成功建立了一个链表 */

void showlist(personlist l,int k)
{
    person *p;
    p=l->next;
   

    printf("输出原始序列\n");

    for(int n=1;n<=k;n++)
    {
        printf("%d,%d\n",n,p->password);
        p=p->next;
    }
}
/* 为了检验,输出所有人的密码 */

void yuesefu(person* l,int m)
{
    person *p;
    p=l;

    int t;

    printf("显示出列顺序:\n");

    while( l->next != l )
    {
        for(int i=1;i<m;i++)
        {
            if(p->next==l)        /* 头结点不能报数 */
            {   
                p=p->next;
            }

            p=p->next;

            if(p->next==l)        /* 头结点不能删除 */
            {
                p=p->next;
            }
        }

            t=Dellist(p,&m);
            
            printf("出列:%d\n",t);
            
            printf("新密码:%d\n",m);
    }
}
/* 让指针在链表上移动并查找与m相匹配密码的人,输出且将其删除 */

int main()
{
    personlist l=NULL;
    initlist(&l);

    int y;
    y=createlist(l);

    showlist(l,y);

    int x;
   
    printf("请输入初始密码:");
    scanf("%d",&x);

    yuesefu(l,x);

    return 0;
}
/* 编写主函数 */
修改了原先的程序,真的错误很多,现在能够通过了。
这里我先列出来需要注意的地方:1、其实我原先在调用Initlist函数时,调用错了,应把主函数定义的指针l地址传给形参;
                              2、建立循环链表时每新建一个结点都应将该结点指回头结点;
                              3、yuesefu函数中前面的for循环挺难想的,这是别人教的。
最后希望二楼再看一下,应该就可以明白你原先的疑问了。
2013-04-25 23:59
快速回复:关于约瑟夫环问题,连接和编译都没问题,但一执行就出现错误,希望别人 ...
数据加载中...
 
   



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

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