这才是正宗的栈,既实用又简单。
亮点:指向指针的指针。
亮点:内存错误的进一步分析与认识。
//linked list for stack
#include <stdio.h>
#include <stdlib.h>
#define ERROR -1
#define CORRECT 1
typedef int ELEMTYPE;
typedef int STATUS;//function type
typedef struct
{
ELEMTYPE data;
struct STACKNODE *next;
}STACKNODE,*STACKNODEP;
STATUS InitialiseStack(STACKNODEP stack);
STACKNODEP Push(STACKNODEP stack,ELEMTYPE elem);
STATUS Pop(STACKNODEP *stackP,ELEMTYPE *elem);
STATUS GetTop(STACKNODEP stack,ELEMTYPE *elem);
void main()
{
int i=5,temp=0;
STACKNODEP linkListStack=NULL;
InitialiseStack(linkListStack);
while(i)
linkListStack=Push(linkListStack,i--);
while(i<=2)
{
Pop(&linkListStack,&temp);
printf("test Pop:%d\n",temp);
i++;
}
GetTop(linkListStack,&temp);
printf("test GetTop:%d\n",temp);
while(i<=6)
linkListStack=Push(linkListStack,i++);
while(linkListStack)
{
Pop(&linkListStack,&temp);
printf("test Pop:%d\n",temp);
}
}
STATUS InitialiseStack(STACKNODEP stack)
{
stack=NULL;
return CORRECT;
}//InitialiseStack
STACKNODEP Push(STACKNODEP stack,ELEMTYPE elem)
{
STACKNODEP temp=NULL;
temp=(STACKNODEP)malloc(sizeof(STACKNODE));
if(!temp)
return NULL;
(*temp).next=stack;
(*temp).data=elem;
return temp;
}//Push
STATUS Pop(STACKNODEP *stackP,ELEMTYPE *elem)
//if actual parameter is stack//stackP'value is actual parameter's address
//Pop(&stack,&elem);
{
STACKNODEP nodeTemp=NULL;
if(!(*stackP))//*stackP like stack//use stackP can change stack's value
return ERROR;
nodeTemp=(**stackP).next;//(**stackP) like (*stack)//use stack can change first node's value
*elem=(**stackP).data;
free(*stackP);
*stackP=nodeTemp;
return CORRECT;
}//Pop
STATUS GetTop(STACKNODEP stack,ELEMTYPE *elem)
{
if(!stack)
return ERROR;
*elem=(*stack).data;
return CORRECT;
}//GetTop
正确的俺就不多说了,下面来看看当时的错误
ELEMTYPE *Pop(STACKNODEP *stackP)//returnvalue use data's address to aviod data interfere
//if actual parameter is stack//stackP'value is actual parameter's address//Pop(&stack);
{
ELEMTYPE *dataTemp=NULL;
STACKNODEP nodeTemp=(**stackP).next;
if(!(*stackP))//*stackP like stack//use stackP can change stack's value
return NULL;
dataTemp=&(**stackP).data;//(**stackP) like (*stack)//use stack can change first node's value
free(*stackP);
*stackP=nodeTemp;//(*stackP)->next
return dataTemp;
}
先看看错在哪里。
--------------------------------------------------------------
说明:
这里free(*stackP);出错。
首先看dataTemp=&(**stackP).data;//dataTemp记住了所需数据的地址
free(*stackP);//stack所指内存块被释放,所需数据的地址所指内存块也被释放,所需数据 丢失!!!
Tips:
说内存出错,首先注意在内存的分配与释放周围找找错在哪。
请您留下宝贵意见!!!
请您留下宝贵意见!!!
请您留下宝贵意见!!!