1. 程式人生 > >棧-鏈式儲存結構-c語言

棧-鏈式儲存結構-c語言

/*
    棧 鏈式儲存結構實現
    第一個結構體是每一個節點元素, 類似於連結串列 
    第二個結構體是用個指標top指向連結串列的尾部 
*/
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0

typedef int SElemType;
typedef int Status;

typedef struct StackNode{
    SElemType data; 
    struct StackNode *next; 
} StackNode, *LinkStackPtr;

typedef
struct LinkStack{ LinkStackPtr top; int count; } LinkStack; //初始化棧 Status initStack(LinkStack *S){ LinkStackPtr p; p = (LinkStackPtr)malloc(sizeof(StackNode)); p->next = NULL; S->top = p; S->count = 0; return OK; } //判斷棧是否為空 Status StackEmpty(LinkStack S){ if
(S.count == 0){ return OK; //為null }else{ return ERROR; } } //入棧 插入元素e Status push(LinkStack *S, SElemType e){ LinkStackPtr s = (LinkStackPtr) malloc (sizeof(StackNode)); //生成一個節點 s->data = e; s->next = S->top; //把當前的棧頂元素值賦給新節點的直接後繼 S->top = s; //將新的節點s賦值給棧頂指標
S->count++; return OK; } //出棧,刪除棧頂元素 用e返回出棧的值 Status pop(LinkStack *S, SElemType *e){ //判斷棧是否為空 if(StackEmpty(*S)){ return ERROR; } *e = S->top->data; //儲存要出棧的元素 LinkStackPtr p; p = S->top; //將棧頂結點賦值給p S->top = S->top->next; //棧頂指向下一個結點 free(p); //釋放結點p S->count--; return OK; } //遍歷棧 void stackTraverse(LinkStack S) { if(S.count == 0){ printf("棧為空\n"); }else{ LinkStackPtr p; p = S.top; while(p->next){ printf("%d ",p->data); p = p->next; } printf("\n"); } } int main(void){ LinkStack S; SElemType e; initStack(&S); printf("\n 1.初始化棧 \n 2.遍歷棧 \n 3.入棧 \n 4.出棧 \n 0.退出\n"); int option = 1, value; while(option){ scanf("%d",&option); switch(option){ case 1: initStack(&S); break; case 2: stackTraverse(S); break; case 3: printf("請輸入要入棧的資料\n"); scanf("%d",&e); push(&S, e); stackTraverse(S); break; case 4: value = pop(&S, &e); if(value == 0){ printf("沒有可用的元素可以出棧\n"); }else{ printf("出棧的元素是:%d\n",e); } break; case 0: return OK; } } return OK; }