4-棧-鏈式儲存
阿新 • • 發佈:2022-01-25
筆記
棧-鏈式儲存
使用連結串列的方式儲存棧的指標資料,將棧頂設定在連結串列頭部
入棧就相當於頭插、出棧相當於頭刪
size記錄棧的大小,資料預留出4位元組用來儲存指標
程式碼
myStack.c
#include"myStack.h" #include<stdlib.h> //使用連結串列的方式儲存棧的指標資料,將棧頂設定在連結串列頭部 //入棧就相當於頭插、出棧相當於頭刪 //初始化管理棧的結構體 myStackType* init_stack(){ myStackType* st = malloc(sizeof(myStackType)); if(NULL == st){ return NULL; } st->head.next = NULL; //清零 st->m_size = 0; return st; } //入棧 void push_stack(myStackType* st, void* data){ if(NULL == st || NULL == data){ return; } struct linkNode* myNode = data; //將資料指標轉換成節點型別,使用data預留的4位元組 myNode->next = st->head.next; //頭插 st->head.next = myNode; st->m_size++; } //出棧 void pop_stack(myStackType* st){ if(NULL == st){ return; } if(st->m_size == 0){ return; } struct linkNode* delNode = st->head.next; //頭刪 st->head.next = delNode->next; st->m_size--; } //獲取棧頂資料 void* top_stack(myStackType* st){ if(NULL==st || st->m_size==0){ return NULL; } return st->head.next; //即連結串列的第一個元素 } int size_stack(myStackType* st){ if(NULL == st){ return 0; } return st->m_size; } //銷燬棧結構體 void destroy_stack(myStackType** st){ free(*st); *st = NULL; }
myStack.h
#ifndef __MYSTACK_H #define __MYSTACK_H struct linkNode{ void* next; }; typedef struct { struct linkNode head; int m_size; }myStackType; myStackType* init_stack(void); void push_stack(myStackType* st, void* data); void pop_stack(myStackType* st); void* top_stack(myStackType* st); int size_stack(myStackType* st); void destroy_stack(myStackType** st); #endif
start0.c
#include"myStack.h" #include<stdio.h> struct Persion{ void* next; char m_name[64]; int m_age; }; int main(){ myStackType* st = init_stack(); struct Persion p1 = {NULL,"aaa",10}; struct Persion p2 = {NULL,"bbb",20}; struct Persion p3 = {NULL,"ccc",30}; struct Persion p4 = {NULL,"ddd",40}; push_stack(st,&p1); push_stack(st,&p2); push_stack(st,&p3); push_stack(st,&p4); printf("size=%d\n",size_stack(st)); while(size_stack(st) > 0){ struct Persion *p0 = top_stack(st); pop_stack(st); printf("name=%s\tname=%d\n",p0->m_name, p0->m_age); } printf("size=%d\n",size_stack(st)); destroy_stack(&st); return 0; }