學習資料結構與演算法時實現的棧,參考書目《資料結構與演算法分析 c語言描述》,以及在後面會分析我遇到的乙個問題。
標頭檔案:stack.h
/*************************************
*功能:基於鍊錶的棧,棧頂在表頭
***************************************/
#ifndef _stack_header_h_
#define _stack_header_h_
typedef struct node* pnode;
typedef pnode stack;
typedef int elementtype;
struct node
;stack initstack(void); // 初始化乙個棧
void deletestack(stack s);// 刪除乙個棧
void emptystack(stack s); // 清空乙個棧
int isempty(stack s); // 判斷是否是空棧,是返回true,否返回false
void push(elementtype e, stack s);// 將元素e壓入棧頂
elementtype pop(stack s); //彈出棧頂的元素
#endif // _stack_header_h_
原始檔:stack.c
#include #include #include #include #include "stack.h"
stack initstack(void)
void emptystack(stack s)
}void deletestack(stack s)
free(s);
}int isempty(stack s)
void push(elementtype e, stack s)
elementtype pop(stack s)
printf("this stack is empty!!!\n");
return 0;// 該返回值用來避免提示
}
主程式驗證:main.c
#include #include #include "stack.h"
int main()
// 彈出棧頂元素
int a = pop(mystack);
printf("棧頂元素為:%d \n", a);
下面分享並分析一下我寫的過程中遇到的乙個低階的錯誤。錯誤的根源在於初始化棧的函式,先看看這個函式:
void initstack(stack s)
用這個初始化函式初始化乙個棧後,在執行push函式等會操作這個棧的地方都會收到這個錯誤「program received signal sigse**, segmentation fault.」,這個錯誤的原因一般是指標沒初始化,後面在操作這個指標的時候就會出現錯誤。例如在主函式中:
int main()
mystack是乙個指向節點的指標,且沒初始化,即是乙個野指標,通過initstack(mystack)後,mystack還是乙個野指標,因為我們直接將這個指標當作實參傳給了initstack函式,這樣在呼叫後是不會改變該實參的,即沒有初始化,其實這個道理只要學過c語言就知道的,但我為什麼還是會犯這個低階錯誤呢,根本原因還是我理解的太膚淺了,我以為mystack是乙個指標,傳入指標是可以改變實參的值的,但其實不是這樣的,如果本來實參就是乙個指標的話,我們想改變該指標的值的話,就得傳入指標的指標,好吧,到裡就是這麼簡單,檢查這個錯誤花了2個小時啊。一定要細緻+努力啊。。。 鍊錶 基於C語言
最近複習了c語言的一些知識,使用c語言實現了資料結構中的鍊錶。下面是main.c檔案 include linklist.h include intmain printf len d n n linklistlength list for i 0 i 5 i printf len d n n link...
C語言 棧 鍊錶
普通鍊錶的建立 用鍊錶構建一串數字,並輸入另乙個數插入其中。以及鍊錶的逆序。include include struct node 鍊錶的結構體建立 int main t head k head next scanf d s for i 0 i i else struct node x,y x he...
C語言 複雜的棧(鍊錶棧)
複雜的棧 鍊錶棧 include include define datatype int 定義鍊錶棧資料型別 定義鍊錶棧結構 struct stacklink typedef struct stacklink stacklink 判斷棧是否為空 int isempty stacklink phead...