标题:一个关于while(L)的错误问题。(需要运行调试!)
只看楼主
ssl002
Rank: 2
等 级:论坛游民
威 望:2
帖 子:75
专家分:43
注 册:2017-6-13
结帖率:100%
已结贴  问题点数:30 回复次数:10 
一个关于while(L)的错误问题。(需要运行调试!)
程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define OVERFLOW 0
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;
typedef struct LNode
{
    ElemType data;
    struct LNode *next;
}LNode;//定义结构体

void mune();
int ClearList_L(LNode *L);
Status InitList_L(LNode *L);
Status CreateList_L(LNode *L,int n);//声明函数

Status InitList_L(LNode *L)
{
    L=(LNode*)malloc(sizeof(LNode));
    if(!L) return OVERFLOW;
    L->next=NULL;
    return OK;
}//初始化
Status CreateList_L(LNode *L,int n)
{
    LNode *p;
    int i;
    if(!L) return ERROR;
    if(L->next) ClearList_L(L);
    for(i=n;i>0;--i)
    {
        p=(LNode*)malloc(sizeof(LNode));
        printf("第%d个结点的数据为:\n",i);
        scanf(" %d",&(p->data));
        p->next=L->next;
        L->next=p;
    }
}
//创建
//遍历
//读取第i个元素
//插入
//删除
//求长度
int ClearList_L(LNode *L)
{
    LNode *LNext;
    while(L==NULL)
    {
        printf("链表为空!");
        return 0;
    }
    while((L->next)!=NULL)
    {
        LNext=L->next;
        free(L);
        L=LNext;
        printf("已清空!");
    }
    return 0;
}//清空
//销毁
void mune()
{
    printf("请输入您选择的操作:\nr.创建\nt.遍历\ng.读取指定元素\ni.插入\nd.删除\nl.求长度\nc.清空\nx.退出程序\n");
}
//目录
int main()
{
    int n;
    char opp;
    LNode *L;
    if(!InitList_L(L)) printf("初始化失败!\n");
        else printf("初始化成功!\n");
    while(1)
    {
        mune();
        scanf(" %c",&opp);
        switch(opp)
        {
            case 'r':
                {
                    printf("请输入创建结点个数:\n");
                    scanf(" %d",&n);
                    CreateList_L(L,n);
                    break;
                }
            case 't':break;
            case 'g':break;
            case 'i':break;
            case 'd':break;
            case 'l':break;
            case 'c':ClearList_L(L);break;
            case 'x':break;
            default: printf("请重新输入!\n");
        }
    }
}

这是一个链表操作程序,运行没问题,第一次输入"r"

或者运行"c",一样的结果。
调试也调试不出来,我用VC++6.0和CFree都试过了,不行啊!
先谢谢各位!
感谢!
搜索更多相关主题的帖子: int next printf case break 
2017-10-08 19:11
ssl002
Rank: 2
等 级:论坛游民
威 望:2
帖 子:75
专家分:43
注 册:2017-6-13
得分:0 
回复 楼主 ssl002
没有大神看一下吗!?

[此贴子已经被作者于2017-10-8 19:21编辑过]

2017-10-08 19:16
forever74
Rank: 12Rank: 12Rank: 12
来 自:CC
等 级:贵宾
威 望:49
帖 子:1636
专家分:3940
注 册:2007-12-27
得分:5 
典型的使用野指针的错误。

[此贴子已经被作者于2017-10-8 19:43编辑过]


对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2017-10-08 19:34
yu965634383
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:119
专家分:195
注 册:2017-9-1
得分:3 
回复 2楼 ssl002
将L初始化
条件改一下看看 LNode *L = 0;
    if(InitList_L(L))

菜鸟一枚,求各位大神多多关照。
2017-10-08 19:42
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:22 
函数参数 LNode *L 改为 LNode **L 才可作为in_out参数。
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define OVERFLOW 0
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;
typedef struct LNode
{
    ElemType data;
    struct LNode *next;
} LNode; //定义结构体

void mune();
int ClearList_L(LNode **L);
Status CreateList_L(LNode **L,int n);//声明函数

Status CreateList_L(LNode **L,int n)
{
    LNode *p;
    int i;
    if(*L) ClearList_L(L);
    for(i=n; i>0; --i)
    {
        p=(LNode*)malloc(sizeof(LNode));
        if(!p) return OVERFLOW;
        printf("第%d个结点的数据为:\n",i);
        scanf(" %d",&(p->data));
        p->next=*L;
        (*L) = p;
    }
}
//创建

