栈的链表表示

这才是正宗的栈,既实用又简单。

亮点:指向指针的指针。

亮点:内存错误的进一步分析与认识。

//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:

说内存出错,首先注意在内存的分配与释放周围找找错在哪。


请您留下宝贵意见!!!

请您留下宝贵意见!!!

请您留下宝贵意见!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值