所謂建立動態鏈表,是指在程序執行過程中從無到有地建立一個鏈表。即我們需要一個個地去開闢新節點,並且去輸入節點的數據信息,然後建立起前後相連的關係。
下面我們開始嘗試建立起一個動態鏈表:
1.結構體部分:
struct weapon{
int price;
int atk;
struct weapon * next;
};
2.然後我們寫一個創建鏈表的函數:
這個函數要求返回的是鏈表的頭指針(head),所以將函數定義爲struct weapon *類型。
struct weapon * create(){
}
在該函數中,首先定義三個指針變量,head、p1、p2,這三個變量都用來指向struct weapon類型數據。head是鏈表的頭指針,p1指向鏈表當前新創建的節點,p2指向上一個節點。
struct weapon * head;
struct weapon * p1, * p2;
臨時變量n用來記錄節點的總個數。
int n = 0;
然後我們用malloc函數(注意引入頭文件#include<malloc.h>)去開闢第一個節點,先讓p1與p2都指向第一個節點。其中,malloc是分配內存塊的函數,sizeof是判斷數據類型長度符。
p1 = p2 = (struct weapon * )malloc(sizeof(struct weapon));
之後,我們從鍵盤輸入數據,賦值給第一個節點(p1)。由於最初鏈表不存在,所以給head置空。
scanf("%d %d",&(p1->price),&(p1->atk));
head = NULL;
接下來進入大批量輸入數據的過程:
當遇到輸入值爲0時,輸入過程結束:
while(p1-> price != 0){
}
對n進行++操作,且對n=1進行一個特殊處理(當n=1時,對於第一個添加到鏈表中的節點p1,讓head指向元素的地址,這就是頭指針):
n++;
if(n == 1) {
head = p1;
}
如果不是第一個節點(即當n>1)時,就讓當前節點的上一個節點去指向當前節點:
else{
//p2爲上一節點
p2->next = p1;
}
然後用p2保存當前節點(p1)的信息,再讓p1去開闢新的動態存儲區:
//更新
p2 = p1;
p1 = (struct weapon * )malloc(sizeof(struct weapon));
開闢新的存儲區後,進入新的輸入環節:
scanf("%d %d",&(p1->price),&(p1->atk));
當輸入完新的值後,再次回到while的判定區,判斷值是否爲0:
while(p1-> price != 0){
n++;
if(n == 1) {
head = p1;
}else{
//p2爲上一節點
p2->next = p1;
}
//更新
p2 = p1;
p1 = (struct weapon * )malloc(sizeof(struct weapon));
scanf("%d %d",&(p1->price),&(p1->atk));
}
如果while循環結束,此時p2實際上是該鏈表的最後一個節點,我們將p2的next置空:
//此時p2爲最後一個節點
p2->next = NULL;
最後,我們return頭指針:
return (head);
create函數體完整代碼:
struct weapon * create(){
struct weapon * head;
struct weapon * p1, * p2;
int n = 0;
p1 = p2 = (struct weapon * )malloc(sizeof(struct weapon));
scanf("%d %d",&(p1->price),&(p1->atk));
head = NULL;
while(p1-> price != 0){
n++;
if(n == 1) {
head = p1;
}
else{
//p2爲上一節點
p2->next = p1;
}
//更新
p2 = p1;
p1 = (struct weapon * )malloc(sizeof(struct weapon));
scanf("%d %d",&(p1->price),&(p1->atk));
}
//此時p2爲最後一個節點
p2->next = NULL;
return (head);
};
3.在main函數進行函數的調用:
int main()
{
struct weapon * p;
p = create();
//打印頭指針
printf("%d,%d",p->price,p->atk);
return 0;
}
4.完整代碼如下:
#include<stdio.h>
#include<malloc.h>
struct weapon{
int price;
int atk;
struct weapon * next;
};
struct weapon * create(){
struct weapon * head;
struct weapon * p1, * p2;
int n = 0;
p1 = p2 = (struct weapon * )malloc(sizeof(struct weapon));
scanf("%d %d",&(p1->price),&(p1->atk));
head = NULL;
while(p1-> price != 0){
n++;
if(n == 1) {
head = p1;
}
else{
//p2爲上一節點
p2->next = p1;
}
//更新
p2 = p1;
p1 = (struct weapon * )malloc(sizeof(struct weapon));
scanf("%d %d",&(p1->price),&(p1->atk));
}
//此時p2爲最後一個節點
p2->next = NULL;
return (head);
};
int main()
{
struct weapon * p;
p = create();
//打印頭指針
printf("%d,%d",p->price,p->atk);
return 0;
}
5.運行輸入:
結果: