一、問題
????????創建動態鏈表就是指在程序執?過程中,從?到有,按照需求開辟結點和輸?各結點數據,并建?起前后相連接的關系。那么,如何創建動態鏈表呢?
二、解答
????????以建??個有任意名學?數據的單向動態鏈表為例,可以根據需要,動態地為學?分配內存,直到輸?學號為 0 ,則結束輸?,不再創建,然后將動態創建的學?信息輸出。 創建?個動態鏈表函數的相應代碼如下。
stu *creat(void)
{stu *head, *p1, *p2;n = 0;p1 = p2 = (stu *)malloc(LEN);scanf("%d,%d,%f", &p1->num, &p1->age, &p1->score);head = NULL;while (p1->num != 0){n = n + 1;if (n == 1){head = p1;}else{p2->next = p1;}p2 = p1;p1 = (stu *)malloc(LEN);scanf("%d,%d,%f", &p1->num, &p1->age, &p1->score);}p2->next = NULL;return head;
}
????????在創建函數中,若輸?學號為 0 ,則說明鏈表建?完成。建?鏈表之前,?先使 head 指向?個空指針,表?此時的鏈表?結點,當建?了第?個結點后,就令 head 指向該結點。
????????實現創建鏈表的過程如下:
(1)在為 p1 和 p2 開辟了內存空間后,從鍵盤輸??個學?的數據信息給 p1 所指的第?個結點。若學號不為0,則這輸?的是第?個數據,即 n=1,那么令 head 指向該結點, 即 head=p1,把 p1 的值賦給 head,如圖所示。
(2)建?完第?個結點后,再開辟?個結點并使 p1指向該結點。向結點中輸?數據, 如果第?個結點的學號不為 0 ,此時 n=2,則第?個結點就是第?個結點的直接后繼。使 p2 的指針域指向第?個結點,建?聯系,此時鏈表的形式如圖所示。
(3)第?個結點建?后,使 p2 指向新建?的第?個結點,?便 pl 再去開辟新的內存,建?下?個結點。建?下?個結點的?法同(2),第三個結點的建?如下圖所示。
(4)下?個結點的建??法同(2),直到鍵盤輸?學號為 0,則鏈表建?結束,學號為 0 這個結點不連接到鏈表中。
????????創建動態鏈表結束后,就可以在主函數中調?創建函數。該創建函數?傳遞參數,返回值為頭指針。創建鏈表結束后,輸出學?數據,運?結果如圖所示。
101,18,90,0
102,20,89,3
103,19,88,3
0
101,18,90.000000
102,20,89,300003
103,19,88.300003
三、總結
????????在創建動態鏈表的函數中,需要注意在開辟完?個結點后,需要先向結點中輸?數據, 再將前?個結點與后?個結點建?聯系,即前?個結點的指針域指向后?個結點,這樣才能將開辟的結點建?鏈式結構。