| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1141 人关注过本帖
标题:约瑟夫实验,出问题了,大家看看
只看楼主 加入收藏
zflsky
Rank: 1
等 级:新手上路
帖 子:53
专家分:0
注 册:2008-3-25
收藏
 问题点数:0 回复次数:6 
约瑟夫实验,出问题了,大家看看
哪位大侠帮我看看啊,老师说不能用全局的,没办法,但是我有不知道错在哪里!不知道,为什么会出现这样的情况,而且程序不能执行!

#include<stdio.h>
#include<stdlib.h>

//---------------------构造单链表存储结构---------
struct Lnode
{
    int number;
    int key;
    struct Lnode *next;
};

//--------------------------------------------------
//------------建立一个不带头结点的循环单链表---------------
void Create_list(struct Lnode* l,int n)   
{
    int i;
    struct Lnode *q,*p,*head;
    for(i=1;i<=n;i++)
    {
        if(i==1)
        {
            head=p=(struct Lnode*)malloc(sizeof(struct Lnode));
        }
        else
        {
            q=(struct Lnode*)malloc(sizeof(struct Lnode));//生成新的结点
            p->next=q;
            p=q;              
        }
        scanf("%d",&(p->key));          //依次输入结点的密码,即,结点里的内容
        p->number=i;      
        p->next=head;   //使链表尾指向链表头, 构成循环链表
    }
    p=head;
}

//------------------------------------------------------------------

//--------------------删除第m的结点,输出其的位置,并把它的key作为新的m,一直到把整个单链表走完为止----------------
void Listdelete_L(struct Lnode* l,int n,int m)  
{
    int i,j;
    struct Lnode* q;
    struct Lnode* p;

    for (j=1;j<n;j++)  
    {
        for(i=1;i<m;i++)
            p=p->next;                 //指针右移
        m=p->key;                     //把key赋予m
        printf("%d->",p->number);    //输出所要求结点的位置号  (输出前n-1个)
        p->number=p->next->number;   //删除了刚才输出的那个结点
        p->key=p->next->key;         //把下一个密码传给结点
        q=p->next;
        p->next=p->next->next;        //把指针后移
        free(q);                      //释放
    }
    printf("%d\n",p->number);           //输出最后一个题目要求的结点,即最后一个
}
//-------------主函数-----------------------------
void main()
{
    struct Lnode* l;

    int n,m;
    printf("please enter the number of people n:");
    scanf("%d",&n);
    Create_list(l,n);              //调用函数,定义了一个有5个结点的单链表
    printf("please enter the number m:");
    scanf("%d",&m);        //    输入原始密码,即自己原先的key
    Listdelete_L(l,n,m);   //    删除第m的结点,输出其的位置,并把它的key作为新的m,一直到把整个单链表走完为止
}
//---------------------------------------------------------

为什么会出现下面的情况??

-------------Configuration: yuesefu - Win32 Debug--------------------
Compiling...
yuesefu.cpp
c:\documents and settings\administrator\桌面\yuesefu.cpp(68) : warning C4700: local variable 'l' used without having been initialized

yuesefu.obj - 0 error(s), 1 warning(s)



而且而且程序不能执行!
搜索更多相关主题的帖子: 约瑟夫 实验 int Lnode struct 
2008-04-07 15:48
zjl138
Rank: 1
等 级:新手上路
威 望:1
帖 子:788
专家分:0
注 册:2007-11-12
收藏
得分:0 
Create_list(l,n);              //调用函数,定义了一个有5个结点的单链表

Listdelete_L(l,n,m);   //    删除第m的结点,输出其的位置,并把它的key作为新的m,一直到把整个单链表走完为止
改为:
Create(&l,n)
Listdelete_L(&l,n,m);
试试!

i like linux...
2008-04-07 18:04
succubus
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:635
专家分:1080
注 册:2007-10-7
收藏
得分:0 
l没有初始化就使用了
ps:Create_list(l,n)和Listdelete_L(l,n,m)中的变量l好像没见你用啊。。。

