動態數據結構——動態鏈表(malloc函數的使用)

所謂建立動態鏈表,是指在程序執行過程中從無到有地建立一個鏈表。即我們需要一個個地去開闢新節點,並且去輸入節點的數據信息,然後建立起前後相連的關係。

下面我們開始嘗試建立起一個動態鏈表:

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.運行輸入:

結果:

發佈了49 篇原創文章 · 獲贊 156 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章