1. 程式人生 > >讓新手更能理解的c語言單向連結串列

讓新手更能理解的c語言單向連結串列

此文是專門詳解單項鍊表有些同學想不懂的問題。

一列火車,火車有許多的車廂,每節車廂之間有一根鏈子相連,只有通過鏈子才能連線到下一節車廂,如果鏈子斷掉了,那麼後面的車廂就找不到了。連結串列可以說就是這樣的原理。以下是我寫的較為簡單一個單向連結串列:為了錄入40名同學的名字和學號(只是為了講解連結串列的原理,沒有輸出功能和其他功能,請見諒)

#include <stdio.h> #include <stdlib.h> #include <string.h> struct name{     char name[20];     //同學的名字     int id;            //同學的學號     struct name *next; //指向下一節車廂的指標(下一位同學)     };

    struct name *p;     struct name *head =NULL;     struct name *temp; int main() {     int i;     //錄入40位同學的基本資訊     for(i =0; i<42 ;i++){         p = (struct name*)malloc(sizeof(struct name));     if(head == NULL)     {         head = p;     }else{         temp->next = p;     }     printf("what your name?\n");     scanf("%s",p->name);     printf("what is your id?\n");     scanf("%d",&p->id);     temp =p;         } }

如上程式碼,先寫一個同學資訊的結構,宣告三個結構指標變數,其中head指標為頭指標,指向火車頭的地址。p可以想成一個臨時指標變數,為每次迴圈重新給記憶體空間和重新定義的指標變數。temp指標作用是最大的,在後面我會講。結構中next指標則為火車的鏈子,指向下一個車廂的地址。

第一次迴圈:先給p指標分配空間,第一次錄入就相當於火車頭,火車頭丟了,那麼後面的車廂也就找不到了,這影響太大了,所以火車頭十分的重要,且火車頭要固定不變。用head指標來指向第一次錄入的結構的地址a作為火車頭,隨後固定不變。之後錄入資訊,資訊存入 火車頭。這時p和head指標所指的地址是相同的,所以資訊也相同。隨後p的地址賦給temp指標,此時temp = p = head 指向同一個地址(因為下次迴圈p因重新分配記憶體,地址會與上次迴圈p的地址不相同,所以用temp表示上次迴圈p的地址)。

第二次迴圈:給第一節車廂解鎖。重新給p指標分配空間記憶體,這時p的地址發生變化,而temp指標就發生了作用,因為temp為火車頭的地址,temp->next就等於 火車頭的鏈子連著的第一節車廂 等於 head ->next  指向下個結構(車廂),p指向的結構的地址賦給這一節車廂(火車頭->next),之後錄第二位同學的資訊,存入第一節車廂當中。在下次迴圈中,會用到這次資訊錄入的結構的地址,這時再次將p指向的地址賦給temp,以便下次迴圈使用這節車廂的地址來引出這節車廂的鏈子(temp->next)指向下一節車廂。

第三次迴圈:給第二節車廂解鎖。再次重新給p指標分配空間記憶體,此時temp指向的地址為第一節車廂的地址(temp->next為指向第二節車廂),而這時的ptemp->next的地址和head ->next->next的地址相同,同樣為第二節車廂的地址。錄入第三位同學的資訊。

迴圈中~~~~~~~~

迴圈完後輸出:

 for(i =0;i<2;i++)         {             p = head; // 將頭指標的地址賦給p指標             printf("%s",p->name);   //列印相應同學的名字             p = p->next;    //將鏈子接上,引出下一個同學         }  

以上為連結串列的基礎原理,希望我的講解能為不太想的通連結串列的同學有點幫助,有不足和問題可以提出來,我們一起探討哦!