首页 新闻 会员 周边 捐助

C中关于NULL使用问题

0
悬赏园豆:10 [已解决问题] 解决于 2012-10-08 19:15

在练习链栈的时候,发现空栈的条件总是为假.出栈到最后一个字母时报错!

Seqstack.h

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

int InitStack(SeqStk *std)
{
    std->top=0;
    return 1;
}

int EmptyStack(SeqStk *stk)
{
    return stk->top==0;
}

int Push(SeqStk *stk,DataType x)
{
    if(stk->top==maxsize) 
    {
        printf("栈已满!");
        return 0;
    }

    stk->data[(stk->top)++]=x;
    return 1;
}
int Pop(SeqStk *stk)
{
    if(EmptyStack(stk))
    {
        printf("栈下溢!");
        return 0;
    }

    stk->top--;
    return 1;
}

DataType GetTop(SeqStk *stk)
{
    if(EmptyStack(stk))
    {
        printf("空栈无法获取顶端元素!");
        exit(1);
    }

    return stk->data[stk->top];
}



void InitStackLK(LkStk *ls)
{
    ls=(LkStk *)malloc(sizeof(LkStk));
    ls->next=NULL;
    ls->data=0;
}

int EmptyStackLK(LkStk *ls)
{
    if(NULL==ls->next) return 1;
    else return 0;
}

void PushLK(LkStk * ls,DataType data)
{
    LkStk *temp;
    temp=(LkStk*)malloc(sizeof(LkStk));
    temp->data=data;
    temp->next=ls->next;
    ls->next=temp;
}

int PopLK(LkStk *ls)
{
    LkStk * temp;
    if(EmptyStackLK(ls))
    {
        return 0;
    }
    temp=ls->next;
    ls->next=temp->next;
    free(temp);
    return 1;

}

DataType GetTopLK(LkStk * ls)
{
    if(EmptyStackLK(ls))
    {
        exit(1);
    }

    return ls->next->data;
}

Seqstack.h

#include<stdio.h>

/*顺序栈定义*/
#define maxsize 6

typedef int DataType;

typedef struct seqstack
{
    DataType data[maxsize];
    int top;
} SeqStk;

int InitStack(SeqStk *std);//初始化栈
int EmptyStack(SeqStk *stk);//判断栈是否为空
int Push(SeqStk *stk,DataType x);//进栈
int Pop(SeqStk *stk);//出栈


typedef struct node
{
    DataType data;
    struct node * next;
} LkStk;

void InitStackLK(LkStk *ls);
int EmptyStackLK(LkStk *ls);
void PushLK(LkStk * ls,DataType data);
int PopLK(LkStk *ls);
DataType GetTopLK(LkStk * ls);

Test2.c

#include<stdio.h>
#include"Seqstack.h"

int main(void)
{
    

    LkStk  lstk;
    char ch;

    InitStackLK(&lstk);

    for(ch='A';ch<='A'+26;ch++)
    {
        PushLK(&lstk,ch);
        printf("%c\r\n",ch);
    }
    printf("\r\n\r\n");

    while(!EmptyStackLK(&lstk))
    {
        ch=GetTopLK(&lstk);
        PopLK(&lstk);
        printf("%c",ch);
    }
    getchar();
    return 0;
}
IceS的主页 IceS | 初学一级 | 园豆:197
提问于:2012-10-04 21:04
< >
分享
最佳答案
0

很简单,你应该清理了你的代码再上传的。

 

并且,你应该学一些调试方法。

注意你这个调用:

InitStackLK(&lstk);

然后看你的方法:

void InitStackLK(LkStk *ls)
{
    ls=(LkStk *)malloc(sizeof(LkStk));
    ls->next=NULL;
    ls->data=0;
}

你的这段代码给ls赋值了,问题是ls所在的地址区域是调用时临时分配的,而你用这句代码给他赋值——新值:

ls=(LkStk *)malloc(sizeof(LkStk));

因此你丢失了原来的值,也丢失了新分配的东西,造成了内存泄露。

解决方法是注释掉这一句。这是由你的定义方法所保证的。在main函数中

LkStk  lstk;

你是这样声明的。

这个给他分配了内存空间,只是没有初始化而已。

或者,一个较为复杂的方法,是这样修改,将这个修改为指针:

LkStk*  lstk;

但那样就大动干戈,整个程序都要修改了。不过初始化程序可以这样改:

void InitStackLK(LkStk **ls)
{
    *ls=(LkStk *)malloc(sizeof(LkStk));
    (*ls)->next=NULL;
    (*ls)->data=0;
}

 

拿分来。

收获园豆:10
荣耀属于跪拜猫 | 小虾三级 |园豆:832 | 2012-10-07 10:51
其他回答(1)
0

不要一味的贴代码,明确的表述你的问题最为重要。

zsounder | 园豆:2819 (老鸟四级) | 2012-10-05 14:50
int EmptyStackLK(LkStk *ls)
{
    if(NULL==ls->next) return 1;//这里不能够正确判断,当出栈到最后一个节点时还是返回1.
    else return 0;
}
支持(1) 反对(1) IceS | 园豆:197 (初学一级) | 2012-10-06 19:12
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册