棧的鍊錶實現(C語言)

2021-07-12 01:21:24 字數 2732 閱讀 9480

原始碼檔案位址 :

由前面:所述

鍊錶實現的棧在操作過程中頻繁的pop和push會伴隨著頻繁的malloc和free,伴隨著很大的系統開銷。

基於此,在此實現中,通過實現乙個空閒節點鍊錶,將pop之後的鍊錶節點不釋放,而是放入空閒鍊錶freenodeptr中

當棧進行push操作的時候,先從空閒節點鍊錶中中取出空閒節點加入棧煉表中,若是空閒鍊錶中,沒有節點,則呼叫malloc,申請記憶體節點。

棧是否空棧只要判斷指向棧頂指標是否為空即可。

實現的操作有pop、push、reset、isempty、create、dispose等基本函式,實現了鍊錶節點 stacknode,以及棧的結構體listintstack等,具體如下

結構體

鍊錶元素節點結構體

struct stackintnode //元素節點

;

typedef struct stackintnode *stacknodeptr;

typedef struct stackintnode stacknode;

//棧結構體
struct listintstack//棧結構體

;

typedef struct listintstack *liststack;

函式

建立棧函式

該函式的主要功能為棧建立乙個結構體物件,初始化後返回結構體物件指標。

liststack createliststack(int num) //建立鍊錶棧

s->topptr = null;

s->freenodeptr = null;

s->lenght = 0;

return s;

}

釋放棧函式

該函式的主要功能是1:鍊錶節點釋放,鍊錶節點在棧鍊錶中和free兩個鍊錶中  2:釋放棧的結構體物件

void disposeliststack(liststack *ls)

tmpptr = (*ls)->freenodeptr;//釋放free鍊錶

while(tmpptr != null)

free(*ls);

(*ls) = null;

printf("dispose count_num is %d\n",count_num);

}

是否為空棧

int

isliststackempty(liststack

ls)

棧push操作函式

棧的push操作,先判斷空閒鍊錶上時候有空閒節點,若有,則從空閒鍊錶中取下節點,或則呼叫malloc申請

int liststackpush(liststack ls,int *element)//成功返回1,否則為-1,element 指向的為入棧的資料的指標

tmp->num = *element;

if(isliststackempty(ls))

else

}else

tmp->num = *element;

if(ls->topptr == null)

ls->topptr->next = tmp;

tmp->pre = ls->topptr;

tmp->next = null;

ls->topptr = ls->topptr->next;

}++ls->lenght;

return 1;

}

棧pop函式以及reset函式

該函式將棧鍊錶總的棧頂元素取下來,放入到空閒鍊錶中。

int liststackpop(liststack ls)//操作成功返回1.失敗返回-1

tmpptr = ls->topptr;

ls->topptr = ls->topptr->pre;

if(ls->topptr != null)

tmpptr->pre = null;

if(ls->freenodeptr == null)

else

--ls->lenght;

return 1;

}

//迭代呼叫pop,直到棧為空

int liststackreset(liststack ls)

}return 1;

}

取棧頂元素top函式讀棧鍊錶的棧頂元素

int liststacktop(liststack ls,int *element)//將棧頂的值,放入到element指標指向的變數中

*element = ls->topptr->num;

return 1;

}

C語言鍊錶實現棧

鍊錶實現帶頭結點的棧,入棧用頭插法 環境codeblocks include include include typedef int elemtype typedef struct node node,linkstack 初始化棧 linkstack initstack linkstack s 入棧...

使用鍊錶實現棧(C語言)

下邊的實現,預設在鏈棧中設定乙個頭結點,用於指向棧的第乙個元素 typedef char datatype typedef struct nodelstacknode,linkstack void initstack linkstack top 將頭結點的指標域置為空 top next null 判...

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...