您的位置:首页 > 编程语言 > C语言/C++

双指针不带头结点的链栈的实现(C语言)

2012-09-27 14:28 399 查看
/*
双指针 不带头结点的链栈
VS2010 调试
*/
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

#define TRUE 1
#define FALSE 0
#define ERROR -1
#define OK 1

struct Node
{
int data;
struct Node *next;
};

struct LStack
{
struct Node *top;
struct Node *base;
};

//栈初始化
void init_stack(struct LStack *linkStack)
{

linkStack->base = NULL;
linkStack->top = NULL;
}

//判断栈是否为空
int is_stack_empty(struct LStack *linkStack)
{

return ((linkStack->base == NULL) ? TRUE : FALSE);
}

//进栈,数num进栈
int push_stack(struct LStack *linkStack, int num)
{
struct Node *tmp_node = (struct Node *)malloc(sizeof(struct Node));
if(tmp_node == NULL)
{
return ERROR;
}
tmp_node->data = num;
tmp_node->next = NULL;

if(is_stack_empty(linkStack))
{
linkStack->base = tmp_node;
linkStack->top = tmp_node;
}
else
{
tmp_node->next = linkStack->top;
linkStack->top = tmp_node;
}

return OK;
}

//出栈,出栈元素保存在num中
int pop_stack(struct LStack *linkStack, int *num)
{
struct Node *tmp_node = NULL;

if(is_stack_empty(linkStack))
{
return ERROR;
}

*num = linkStack->top->data;
tmp_node = linkStack->top;
linkStack->top = linkStack->top->next;

if(linkStack->top == NULL)
{
linkStack->base = NULL;
}
free(tmp_node);

return OK;
}

//或取栈顶元素,放入num中
int get_head_elem(struct LStack linkStack, int *num)
{
if(is_stack_empty(&linkStack))
{
return ERROR;
}

*num = linkStack.top->data;

return OK;
}

//销毁栈
int destory_stack(struct LStack *linkStack)
{
struct Node *tmp_node = NULL;

if(is_stack_empty(linkStack))
{
return OK;
}

while(linkStack->top != NULL)
{
tmp_node = linkStack->top;
linkStack->top = linkStack->top->next;
free(tmp_node);
}

linkStack->base = NULL;

return OK;
}

//获取栈的长度,将长度返回
int get_stack_length(struct LStack linkStack)
{
int length = 0;

if(is_stack_empty(&linkStack))
{
return 0;
}

while (linkStack.top != NULL)
{
linkStack.top = linkStack.top->next;
length++;
}
return length;
}

//打印栈内的数据元素
void print_stack(struct LStack linkStack)
{
printf("TOP\n");
while(linkStack.top != NULL)
{
printf("%d\n", linkStack.top->data);
linkStack.top = linkStack.top->next;
}
printf("BOTTOM\n\n");
}

int main(int argc, char *argv[])
{
int num = 0;
struct LStack linkStack;
init_stack(&linkStack);

push_stack(&linkStack, 7);
push_stack(&linkStack, 8);
push_stack(&linkStack, 9);
push_stack(&linkStack, 6);
push_stack(&linkStack, 5);
print_stack(linkStack);

pop_stack(&linkStack, &num);
print_stack(linkStack);

get_head_elem(linkStack, &num);
printf("%d,%d\n", get_stack_length(linkStack), num);

destory_stack(&linkStack);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: