讓新手更能理解的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為指向第二節車廂),而這時的p和temp->next的地址和head ->next->next的地址相同,同樣為第二節車廂的地址。錄入第三位同學的資訊。
迴圈中~~~~~~~~
迴圈完後輸出:
for(i =0;i<2;i++) { p = head; // 將頭指標的地址賦給p指標 printf("%s",p->name); //列印相應同學的名字 p = p->next; //將鏈子接上,引出下一個同學 }
以上為連結串列的基礎原理,希望我的講解能為不太想的通連結串列的同學有點幫助,有不足和問題可以提出來,我們一起探討哦!