| 编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛
全能ASP/PHP/ASP.NET主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付买域名,送MP3、MP4
高端软件开发 = 年薪十万不是梦赛孚耐:软件保护加密专家身份认证令牌USB KEY买空间,免费送域名(厦门中资源)
共有 588 人关注过本帖
标题:约瑟夫实验,出问题了,大家看看
收藏  订阅  推荐  打印 
zflsky
Rank: 2
等级:注册会员
帖子:53
积分:662
注册:2008-3-25
约瑟夫实验,出问题了,大家看看

哪位大侠帮我看看啊,老师说不能用全局的,没办法,但是我有不知道错在哪里!不知道,为什么会出现这样的情况,而且程序不能执行!

#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-4-7 15:48
zjl138
Rank: 4
等级:高级会员
威望:1
帖子:773
积分:9162
注册:2007-11-12

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-4-7 18:04
succubus
Rank: 3Rank: 3
等级:中级会员
威望:2
帖子:328
积分:3442
注册:2007-10-7

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

void myRecentObject(void){while(!getOffer()){deliverResume();writtenTest();interview();}return;}
2008-4-7 18:56
gmajvfhp
Rank: 1
等级:新手上路
帖子:3
积分:136
注册:2006-6-13

#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-4-7 20:42
zflsky
Rank: 2
等级:注册会员
帖子:53
积分:662
注册:2008-3-25

以下是引用 succubus 在 2008-4-7 18:56 的发言:

l没有初始化就使用了
ps:Create_list(l,n)和Listdelete_L(l,n,m)中的变量l好像没见你用啊。。。
那要怎么用呢? 我是初学者,这个东西不太懂啊
2008-4-8 16:18
gmajvfhp
Rank: 1
等级:新手上路
帖子:3
积分:136
注册:2006-6-13

以下是引用 zflsky 在 2008-4-8 16:18 的发言:




那要怎么用呢? 我是初学者,这个东西不太懂啊
就说Create_list(l,n)函数,你的本意可能是创建一个长n的链表,用l把指向链表的头的指针传递出来。但现在有两个问题,
1 :函数的参数,l要改成指向指针的指针,即struct Lnode **l .
2 : 函数最后一行改成  *l = head ;
2008-4-8 19:40
zflsky
Rank: 2
等级:注册会员
帖子:53
积分:662
注册:2008-3-25

哦,明白得差不多了!谢谢楼上了哈

[ 本帖最后由 zflsky 于 2008-4-9 19:25 编辑 ]
2008-4-9 17:30
关于我们 | 广告合作 | 编程中国 | 清除Cookies | Archiver | WAP | TOP

编程中国 版权所有,并保留所有权利。鲁ICP备08000592号
Powered by Discuz, Processed in 0.086923 second(s), 9 queries.
Copyright©2004-2008, BCCN.NET, All Rights Reserved