原始碼檔案位址 :
由前面:所述
鍊錶實現的棧在操作過程中頻繁的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);
}
是否為空棧
intisliststackempty(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...