搜尋此網誌

2019年6月5日 星期三

程設的最後一個題目(四)


串列的尋訪:


    尋訪的英文名稱是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;

}


    學完這些東西後,我們就可以開始來做題目了,下一篇正式進入題目教學。

沒有留言:

張貼留言