写了栈的压入和弹出的程序,弹出里的free错了,说是内存释放的问题,请问为什么错了?
晓彤123 2015-12-24 12:14:41 typedef struct Node//节点类型
{
int data;
struct Node *pNext;
}NODE, *PNODE;
typedef struct Stack//栈
{
PNODE pTop;
PNODE pBottom;
}STACK,*PSTACK;
//声明
void init(PSTACK);//必须取地址为形参,残能改变其中的量
void push(PSTACK, int);
void traverse(PSTACK);
bool pop(PSTACK, int *);
bool empty(PSTACK);
int main(void)
{
STACK S;//STACK等价于struct STACK
int val;
init(&S);//初始化栈
push(&S, 1);
push(&S, 2);
push(&S, 3);
traverse(&S);
if (pop(&S, &val))//val是弹出的数字,要跨函数使用此内存就要传地址。
{
printf("出战成功%d\n", val);
}
else
{
printf("出战失败\n");
}
traverse(&S);
return 0;
}
void init(PSTACK pS)
{
pS->pTop = (PNODE)malloc(sizeof(PNODE));
if (NULL == pS->pTop)
{
printf("动态内存分配失败!\n");
exit(-1);
}
else
{
pS->pBottom = pS->pTop;
pS->pTop->pNext = NULL;
}
}
void push(PSTACK pS,int val)
{
PNODE pNew = (PNODE)malloc(sizeof(PNODE));//创建新节点
pNew->data = val;//幅值数据区
pNew->pNext =pS-> pTop;//指向顶端节点
pS->pTop = pNew;//修改顶端指针
}
void traverse(PSTACK pS)
{
PNODE p = pS->pTop;
while (p != pS->pBottom)
{
printf("%d ", p->data);
p = p->pNext;
}
printf("\n");
return;
}
bool empty(PSTACK pS)
{
if (pS->pTop == pS->pBottom)
return true;
else
return false;
}
bool pop(PSTACK pS, int *pVal)//好、跨函数使用内存,传地址
{
if( empty(pS))
{
return false;
}
else
{
PNODE r = pS->pTop;//要释放内存,就要先把这个记下来
*pVal = r->data;
pS->pTop = r->pNext;//下移ptop
free(r);
r = NULL;//这里错了,怎么改?
return true;
}
}