void List_L(LNode *L)
{
    for (; L; L=L->next)
        printf("%d\n", L->data);
}
//遍历
//读取第i个元素
//插入
//删除
//求长度
int ClearList_L(LNode **L)
{
    LNode *LNext;
    if (*L==NULL)
    {
        printf("链表为空!");
        return 0;
    }
    while(*L)
    {
        LNext=(*L)->next;
        free(*L);
        *L=LNext;
        printf("已清空!");
    }
    *L = NULL;
    return 0;
}//清空
//销毁
void mune()
{
    printf("请输入您选择的操作:\nr.创建\nt.遍历\ng.读取指定元素\ni.插入\nd.删除\nl.求长度\nc.清空\nx.退出程序\n");
}
//目录
int main()
{
    int n;
    char opp;
    LNode *L=NULL;
   
    while(1)
    {
        mune();
        scanf(" %c",&opp);
        switch(opp)
        {
            case 'r':
            {
                printf("请输入创建结点个数:\n");
                scanf(" %d",&n);
                CreateList_L(&L,n);
                break;
            }
            case 't':
                List_L(L);
                break;
            case 'g':
                break;
            case 'i':
                break;
            case 'd':
                break;
            case 'l':
                break;
            case 'c':
                ClearList_L(&L);
                break;
            case 'x':
                break;
            default:
                printf("请重新输入!\n");
        }
    }
}
2017-10-08 20:24
ssl002
Rank: 2
等 级:论坛游民
威 望:2
帖 子:75
专家分:43
注 册:2017-6-13
得分:0 
回复 3楼 forever74
我看一下啊
2017-10-08 20:31
ssl002
Rank: 2
等 级:论坛游民
威 望:2
帖 子:75
专家分:43
注 册:2017-6-13
得分:0 
回复 4楼 yu965634383
应该有野指针的问题,但你说的问题明白啊,为什么要等于0啊,if()?
2017-10-08 20:45
ssl002
Rank: 2
等 级:论坛游民
威 望:2
帖 子:75
专家分:43
注 册:2017-6-13
得分:0 
回复 5楼 吹水佬
感谢感谢!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2017-10-08 20:45
yu965634383
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:119
专家分:195
注 册:2017-9-1
得分:0 
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define OVERFLOW 0
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;
typedef struct LNode
{
    ElemType data;
    struct LNode *next;
}LNode;//定义结构体

void mune();
int ClearList_L(LNode *L);
LNode * InitList_L(LNode *L);
Status CreateList_L(LNode *L,int n);//声明函数

LNode * InitList_L(LNode *L)
{
    L=(LNode*)malloc(sizeof(LNode));
    if(!L)
        return OVERFLOW;
    L->next=NULL;
    return L;
}//初始化
Status CreateList_L(LNode *L,int n)
{
    LNode *p , *t;
    int i;
    if(!L)
        return ERROR;
    if(L->next)
        ClearList_L(L);
    t = L;
    L->next = 0;
    for(i=n;i>0;--i)
    {
        p=(LNode*)malloc(sizeof(LNode));
        printf("第%d个结点的数据为:\n",n+1-i );
        scanf(" %d",&p->data);
        p->next = 0;
        t->next=p;
        t = p;
    }
    return 1;
}
//创建
void Output (LNode *L)
{
    LNode *p;
    if (L)
        p = L->next;
    while (p)
    {
        printf ("%d\n" , p->data);
        p = p->next;
    }
}
//遍历
//读取第i个元素
//插入
//删除
//求长度
int ClearList_L(LNode *L)
{
    LNode *LNext , *t;
    while(L==NULL)
    {
        printf("链表为空!");
        return 0;
    }
    LNext = L->next;
    while(LNext)
    {   
        t = LNext->next;
 //       LNext=L->next;
        free(LNext);
 //       L=LNext;
        LNext = t;
        printf("已清空!");
    }
    L->next = 0;
    return 0;
}//清空
//销毁
void mune()
{
    printf("请输入您选择的操作:\nr.创建\nt.遍历\ng.读取指定元素\ni.插入\nd.删除\nl.求长度\nc.清空\nx.退出程序\n");
}
//目录
int main()
{
    int n;
    char opp;
    LNode *L = 0;
    L = InitList_L(L);
    if(L)
        printf("初始化成功!\n");
    else
        printf("初始化失败!\n");
    while(1)
    {
        mune();
        scanf(" %c",&opp);
        switch(opp)
        {
            case 'r':               
                    printf("请输入创建结点个数:\n");
                    scanf(" %d",&n);
                    CreateList_L(L,n);
               
                    break;
               
            case 't':
               
                Output (L);
                break;
            case 'g':break;
            case 'i':break;
            case 'd':break;
            case 'l':break;
            case 'c':ClearList_L(L);break;
            case 'x':
                break;
            default:
                printf("请重新输入!\n");
        }
        if (opp == 'x')
            break;
    }
}

[此贴子已经被作者于2017-10-8 21:24编辑过]


菜鸟一枚,求各位大神多多关照。
2017-10-08 20:55
yu965634383
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:119
专家分:195
注 册:2017-9-1
得分:0 
回复 7楼 ssl002
指针等于0 就是指向空啊,总之,指针用完之后,在后面的程序都不用到这个指针的话,最好就全都让它=0或者NULL,这样肯定没问题

菜鸟一枚,求各位大神多多关照。
2017-10-08 21:04



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




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

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