linkstack.h檔案
#ifndef linkstack_h
#define linkstack_h
#include
#include
#include
//定義鏈式棧節點結構
typedef
struct linknode
linknode;
typedef
struct linkstack
linkstack;
//初始化棧
linkstack* init_linkstack();
//銷毀棧
void free_linkstack(linkstack* stack);
/*判斷棧是否為空stackempty(s)
返回值:
返回0,說明棧為空
返回-1,出錯
返回1,說明棧不為空
*/int isempty_linkstack(linkstack *stack);
//入棧
void push_linkstack(linkstack* stack, void* data);
//出棧
void pop_linkstack(linkstack* stack);
//返回棧頂節點
linknode* top_linkstack(linkstack* stack);
#endif
linkstack.c檔案
#include "linkstack.h"
//初始化棧
linkstack* init_linkstack()
//銷毀棧
void free_linkstack(linkstack* stack)
//如果已經沒有元素了則釋放棧
if(stack->length == 0)
//node記錄棧頂節點
linknode *node = stack->head.next;
//指向下乙個節點
linknode *nextnode = node->next;
//先釋放棧中的節點
while(nextnode != null)
//最後釋放棧
free(stack);
stack = null;
}//判斷棧是否為空stackempty(s)
int isempty_linkstack(linkstack *stack)
//不為空返回1,棧為空返回0
if(stack->length == 0)
return1;}
//入棧
void push_linkstack(linkstack* stack, void* data)
//直接插入新節點,因為對於鏈式棧來說不存在棧滿的情況
//除非計算機本身記憶體不夠用
//複製資料
linknode *node = (linknode *)malloc(sizeof(linknode));
node->data = data;
//節點入棧,同時棧大小+1
node->next = stack->head.next;
stack->head.next = node;
stack->length++;
}//出棧
void pop_linkstack(linkstack* stack)
//棧為空就直接返回
if(stack->head.next == null)
//記錄要出棧的節點
linknode *temp = stack->head.next;
//然後讓head節點指向下乙個節點
stack->head.next = temp->next;
free(temp);
temp = null;
//棧大小-1
stack->length--;
}//返回棧頂節點
linknode* top_linkstack(linkstack* stack)
return
stack->head.next;
}
main.c檔案
#define _crt_secure_no_warnings
#include "linkstack.h"
typedef
struct student
student;
void print_node(linknode *node)
//型別轉換
student *s = (student *)node->data;
printf("number = %d , name = %s\n" , s->number, s->name);
}int main(void)
; student s2 = ;
student s3 = ;
student s4 = ;
student s5 = ;
//資料入棧
printf("-----------push_linkstack-------------\n\n");
push_linkstack(stack , (void *)&s1);
push_linkstack(stack , (void *)&s2);
push_linkstack(stack , (void *)&s3);
push_linkstack(stack , (void *)&s4);
push_linkstack(stack , (void *)&s5);
printf("-----------print_node-------------\n");
while((stack->length) > 0)
free_linkstack(stack);
printf("-----------free_linkstack-------------\n");
return
0;}
測試結果:
23 棧的鏈式儲存結構和基本運算實現
棧的鏈式儲存結構也稱為鏈棧,棧的鏈式儲存結構本質上還是以線性表的鏈式儲存來實現的,一般來說,鍊錶有頭指標,棧也有棧頂指標,那麼可以把棧頂放在鍊錶的頭部,用頭指標來表示棧頂指標,但是這裡我們不用頭結點儲存棧頂節點,而是讓頭結點的next指標指向棧頂節點。圖1 棧的鏈式儲存結構 棧的鏈式儲存結構定義如下...
棧的基本運算
棧和佇列是兩種特殊的線性表,它們的邏輯結構和線性表相同,只是其運算規則較線性表有更多的限制,故又稱它們為運算受限的線性表。棧和佇列被廣泛應用於各種程式設計中。棧的定義及基本運算 1 棧的定義 棧 stack 是限制僅在表的一端進行插入和刪除運算的線性表。1 通常稱插入 刪除的這一端為棧頂 top 另...
順序棧和鏈式棧的基本操作
棧作為一種 資料結構,是一種只能在一端進行插入和刪除操作的特殊 線性表。它按照 先進後出的原則儲存資料,先進入的資料被壓入棧底,最後的資料在棧頂,需要讀資料的時候從棧頂開始彈出資料 最後乙個資料被第乙個讀出來 棧具有記憶作用,對棧的插入與刪除操作中,不需要改變棧底 指標。棧是允許在同一端進行插入和刪...