码迷,mamicode.com
首页 > 其他好文 > 详细

看数据结构写代码(9)链栈的实现

时间:2015-03-02 14:57:13      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:   数据结构   链栈   链栈的实现   

在写链栈的时候 和 顺序栈一样 犯了两个错误: 一个是 在 入栈 和 进栈顶时候 忘记 操作 linkstack.len 了,另一个是 在写 stackClear 的时候 犯了一个 低级的内存错误。

这两个问题 都是 粗心造成的。

希望 引以为戒

在做下一个例子:数值转换时,又发现了一个问题:在 stackPop 没有返回 pop元素的值。唉 技术分享

欢迎指出代码不足

下面上代码:

// LinkStack.cpp : 定义控制台应用程序的入口点。
//


#include "stdafx.h"
#include <stdlib.h>
typedef int elelmentType;


enum E_State
{
	E_State_Error = 0,
	E_State_Ok = 1,
};
//链表节点node
struct lStackNode
{
	elelmentType data;
	lStackNode * next;
};

//链栈
struct linkStack
{
	lStackNode * bottom;
	lStackNode * top;
	int len;
};


lStackNode * makeNode(elelmentType data){
	lStackNode * pNode = (lStackNode *)malloc(sizeof(lStackNode));
	if (pNode != NULL)
	{
		pNode->data = data;
		pNode->next = NULL;
	}
	return pNode;
}

E_State stackInit(linkStack * lStack){
	//分配头节点
	lStackNode * pNode = (lStackNode *) malloc(sizeof(lStackNode));
	if (pNode == NULL)
	{
		return E_State_Error;
	}
	pNode->next = NULL;
	//栈顶和栈底指向同一个节点时为空.
	lStack->bottom = lStack->top = pNode;
	lStack->len = 0;
	return E_State_Ok;
}

void stackClear(linkStack * stack){
	lStackNode * next = stack->bottom->next;
	while (next != NULL)
	{
		lStackNode * freeNode = next;
		/*又粗心了。。。
		free(freeNode);
		next = next->next;*/
		next = next->next;
		free(freeNode);
	}
	stack->top = stack->bottom;
	stack->len = 0;
}

void stackDestory(linkStack * stack){
	stackClear(stack);
	free(stack->top);
	stack->top = stack->bottom = NULL;
}

E_State stackGetTop(linkStack stack,elelmentType * topData){
	//链表的栈顶 指向 栈顶元素
	if (stack.top != stack.bottom)
	{
		*topData = stack.top->data;
		return E_State_Ok;
	}
	else
	{
		return E_State_Error;
	}
}

int stackLen(linkStack stack){
	return stack.len;
}

bool stackEmpty(linkStack stack){
	return stack.top == stack.bottom ? true : false;
}

E_State stackPush(linkStack * stack,elelmentType data){
	lStackNode * node = makeNode(data);
	if (node != NULL)
	{
		stack->top->next = node;
		stack->top = node;
		stack->len++;
	}
	else{
		return E_State_Error;
	}
}

E_State stackPop(linkStack * stack,elelmentType * data){
	if (stack->top != stack->bottom)
	{
		//首先指向第一个元素.
		lStackNode * next = stack->bottom;
		//找到栈顶元素的前驱
		while (next->next != stack->top)
		{
			next = next->next;
		}
		free(stack->top);
		next->next = NULL;
		stack->top = next;
		//忘记加了
		stack->len--;
		return E_State_Ok;
	}
	else{
		return E_State_Error;
	}
}
//从栈底到 栈顶的 遍历
void stackTraverse(linkStack stack){
	//首先指向第一个元素
	lStackNode * next = stack.bottom->next;
	printf("------------遍历开始----------\n");
	while (next != NULL)
	{
		printf("-----------%d----------\n",next->data);
		next = next->next;
	}
	printf("------------遍历结束----------\n");
}




int _tmain(int argc, _TCHAR* argv[])
{
	linkStack stack;
	stackInit(&stack);
	for (int i = 1; i < 13; i++)
	{
		stackPush(&stack,i);
	}
	elelmentType top;
	stackPop(&stack,&top);
	stackPop(&stack,&top);
	stackTraverse(stack);
	stackGetTop(stack,&top);
	char * s = stackEmpty(stack) ? "true" : "false";
	printf("栈长 :%d,栈顶元素为 :%d,栈是否为空:%s",stackLen(stack),top,s);
	stackDestory(&stack);
	return 0;
}

技术分享

看数据结构写代码(9)链栈的实现

标签:   数据结构   链栈   链栈的实现   

原文地址:http://blog.csdn.net/fuming0210sc/article/details/44017343

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!