串列的尋訪:
尋訪的英文名稱是traversal,是個在計算機科學裡很常見的一個詞,很常在有關"樹"的資料結構裡出現,就是把結構裡的所有資料都看過一篇。
由於串列只有單一方向,所以尋訪就超簡單,從頭一個一個看到尾就好了。
|
接續上一篇 |
習慣上,我們還會再設一個指標,來尋訪用的,first 、 pre 、cur 就不要動到它們(其實也是可以拿cur來用啦)
|
next裡的值就是下個struct的位置 |
程式碼:
|
接續上一篇的"新增資料" |
|
結果 |
釋放記憶體:
動態分配的記憶體空間在程式結束後並不會被釋放,需要我們自己寫程式去釋放。
C裡面提供了一個函式叫
free,他能釋放指標所指的記憶體空間。
|
free可以釋放動態分配的記憶體空間 |
注意,free只能釋放指向動態創造的記憶體空間的指標,不能是靜態的記憶體空間。
|
錯誤用法 |
|
程式炸掉 |
釋放我們的串列記憶體:
想釋放所有串列的記憶體的話,就要一個一個去釋放。不過在這裡,如果我們只用一個指標來做的話是行不通的,因為會有下面的問題。
|
釋放記憶體 |
|
結果 |
因為釋放了記憶體,所以被釋放的struct裡的next值也不見了,我們會找不到下一個struct在哪。
正確做法:
|
釋放tmp所指的記憶體位置 |
一直做下去,直到trave指到NULL,這樣所有動態配置的空間就都會被釋放了。
|
所有記憶體都被釋放了 |
|
程式碼 |
完整Code:
#include <stdio.h>
#include <stdlib.h>
struct list{
int data; //這裡是裝資料用的
struct list *next;//這個是"指向下一個struct的指標
};//當然啦,裡面可以有更多資料,不過指標是一定要有的
int main(){
struct list *cur, *first=NULL, *pre; //我們前面提到的那些指標
int n[4]={8, 9, 5, 4}; //資料
int i; //for要用的
for(i=0;i<4;i++){ //加入四筆
if(first==NULL){ //判斷是不是第一筆資料
cur=(struct list *)malloc(sizeof(struct list));//開新位置
first=cur; //讓first指向第一筆資料的位置
cur->data=n[i]; cur->next=NULL; //cur記錄輸入資料,並且指向NULL
pre=cur; //pre指向cur
}
else{
cur=(struct list *)malloc(sizeof(struct list));//開新位置
pre->next=cur; //把相鄰兩個資料接起來
cur->data=n[i]; cur->next=NULL; //cur記錄輸入資料,並且指向NULL
pre=cur;//pre指向cur
}
}
struct list *trave, *tmp; //尋訪用指標,暫存用指標
trave=first; //得到第一個struct的位置
while(trave!=NULL){//判斷要不要再做下去
printf("%d\n", trave->data); //輸出此struct的 data
tmp=trave;//暫存
trave=trave->next; //把trave指向下一個struct
free(tmp);//釋放記憶體位置
}
return 0;
}
學完這些東西後,我們就可以開始來做題目了,下一篇正式進入題目教學。
沒有留言:
張貼留言