淺談鏈表

鏈表是一種十分常見又重要的數據結構,就像幼兒園裏老師讓小朋友們手牽着手排成一排一樣,我們也可以將n個創建好的對象“牽”起來。第一個對象當然是老師,在最前面,最好一個無人可“牽”;我們可以用結構體類型實現簡單的鏈表(當然也可以用類來實現)。在大學的課程裏都設有這門課程,在譚浩強先生的《C程序設計》裏也有講到。故在此不知天高地厚的說一下吧。

鏈表分 2 種;

    1首先是靜態鏈表:

顧名思義,所謂靜態鏈表,就是不能動態生成。

struct Student{
   int num;     //包括學號和分數連個變量。
   int score;
   struct Student *next;  // 定義結構體指針,用來指向下一個節點,把節點“牽”起來
}; //首先定義一個結構體類型。
下面來生成一個帶有3個節點的靜態鏈表,並分別把各個節點的參數(num 和 score)打印出來。


第22中的 *p 是操作指針,它的作用是方便操作鏈表。

第23分別定義了3個節點。下面的代碼是把他們初始化。需要注意的是26中的c.next賦值爲空,如果不賦值的話,會出現段內存錯誤。

第28開始是對鏈表進行簡單的操作,即打印。

操作指針p先是賦值爲head,然後打印出head牽的節點的值(不是本身的參數,本身也並沒有參數)

然後 p = p->next;把操作節點向第2個節點移動,然後打印出(第二個節節點的參數)。

最後  p = NULL時,當然就可以停了。

這就是靜態鏈表。

2、接下來是動態鏈表

首先向來實現怎麼動態的創建一個鏈表吧。

先定義一個結構體類型,如上。然後定義一個creat的函數如下:

struct Student *creat(int i ){ //返回值是一個結構體指針,其中i是所要創建節點的個數    
    int n = 0;  // 定義一個變量n,用來記錄節點的個數
      struct Student *head, *p1, *p2; //head是待返回的指針,它是鏈表的頭指針, p1是開拓指針,用於創建節點,相當於先鋒官。 p2起到連接
    //作用,用於連接已存在的鏈表好新創建的節點。
      for(int j = 0; j < i; j++,n++){ //創建i個節點的循環,並記錄創節點的個數。
          p1 = malloc(sizeof(struct Student)); //開闢一個新的節點;
          scanf("%d%f",&p1->num,&p1->score); //輸入參數。
          if(n == 1){
              head = p1; //如果是第一個節點,那麼給頭頭賦值
          }else{
              p2 -> next = p1; // 這句配合下面的p2 = p1,目的是讓下一個節點指向新的節點。
          }
          p2 = p1;
      } //循環結束
        p1->next = NULL; //最後一個人沒人可“牽”;
       return head; //返回頭部,鏈表完成。
}

原理圖大致如下:

1.第一個節點的創建

2.第2個節點。

照片來自《C程序設計》作者:譚浩強

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章