LinkStack.h:
#ifndef _LINKSTACK_H_
#define _LINKSTACK_H_
#define SUCCESS 1000001
#define FAILURE 1000002
typedef int ElemType;
struct node
{
ElemType data;
struct node *next;
};
typedef struct node Node;
typedef Node *LinkNode;
struct stack
{
LinkNode top;
int count;
};
typedef struct stack Stack;
int StackInit(Stack **S);
int Push(Stack *S,ElemType e);
int StackLength(Stack *S);
int GetTop(Stack *S,ElemType *e);
int Pop(Stack *S,ElemType *e);
int StackClear(Stack *S);
int StackDestory(Stack **S);
#endif
LinkStack.c
#include <stdio.h>
#include "LinkStack.h"
#include <stdlib.h>
int StackInit(Stack **S)
{
(*S) = (Stack *)malloc(sizeof(Stack));
if(NULL == (*S))
{
return FAILURE;
}
(*S)->top = NULL;
(*S)->count = 0;
return SUCCESS;
}
int Push(Stack *S,ElemType e)
{
Node *p = (Node *)malloc(sizeof(Node));
if(NULL == p)
{
return FAILURE;
}
p->data = e;
p->next = S->top;
S->top = p;
S->count++;
return SUCCESS;
}
int StackLength(Stack *S)
{
return (S->count);
}
int GetTop(Stack *S,ElemType *e)
{
if(NULL == S->top)
{
return FAILURE;
}
*e = S->top->data;
return SUCCESS;
}
int Pop(Stack *S,ElemType *e)
{
if(NULL == S->top)
{
return FAILURE;
}
LinkNode p = S->top;
*e = p->data;
S->top = p->next;
free(p);
S->count--;
return SUCCESS;
}
int StackClear(Stack *S)
{
LinkNode p;
while(S->top)
{
p = S->top;
S->top = p->next;
free(p);
S->count--;
}
return SUCCESS;
}
int StackDestroy(Stack **S)
{
if(NULL == (*S))
{
return FAILURE;
}
free(*S);
(*S) = NULL;
return SUCCESS;
}
TestLinkStack.c
#include <stdio.h>
#include "LinkStack.h"
int main()
{
int ret,i;
Stack *s;
ElemType e;
ret = StackInit(&s);
if(FAILURE == ret)
{
printf("Init Failure!!\n");
}
else
{
printf("Init Success!!\n");
}
for(i = 0;i < 5; i++)
{
e = i + 1;
ret = Push(s,e);
if(FAILURE == ret)
{
printf("Push Failure!!\n");
}
else
{
printf("Push %d Success!!\n",e);
}
}
printf("Length is %d !\n",StackLength(s));
ret = GetTop(s,&e);
if(FAILURE == ret)
{
printf("GetTop Failure!!\n");
}
else
{
printf("Top is %d!\n",e);
}
for(i = 0;i < 2; i++)
{
ret = Pop(s,&e);
if(FAILURE == ret)
{
printf("Pop Faliure!!\n");
}
else
{
printf("Pop is %d Success!\n",e);
}
}
ret = GetTop(s,&e);
if(FAILURE == ret)
{
printf("GetTop Failure!!\n");
}
else
{
printf("Top is %d!\n",e);
}
ret = StackClear(s);
if(FAILURE == ret)
{
printf("CleanStack Failure!!\n");
}
else
{
printf("CleanStack Success!!\n");
}
ret = GetTop(s,&e);
if(FAILURE == ret)
{
printf("GetTop Failure!!\n");
}
else
{
printf("Top is %d!\n",e);
}
ret = StackDestroy(&s);
if(FAILURE == ret)
{
printf("Destory Failure!!\n");
}
else
{
printf("Destory Success!!\n");
}
printf("%p\n",s);
return 0;
}