鱼C论坛

 找回密码
 立即注册
查看: 3740|回复: 14

栈链不能释放

[复制链接]
发表于 2013-8-24 16:54:04 | 显示全部楼层 |阅读模式
1鱼币
 
//预定义常量和类型
//函数结果状态代码
#include <stdio.h>
#include<stdlib.h>
#include <time.h>  
#include<windows.h>
#include<math.h>
//#include<unistd.h>
#define TRUE  1
#define FALSE 0
#define OK  1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef  int ElemType;
//Status是函数的类型,其值是函数结果状态代码
typedef int Status;
 
#include "header.h"
#define STACK_INIT_SIZE 10  //储空间的初始分配量
#define STACK_INCREMENT 2  //存储空间的分配增量
#define MAXSIZE 10
typedef  char SElemType;    //多型数据类型
typedef  int 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()也是不能释放,这是为什么呢?

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 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()放在上面就不报错,放在最后位置就会报错,不明白怎么回事了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-24 20:06:44 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-24 20:07:40 | 显示全部楼层
p=(LinkStackPtr)malloc(sizeof(ElemType));
这里申请的空间不够ElemType,只是一个整形
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-24 20:46:40 | 显示全部楼层
楼主能把改好的代码发上来吗,我改了*base=(LinkStackPtr)malloc(sizeof(StackNode));还是不行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-24 21:06:54 | 显示全部楼层
zZ_小春 发表于 2013-8-24 20:46
楼主能把改好的代码发上来吗,我改了*base=(LinkStackPtr)malloc(sizeof(StackNode));还是不行

好啊,里面有的代码测试用的,没有删除
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-24 21:08:47 | 显示全部楼层
zZ_小春 发表于 2013-8-24 20:46
楼主能把改好的代码发上来吗,我改了*base=(LinkStackPtr)malloc(sizeof(StackNode));还是不行
//预定义常量和类型

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

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

#define STACK_INIT_SIZE 10  //储空间的初始分配量
#define STACK_INCREMENT 2  //存储空间的分配增量
#define MAXSIZE 10
typedef  char SElemType;    //多型数据类型
typedef  int 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;
        


}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-24 21:09:54 | 显示全部楼层

我自己测试是可以了,你也试试看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 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 ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-25 02:07:07 | 显示全部楼层
付笑 发表于 2013-8-24 21:09
我自己测试是可以了,你也试试看

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

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

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

#define STACK_INIT_SIZE 10  //储空间的初始分配量
#define STACK_INCREMENT 2  //存储空间的分配增量
#define MAXSIZE 10
typedef  char SElemType;    //多型数据类型
typedef  int 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;
        
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-25 12:04:39 | 显示全部楼层
zZ_小春 发表于 2013-8-24 20:46
楼主能把改好的代码发上来吗,我改了*base=(LinkStackPtr)malloc(sizeof(StackNode));还是不行

你开始不行,可能是这个地方,base应该是p才可以
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-9-25 10:37:56 | 显示全部楼层
新手,学习中,呵呵
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-10-8 10:43:11 | 显示全部楼层
来学习一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-10-14 20:00:09 | 显示全部楼层
学习,继续升级中
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-11-2 13:03:54 | 显示全部楼层
坐等大神解决{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-10 06:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表