栈的链式存储C语言描述
LinkStack.h文件
#ifndef LINKSTACK_H
#define LINKSTACK_H
typedef unsigned char LSElemType;
typedef struct StackNode
{
LSElemType data;
struct StackNode* next;
}LinkStack, StackNode;
void LinkStack_Init(LinkStack* Top);
void LinkStack_Push(LinkStack* Top, LSElemType e);
void LinkStack_Traverse(LinkStack Top);
LSElemType LinkStack_GetTop(LinkStack Top);
LSElemType LinkStack_Pop(LinkStack* Top);
void LinkStack_Clear(LinkStack* Top);
void LinkStack_Test(void);
#endif
LinkStack.c文件
#include "LinkStack.h"
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
void LinkStack_Init(LinkStack* Top)
{
Top->data = 0;
Top->next = NULL;
}
void LinkStack_Push(LinkStack* Top, LSElemType e)
{
StackNode* NewNode = malloc(sizeof(StackNode));
if (NewNode != NULL)
{
NewNode->data = e;
NewNode->next = NULL;
NewNode->next = Top->next;
Top->next = NewNode;
}
else
printf("申请内存失败!");
}
void LinkStack_Traverse(LinkStack Top)
{
assert(Top.next != NULL);
StackNode* p = Top.next;
while (p != NULL)
{
printf("%c ", p->data);
p = p->next;
}
printf("\n");
}
LSElemType LinkStack_GetTop(LinkStack Top)
{
assert(Top.next != NULL);
return Top.next->data;
}
LSElemType LinkStack_Pop(LinkStack* Top)
{
assert(Top->next != NULL);
LSElemType e = Top->next->data;
StackNode* temp = Top->next;
Top->next = temp->next;
free(temp);
return e;
}
void LinkStack_Clear(LinkStack* Top)
{
assert(Top->next != NULL);
StackNode* temp;
while (Top->next != NULL)
{
temp = Top->next;
Top->next = temp->next;
free(temp);
}
}
void LinkStack_Test(void)
{
LinkStack S;
LinkStack_Init(&S);
LinkStack_Push(&S, 'A');
LinkStack_Push(&S, 'B');
LinkStack_Push(&S, 'C');
LinkStack_Push(&S, 'D');
LinkStack_Traverse(S);
printf("%c\n", LinkStack_GetTop(S));
LinkStack_Pop(&S);
LinkStack_Traverse(S);
LinkStack_Push(&S, 'E');
LinkStack_Traverse(S);
}
测试:main.c文件
#include <stdio.h>
#include "LinkStack.h"
int main()
{
LinkStack_Test();
return 0;
}
测试结果: