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

来源:互联网 发布:软件开发项目管理流程 编辑:程序博客网 时间:2024/05/15 12:52
/*双指针 不带头结点的链栈VS2010 调试*/#include <stdio.h>#include <stdlib.h>#include <malloc.h>#define TRUE 1#define FALSE 0#define ERROR -1#define OK 1struct 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;}


0 0