1. 程式人生 > >C語言實現資料結構中的鏈棧

C語言實現資料結構中的鏈棧

實現方式一
# include <stdio.h>
# include <stdlib.h>
typedef char NodeData;
//鏈棧
typedef struct Node
{
 NodeData data;
 struct Node *next;
}StackNode;
typedef struct
{
 StackNode *top;
}
LinkStack;

/*置棧空*/
void initStack(LinkStack *ls)
{
 ls->top=NULL;
}
/*判棧空*/
int isStackEmpty(LinkStack *ls)
{
 return ls->top==NULL;
}
/*進棧*/
void pushStack(LinkStack *ls,NodeData nodedata)
{
 StackNode *p;
 p=(StackNode *)malloc(sizeof(StackNode));
 p->data=nodedata;
 p->next=ls->top;
 ls->top=p;
}
/*出棧*/
NodeData popStack(LinkStack *ls)
{
 StackNode *p=ls->top;
 NodeData popNode=ls->top->data;
 ls->top=ls->top->next;
 free(p);
 return popNode;
}

/*列印棧*/
void printStack(LinkStack *ls)
{
    int i=0;
 StackNode *node;
 node=ls->top;
 while(node->next!=NULL)
 {
  node=node->next;
  printf("LinkStack Node %d is %c/n",i,node->data);
  i++;
 }
}

void main()
{
 LinkStack *ls;
 char inData;
 ls=(LinkStack *)malloc(sizeof(LinkStack));
 initStack(ls);
 //入棧
    printf("Please input data/n");
    while(inData!='/n')
    {
   scanf("%c",&inData);
   pushStack(ls,inData);
   printf("push %c to stack/n",inData);
    }
 printf("print linkStack:/n");
 //列印棧元素
    printStack(ls);
 printf("pop stack/n");
 //出棧
 popStack(ls);
 printStack(ls);
 printf("pop stack/n");
 //出棧
 popStack(ls);
 printStack(ls);

實現方式二
只定義了棧節點
# include <stdio.h>
# include <stdlib.h>

typedef char NodeData; //節點資料
typedef struct Node
{
 NodeData data;//節點資料
 struct Node * next;  //指向下一個節點的指標
}StackNode;

/*置棧空*/
StackNode * initStack(StackNode *top)
{
 top=NULL;
 return top;
}
/*入棧 (這裡很容易出錯,需要返回頭接點的指標否則每次入參都是指向同一個接點的地址而不是頭指標的地址)*/
StackNode * pushStack(StackNode *top,NodeData nodedata)
{
 StackNode *p;
 p=(StackNode *)malloc(sizeof(StackNode));
 p->data=nodedata;
 p->next=top;
 top=p;
 return top;
}

/*列印棧*/
void printStack(StackNode *top)
{
    int i=0;
 StackNode *node;
 node=top;
 while(node->next!=NULL)
 {
  node=node->next;
  printf("LinkStack Node %d is %c/n",i,node->data);
  i++;
 }
}

void main()
{
 StackNode *top;
 NodeData inData;
 top=(StackNode *)malloc(sizeof(StackNode));
 top=initStack(top);
 printf("Please input data/n");
 while(inData!='/n')
 {
  scanf("%c",&inData);
  top=pushStack(top,inData);
  printf("push the %c to stack/n",inData);
 }
 printStack(top);
}

實現方式一 中LinkStack結構型別的定義是為了方便在函式體中修改top指標本身
通過修改指向LinkStack的top指標來控制入棧和出棧.

實現方式二 通過每次修改頭指標並返回給入參來控制入棧和出棧.

方式一是通過指標引數修改指標所指內容的典型用法.
方式二是通過函式返回值改變入參內容的典型用法。