数据结构 链式 栈 c实现

来源:互联网 发布:linux ant配置 编辑:程序博客网 时间:2024/04/29 20:31
转:http://blog.chinaunix.net/uid-20698826-id-3129410.html
#include <stdio.h>#include <stdlib.h>#define OK 1#define FALSE 0#define TRUE 1#define ERROR 0typedef int Status;typedef int SElemType;//结点类型typedef struct Node{    SElemType data;    struct Node *next;}StackNode, *PStackNode;//链表类型typedef struct LinkStack{    StackNode * base; //栈底指针    StackNode * top; //栈顶指针} LinkStack, *PLinkStack;Status InitLinkStack(LinkStack *s);Status EmptyLinkStack(LinkStack *s);void ClearLinkStack(LinkStack *s);void DestroyStack(LinkStack *s);int StackLength(LinkStack *s);Status GetTop(LinkStack *s, SElemType *e);Status Push(LinkStack *s, SElemType e);Status Pop(LinkStack *s, SElemType *e);void TrasverLinkStack(LinkStack *s);Status InitLinkStack(LinkStack *s){    s->base = (PStackNode)malloc(sizeof(StackNode));    if (NULL == s->base)    {        printf("内存分配失败,程序退出\n");        exit(-1);    }    s->top = s->base;    s->base->next = NULL;    return OK;}Status EmptyLinkStack(LinkStack *s){    if (s->base == s->top)        return TRUE;    else        return ERROR;}void ClearLinkStack(LinkStack *s){    if (s->top == s->base)    {        exit(-1);    }    StackNode *p = s->top, *q;    while(p != s->base)    {        q = p->next;        free(p);        p = q;    }    s->top = s->base;}void DestroyStack(LinkStack *s){    StackNode *p = s->top, *q;    while (p != s->base)    {        q = p->next;        free(p);        q = p;    }    s->top = s->base;    free(s->base);    s->base = NULL;    s->top = NULL;}int StackLength(LinkStack *s){    int i = 0;    StackNode *p = s->top;    while (p != s->base)    {        i++;        p = p->next;    }    return i;}Status GetTop(LinkStack *s, SElemType *e){    if (EmptyLinkStack(s))    {        printf("栈为空\n");        exit(-1);    }    *e = s->top->data;    return OK;}Status Push(LinkStack *s, SElemType e){    PStackNode r = (PStackNode)malloc(sizeof(StackNode)); //建立新结点    if (NULL == r)    {        printf("新结点建立失败,程序退出\n");        exit(-1);    }    r->data = e;    r->next = s->top;    s->top = r;    return OK;}Status Pop(LinkStack *s, SElemType *e){        if (s->top == s->base)    {        printf("空栈\n");        exit(-1);    }    StackNode *q = s->top;    *e = q->data;    s->top = q->next;    free(q);    q = NULL;        return OK;}void TrasverLinkStack(LinkStack *s){    if (EmptyLinkStack(s))    {        printf("空栈\n");        exit(-1);    }    StackNode *p = s->top;    while (p != s->base)    {        printf("%d ", p->data);        p = p->next;    }    printf("\n");}int main(void){    LinkStack s;    SElemType e;        //初始化栈    if (InitLinkStack(&s))    {        printf("--->栈初始化成功\n");    }    else    {        printf("栈初始化失败\n");    }    printf("--->栈中元素个数: %d\n", StackLength(&s));    //入栈    Push(&s, 1);    Push(&s, 2);    Push(&s, 3);    Push(&s, 4);    Push(&s, 5);    Push(&s, 6);    printf("--->栈中元素个数: %d\n", StackLength(&s));    TrasverLinkStack(&s);    //清空栈    printf("--->清空栈\n");    ClearLinkStack(&s);    printf("--->栈中元素个数: %d\n", StackLength(&s));        Push(&s, 2);    Push(&s, 4);    Push(&s, 5);    Push(&s, 6);    Push(&s, 8);    Push(&s, 9);        //获取栈顶元素    TrasverLinkStack(&s);    GetTop(&s, &e);    printf("--->栈顶元素: %d\n", e);        //出栈    printf("--->栈中元素个数: %d\n", StackLength(&s));    while (!EmptyLinkStack(&s))    {        Pop(&s, &e);        printf("出栈%d\n", e);    }    printf("--->栈中元素个数: %d\n", StackLength(&s));    TrasverLinkStack(&s);        DestroyStack(&s);        return 0;}

原创粉丝点击