[url=http:///view/aDU1]/image/aDU1.gif" border="0" />[/url]
2008-04-07 18:56
gmajvfhp
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2006-6-13
收藏
得分:0 
#include<stdio.h>
#include<stdlib.h>

//---------------------构造单链表存储结构---------
struct Lnode
{
    int number;
    int key;
    struct Lnode *next;
};

//--------------------------------------------------
//------------建立一个不带头结点的循环单链表---------------
void Create_list(struct Lnode* * l,int n)   
{
    int i;
    struct Lnode *q,*p,*head;
    for(i=1;i<=n;i++)
    {
        if(i==1)
        {
            head=p=(struct Lnode*)malloc(sizeof(struct Lnode));
        }
        else
        {
            q=(struct Lnode*)malloc(sizeof(struct Lnode));//生成新的结点
            p->next=q;
            p=q;              
        }
        scanf("%d",&(p->key));          //依次输入结点的密码,即,结点里的内容
        p->number=i;      
    }
   p->next=head;   //使链表尾指向链表头, 构成循环链表
   *l = head;
}

//------------------------------------------------------------------

//--------------------删除第m的结点,输出其的位置,并把它的key作为新的m,一直到把整个单链表走完为止----------------
void Listdelete_L(struct Lnode* l,int n,int m)  
{
    int i,j;
    struct Lnode* q;
    struct Lnode* p;
    p = l ;
    for (j=1;j<n;j++)  
    {
        for(i=1;i<m;i++)
            p=p->next;                 //指针右移
        m=p->key;                     //把key赋予m
        printf("%d->",p->number);    //输出所要求结点的位置号  (输出前n-1个)
        p->number=p->next->number;   //删除了刚才输出的那个结点
        p->key=p->next->key;         //把下一个密码传给结点
        q=p->next;
        p->next=p->next->next;        //把指针后移
        free(q);                      //释放
    }
    printf("%d\n",p->number);           //输出最后一个题目要求的结点,即最后一个
}
//-------------主函数-----------------------------
void main()
{
    struct Lnode* l;

    int n,m;
    printf("please enter the number of people n:");
    scanf("%d",&n);
    Create_list(&l,n);              //调用函数,定义了一个有5个结点的单链表
    printf("please enter the number m:");
    scanf("%d",&m);        //    输入原始密码,即自己原先的key
    Listdelete_L(l,n,m);   //    删除第m的结点,输出其的位置,并把它的key作为新的m,一直到把整个单链表走完为止
}
这样再试试
2008-04-07 20:42
zflsky
Rank: 1
等 级:新手上路
帖 子:53
专家分:0
注 册:2008-3-25
收藏
得分:0 
[bo]以下是引用 [un]succubus[/un] 在 2008-4-7 18:56 的发言:[/bo]

l没有初始化就使用了
ps:Create_list(l,n)和Listdelete_L(l,n,m)中的变量l好像没见你用啊。。。



那要怎么用呢? 我是初学者,这个东西不太懂啊
2008-04-08 16:18
gmajvfhp
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2006-6-13
收藏
得分:0 
[bo]以下是引用 [un]zflsky[/un] 在 2008-4-8 16:18 的发言:[/bo]




那要怎么用呢? 我是初学者,这个东西不太懂啊

就说Create_list(l,n)函数,你的本意可能是创建一个长n的链表,用l把指向链表的头的指针传递出来。但现在有两个问题,
1 :函数的参数,l要改成指向指针的指针,即struct Lnode **l .
2 : 函数最后一行改成  *l = head ;
2008-04-08 19:40
zflsky
Rank: 1
等 级:新手上路
帖 子:53
专家分:0
注 册:2008-3-25
收藏
得分:0 
哦,明白得差不多了!谢谢楼上了哈

[[it] 本帖最后由 zflsky 于 2008-4-9 19:25 编辑 [/it]]
2008-04-09 17:30
快速回复:约瑟夫实验,出问题了,大家看看
数据加载中...
 
   



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

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