栈链不能释放
//预定义常量和类型
//函数结果状态代码
#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()也是不能释放,这是为什么呢?
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 17:14 static/image/common/back.gif
void Push(Stack *S,ElemType e)
{
LinkStackPtr p;
问题我自己找到了,谢谢 p=(LinkStackPtr)malloc(sizeof(ElemType));
这里申请的空间不够ElemType,只是一个整形 楼主能把改好的代码发上来吗,我改了*base=(LinkStackPtr)malloc(sizeof(StackNode));还是不行 zZ_小春 发表于 2013-8-24 20:46 static/image/common/back.gif
楼主能把改好的代码发上来吗,我改了*base=(LinkStackPtr)malloc(sizeof(StackNode));还是不行
好啊,里面有的代码测试用的,没有删除 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:08 static/image/common/back.gif
我自己测试是可以了,你也试试看 分享一个经典代码,百度出来的#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 ;
} 付笑 发表于 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;
} zZ_小春 发表于 2013-8-24 20:46 static/image/common/back.gif
楼主能把改好的代码发上来吗,我改了*base=(LinkStackPtr)malloc(sizeof(StackNode));还是不行
你开始不行,可能是这个地方,base应该是p才可以 新手,学习中,呵呵 来学习一下 学习,继续升级中 坐等大神解决{:1_1:}
页:
[1]