// free all nodes in the link list void free_all_nodes(void) { node *rush, *prev; // if there is no existing element, jump out if (head == NULL) { printf("No existing element!\n"); exit(1); } // initialize rush as head rush = head; // free all elements while (rush != NULL) { prev = rush; rush = rush->next; free(prev); } }當我們allocate一個link list的時候,記憶體會騰出空間出來。當然C的程式的default會在程式結束之後把記憶體清空。但是如果你有程式是巨量資料,那麼這list要清空騰出記憶體是無可避免的。
因此要清空一個list的記憶體的方式就是從頭慢慢的一個一個開始清。他不像是一般array使用free就可以清除一整筆資料。由於目前的link list是單向的,所以清除順序勢必是要從head開始清除。
所以首先我們需要先判斷link list裡面究竟有沒有existing的node再來決定要不要清除。因為如果沒有的話便會清除到NULL指標。當然也許程式可能是容許的,但是如果可以養成程式能夠自我預警,那麼日後出現任何問題都能夠容易debug,也能夠有點像是封裝概念一般省去一堆debug的時間。
if (head == NULL) { printf("No existing element!\n"); exit(1); }這邊就是偵測目前是否有現存資料在內,如果沒有那麼就印出訊息跳出去。當然如果你整支程式還是要繼續執行的話就把exit(1)改成return即可。
接著initialize rush為head之後開始迴圈一個一個開始free掉每個node:
rush = head; // free all elements while (rush != NULL) { prev = rush; rush = rush->next; free(prev); }while迴圈就偵測目前是否有到尾了,如果還沒到尾就繼續free掉現有值。直到迴圈結束這支程式也做了該做的事情了。
沒有留言:
張貼留言