双指针不带头结点的链栈的实现(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; }
相关文章推荐
- 双指针不带头结点的链栈的实现(C语言)
- 用c语言实现链栈 (带头结点)
- 链栈的实现(双指针 带头结点) C语言版
- 带头结点的链队列实现(C语言)
- C语言实现使用带头结点的单链表来构造栈结构
- C语言实现双向非循环链表(不带头结点)的清空
- 带头结点的链队列实现(C语言)
- c语言实现--带头结点单链表操作
- 不带头结点的单链表的实现(C语言)
- 链栈的实现(单指针 无头结点) C语言版
- 链表中每个结点的data域存放一个二进制位。并在此链表上实现对二进制数加1的运算。 用C语言编写 用以存放输入的二进制数 建立 一个带头结点的线性链表
- c语言实现--不带头结点的单链表操作
- C语言实现单链表(带头结点)的基本操作
- C语言实现单链表-不带头结点
- 数据结构模版----单链表SimpleLinkList[带头结点&&面向对象设计思想](C语言实现)
- C语言实现单链表(不带头结点)
- C语言实现单链表节点的删除(带头结点)
- 数据结构模版----单链表SimpleLinkList[不带头结点&&伪OO](C语言实现)
- C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表)
- C语言实现单链表的逆序打印(带头结点)