付笑 发表于 2013-8-24 16:54:04

栈链不能释放



//预定义常量和类型
//函数结果状态代码
#include <stdio.h>
#include<stdlib.h>
#include <time.h>
#include<windows.h>
#include<math.h>
//#include<unistd.h>
#define TRUE1
#define FALSE 0
#define OK1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedefint ElemType;
//Status是函数的类型,其值是函数结果状态代码
typedef int Status;

#include "header.h"
#define STACK_INIT_SIZE 10//储空间的初始分配量
#define STACK_INCREMENT 2//存储空间的分配增量
#define MAXSIZE 10
typedefchar SElemType;    //多型数据类型
typedefint ElemType;

typedef struct StackNode
{
   
ElemType data;   
struct StackNode *next;   

}StackNode,*LinkStackPtr;
typedef struct LinkStack
{
   
LinkStackPtr top;   
int count;   

}Stack;
//=================================栈链初始化
void InitStack(LinkStackPtr *base)
{
LinkStackPtr p=NULL;
*base=(LinkStackPtr)malloc(sizeof(ElemType));
(*base)->data=0;
(*base)->next=NULL;
}
//=======================================进栈操作
void Push(Stack *S,ElemType e)
{
LinkStackPtr p;
p=(LinkStackPtr)malloc(sizeof(ElemType));
p->data=e;
p->next=S->top;
   S->top=p;
S->count++;


}
//=======================================出栈操作
void Pop(LinkStackPtr top,LinkStackPtr base,Stack *S,ElemType *e)
{
if(top!=base)
{
   LinkStackPtr p;
   *e=top->data;
   p=S->top;
   S->top=top->next;
   S->count--;
free(top);=============================================问题代码

   

}
else
{
   printf("栈里已经没有元素可以打印了\n");
}
}
//========================================打印链栈
void print(LinkStackPtr base,LinkStackPtr top)
{
while(top!=base)
{
   printf("%d\n",top->data);
   top=top->next;
}
}
main()
{
LinkStackPtr base;
Stack S;
int i=1;
ElemType e=0;
InitStack(&base);
S.top=base;
S.count=0;
for(i=1;i<=MAXSIZE;i++)
{
Push(&S,i);
}
printf("栈里有%d个元素\n",S.count);
// free(S.top);                   ======================================问题代码
print(base,S.top);


for(i=1;i<=MAXSIZE;i++)
{
   Pop(S.top,base,&S,&e);
printf("Pop出来的元素为%d\n",e);
printf("栈里有%d个元素\n",S.count);
print(base,S.top);

}



return 0;


}


   问题代码处:
//=======================================出栈操作
void Pop(LinkStackPtr top,LinkStackPtr base,Stack *S,ElemType *e)
{
if(top!=base)
{
   LinkStackPtr p;
   *e=top->data;
   p=S->top;
   S->top=top->next;
   S->count--;
free(top);=============================================问题代码

   

}
else
{
   printf("栈里已经没有元素可以打印了\n");
}
}
//========================================

如果把出栈操作中的free(top)代码注释掉,可以显示弹出内容正确,但是加了就报错,为什么不能释放成功啊,

我在主函数里测试,加上free()也是不能释放,这是为什么呢?

付笑 发表于 2013-8-24 17:14:38

void Push(Stack *S,ElemType e)
{
LinkStackPtr p;
p=(LinkStackPtr)malloc(sizeof(ElemType));
free(p);   ============================ //这里可以释放,不报错
p->data=e;
p->next=S->top;
   S->top=p;
S->count++;
free(p);   =========================   //这里就不可以释放,报错
}


我在push函数里调试,free()放在上面就不报错,放在最后位置就会报错,不明白怎么回事了

付笑 发表于 2013-8-24 20:06:44

付笑 发表于 2013-8-24 17:14 static/image/common/back.gif
void Push(Stack *S,ElemType e)
{
LinkStackPtr p;


问题我自己找到了,谢谢

付笑 发表于 2013-8-24 20:07:40

p=(LinkStackPtr)malloc(sizeof(ElemType));
这里申请的空间不够ElemType,只是一个整形

zZ_小春 发表于 2013-8-24 20:46:40

楼主能把改好的代码发上来吗,我改了*base=(LinkStackPtr)malloc(sizeof(StackNode));还是不行

付笑 发表于 2013-8-24 21:06:54

zZ_小春 发表于 2013-8-24 20:46 static/image/common/back.gif
楼主能把改好的代码发上来吗,我改了*base=(LinkStackPtr)malloc(sizeof(StackNode));还是不行

好啊,里面有的代码测试用的,没有删除

付笑 发表于 2013-8-24 21:08:47

zZ_小春 发表于 2013-8-24 20:46 static/image/common/back.gif
楼主能把改好的代码发上来吗,我改了*base=(LinkStackPtr)malloc(sizeof(StackNode));还是不行

//预定义常量和类型

//函数结果状态代码
#include <stdio.h>
#include<stdlib.h>
#include <time.h>
#include<windows.h>
#include<math.h>
//#include<unistd.h>
#define TRUE1
#define FALSE 0
#define OK1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedefint ElemType;

//Status是函数的类型,其值是函数结果状态代码
typedef int Status;

#define STACK_INIT_SIZE 10//储空间的初始分配量
#define STACK_INCREMENT 2//存储空间的分配增量
#define MAXSIZE 10
typedefchar SElemType;    //多型数据类型
typedefint ElemType;



typedef struct StackNode
{
          
        ElemType data;   
        struct StackNode *next;   
       
}StackNode,*LinkStackPtr;

typedef struct LinkStack
{
          
        LinkStackPtr top;   
        int count;   
       
}Stack;
//=================================栈链初始化
void InitStack(LinkStackPtr *base)
{
       LinkStackPtr p=NULL;
       *base=(LinkStackPtr)malloc(sizeof(ElemType));
       (*base)->data=0;
       (*base)->next=NULL;

}
//=======================================进栈操作

void Push(Stack *S,ElemType e)
{
       LinkStackPtr p,q;

       p=(LinkStackPtr)malloc(sizeof(StackNode));
       //free(p);                                 //这里要吧释放
       q=p;
       p->data=e;
          
       p->next=S->top;
        // free(q);
       S->top=p;
       S->count++;
                                        //这里就不可以释放

       


       




}

//=======================================出栈操作
void Pop(LinkStackPtr top,LinkStackPtr base,Stack *S,ElemType *e)
{
       if(top!=base)
       {
               
               LinkStackPtr p;
               *e=top->data;
               p=S->top;
               S->top=top->next;
               S->count--;
               free(top);
               


       }
       else
       {
               printf("栈里已经没有元素可以打印了\n");
       }
}

//========================================打印链栈
void print(LinkStackPtr base,LinkStackPtr top)
{
       while(top!=base)
       {
               printf("%d\n",top->data);
               top=top->next;
       }
}

main()
{
        LinkStackPtr base, p;
        Stack S;
        int i=1;
        ElemType e=0;
        InitStack(&base);
        S.top=base;
        S.count=0;
        for(i=1;i<=MAXSIZE;i++)
        {
                Push(&S,i);

        }
        printf("栈里有%d个元素\n",S.count);
        //free(p);

        print(base,S.top);


       
        for(i=1;i<=MAXSIZE;i++)
        {
                        Pop(S.top,base,&S,&e);
                printf("Pop出来的元素为%d\n",e);
                printf("栈里有%d个元素\n",S.count);

        print(base,S.top);
               

        }

       


       

        return 0;
       


}


付笑 发表于 2013-8-24 21:09:54

付笑 发表于 2013-8-24 21:08 static/image/common/back.gif


我自己测试是可以了,你也试试看

付笑 发表于 2013-8-24 21:17:36

分享一个经典代码,百度出来的#include <stdio.h>
#include <stdlib.h>

typedef char SElemType ;

typedef struct StackNode
{
        SElemType data;
        struct StackNode *next;
}StackNode,*LinkStackPtr;

typedef struct LinkStack
{
        LinkStackPtr top;
        int count;
}LinkStack;

//栈指针初始化
void InitialStack(LinkStack *L)
{
        L->top=NULL;
        L->count=0;
        return;
}
//栈状态
int StackEmpty(LinkStack *pS)
{
        if(!pS->count)//若为空,则返回1
                return 1;
        else
                return 0;//若非空,则返回0;
}
//压栈操作
int Push(LinkStack *pS,SElemType e)
{
        //一般情况下,不存在栈满情况
        LinkStackPtr s=(LinkStackPtr)malloc(sizeof(StackNode));
        s->data = e;
        s->next = pS->top;

        pS->top=s;
        pS->count++;
        //free(s);
        return 0;
}

//出栈操作
int Pop(LinkStack *pS,SElemType *e)
{
        LinkStackPtr p;
        if(StackEmpty(pS))
                {
                        printf("栈为空!");
                  return 0;
          }

        *e=pS->top->data;

        p = pS->top;
        pS->top = p->next;
        free(p);
        pS->count--;
        return 0;
}
//打印栈链
void PrintStackLink(LinkStack *pS)
{
        LinkStackPtr L;
        int i;
        //i = pS->count;
        L = pS->top;
        if(pS->count == 0)
        {
                printf("栈为空!");
                return;

        }
        for(i=0;i<(pS->count);i++)
        {
                printf("%c\n",L->data);
          L = L->next;
        }
        return ;
}
void main()
{
        //测试
        char getch;
        char outch;
        LinkStack myStack;
        InitialStack(&myStack);
        //压栈
        printf("请输入压入栈的数据(char型),输入#结束");
        scanf("%c",&getch);
        while(getch!='#')
        {
                Push(&myStack,getch);
                scanf("%c",&getch);
        }
        printf("栈链内容为:\n");
        PrintStackLink(&myStack);

        //出栈
        while(!StackEmpty(&myStack))
        {
                Pop(&myStack,&outch);
                printf("弹出内容为:%c\n",outch);
        }
        PrintStackLink(&myStack);
        while(1);
        return ;
}

zZ_小春 发表于 2013-8-25 02:07:07

付笑 发表于 2013-8-24 21:09 static/image/common/back.gif
我自己测试是可以了,你也试试看

:lol:我也修改了一下,把不需要用的变量和参数删除了,下午在我的电脑不行,现在在同学的电脑就可以了。。。//预定义常量和类型

//函数结果状态代码
#include <stdio.h>
#include<stdlib.h>
#include <time.h>
#include<windows.h>
#include<math.h>
//#include<unistd.h>
#define TRUE1
#define FALSE 0
#define OK1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedefint ElemType;

//Status是函数的类型,其值是函数结果状态代码
typedef int Status;

#define STACK_INIT_SIZE 10//储空间的初始分配量
#define STACK_INCREMENT 2//存储空间的分配增量
#define MAXSIZE 10
typedefchar SElemType;    //多型数据类型
typedefint ElemType;



typedef struct StackNode
{
         
      ElemType data;   
      struct StackNode *next;   
      
}StackNode,*LinkStackPtr;

typedef struct LinkStack
{
         
      LinkStackPtr top;   
      int count;   
      
}Stack;
//=================================栈链初始化
void InitStack(LinkStackPtr *base)
{
         //LinkStackPtr p=NULL;   //这个定义了没用到
         *base=(LinkStackPtr)malloc(sizeof(ElemType));
         (*base)->data=0;
         (*base)->next=NULL;

}
//=======================================进栈操作

void Push(Stack *S,ElemType e)
{
         LinkStackPtr p;//进栈也只需用一个变量作为中间节点

         p=(LinkStackPtr)malloc(sizeof(StackNode));
         //free(p);                                 //这里要吧释放//进桟了肯定不用释放的了,出栈才需要释放
         
         p->data=e;
         
         p->next=S->top;
      // free(q);
         S->top=p;
         S->count++;
                                          //这里就不可以释放

         


         




}

//=======================================出栈操作
void Pop(LinkStackPtr base,Stack *S,ElemType *e)//这里修改了一下下,传入了S所以无需加多了top了,直接S->top就是了
{
         if(S->top!=base)
         {
               
               LinkStackPtr p;//这个指针指向出栈元素
               *e=S->top->data;
               p=S->top;
               S->top=S->top->next;
               S->count--;
               free(p);
               


         }
         else
         {
               printf("栈里已经没有元素可以打印了\n");
         }
}

//========================================打印链栈
void print(LinkStackPtr base,LinkStackPtr top)
{
         while(top!=base)
         {
               printf("%d\n",top->data);
               top=top->next;
         }
}

main()
{
      LinkStackPtr base, p;
      Stack S;
      int i=1;
      ElemType e=0;
      InitStack(&base);
      S.top=base;
      S.count=0;
      for(i=1;i<=MAXSIZE;i++)
      {
                Push(&S,i);

      }
      printf("栈里有%d个元素\n",S.count);
      //free(p);

      print(base,S.top);


      
      for(i=1;i<=MAXSIZE;i++)
      {
                        Pop(base,&S,&e);
                printf("Pop出来的元素为%d\n",e);
                printf("栈里有%d个元素\n",S.count);

      print(base,S.top);
               

      }   

      return 0;
      
}

付笑 发表于 2013-8-25 12:04:39

zZ_小春 发表于 2013-8-24 20:46 static/image/common/back.gif
楼主能把改好的代码发上来吗,我改了*base=(LinkStackPtr)malloc(sizeof(StackNode));还是不行

你开始不行,可能是这个地方,base应该是p才可以

玉宁417 发表于 2013-9-25 10:37:56

新手,学习中,呵呵

magicyuc 发表于 2013-10-8 10:43:11

来学习一下

peng3726 发表于 2013-10-14 20:00:09

学习,继续升级中

xuaner0719 发表于 2013-11-2 13:03:54

坐等大神解决{:1_1:}
页: [1]
查看完整版本: 栈链不能释放