1. #define MAX_SIZE 255
    2. #define true 1
    3. #define false 0
    4. typedef struct {
    5. int id;
    6. char * name;
    7. }ElementType;
    1. #include <stdio.h>
    2. #include<stdlib.h>
    3. #include "Element.h"
    4. //链栈的结点
    5. typedef struct StackNode{
    6. ElementType data;//结点中保存的元素
    7. struct StackNode *next;//指向下个结点的指针
    8. }StackNode;
    9. //链栈结构
    10. typedef struct LinkedStack{
    11. StackNode *top;//栈顶指针
    12. int length;//链栈的长度(元素个数)
    13. }LinkedStack;
    14. //链栈的初始化
    15. void InitLinkedStack(LinkedStack *linkedStack);
    16. //链栈的压栈,并返回结果
    17. int PushLinkedStack(LinkedStack * linkedStack,ElementType element);
    18. //链栈的出栈
    19. int PopLinkedStack(LinkedStack * linkedStack,ElementType * element);
    20. //清空栈
    21. void ClearLinkedStack(LinkedStack * linkedStack);
    22. //销毁栈
    23. void DestroyLinkedStack(LinkedStack * linkedStack);
    1. #include "LinkedStack.h"
    2. //链栈的初始化
    3. void InitLinkedStack(LinkedStack *linkedStack){
    4. linkedStack->top=NULL;
    5. linkedStack->length=0;
    6. }
    7. //链栈的压栈,并返回结果
    8. //链栈压栈不存在满栈的情况,没有规定栈长。
    9. int PushLinkedStack(LinkedStack * linkedStack,ElementType element){
    10. //创建一个新结点
    11. StackNode *newNode=(StackNode *)malloc(sizeof(StackNode));
    12. newNode->data=element;
    13. //新结点的next指向当前的栈顶
    14. newNode->next=linkedStack->top;
    15. linkedStack->top=newNode;
    16. linkedStack->length++;
    17. return true;
    18. }
    19. //链栈的出栈
    20. //定义一个临时指针结点,来记录原栈顶结点
    21. int PopLinkedStack(LinkedStack * linkedStack,ElementType * element){
    22. if(linkedStack->top==NULL){
    23. printf("空栈,出栈操作失败");
    24. return false;
    25. }
    26. //返回栈顶元素
    27. *element=linkedStack->top->data;
    28. //记录出栈操作前的栈顶指针
    29. StackNode * node=linkedStack->top;
    30. //栈顶指针下移一位
    31. linkedStack->top=linkedStack->top->next;
    32. //释放原栈顶空间
    33. free(node);
    34. linkedStack->length--;
    35. return true;
    36. }
    37. //清空栈,遍历栈中的每一个元素并释放结点空间
    38. void ClearLinkedStack(LinkedStack * linkedStack){
    39. StackNode *tempNode;//临时变量
    40. while(linkedStack->top){
    41. tempNode=linkedStack->top;//栈顶指向下一个元素
    42. linkedStack->top=linkedStack->top->next;
    43. free(tempNode);
    44. linkedStack->length--;
    45. }
    46. }
    47. //销毁栈
    48. //先清空栈,再销毁栈
    49. void DestroyLinkedStack(LinkedStack * linkedStack){
    50. ClearLinkedStack(linkedStack);
    51. free(linkedStack);
    52. linkedStack=NULL;
    53. }
    1. #include <iostream>
    2. using namespace std;
    3. #include "LinkedStack.h"
    4. ElementType datas[]={
    5. {1,"哈哈哈"},
    6. {2,"哇哇哇"},
    7. {3,"呵呵呵"},
    8. {4,"啦啦啦"}
    9. };
    10. void TestSeqStack();
    11. int main(){
    12. TestSeqStack();
    13. }
    14. void TestSeqStack(){
    15. LinkedStack * stack=(LinkedStack *)malloc(sizeof(LinkedStack));
    16. ElementType *element=(ElementType *)malloc(sizeof(ElementType));
    17. InitLinkedStack(stack);
    18. for(int i=0;i<4;i++){
    19. printf("当前入栈:%d\t%s\n",datas[i].id,datas[i].name);
    20. PushLinkedStack(stack,datas[i]);
    21. }
    22. PopLinkedStack(stack,element);
    23. printf("当前出栈的元素:%d\t%s\n",element->id,element->name);
    24. PopLinkedStack(stack,element);
    25. }