1. 程式人生 > >動態資料結構-動態建立連結串列

動態資料結構-動態建立連結串列

#include <stdio.h>
#include <stdlib.h>
struct weapon
{
    int price;
    int atk;
    struct weapon * next;//定義一個struct weapon 型別的指標變數next,用來存放下一個節點的地址(指向下一個節點)。
};

struct weapon * create()//需要一個建立連結串列的函式,函式的返回值型別是struct weapon *型別
{
    struct weapon *head;//定義一個頭指標
    struct weapon * p1, * p2;//**p1 指向當前新建立的節點,p2指向上一個節點**
int n = 0;//用來記錄當前連結串列中的節點個數 p1 = p2 = (struct weapon*)malloc(sizeof(struct weapon)); scanf"%d,%d", &p1->price,&p2->atk);//需要從鍵盤輸入武器的價格和攻擊力賦給p1所指的第一個節點,第一個節點是淡出做處理的 head = NULL//由於一開始連結串列是不存在的,所以先給連結串列一個初值:空 while(p1->price != 0)//約定什麼時候讓輸入結束,也就是說我們總共錄入幾個資訊,比方說我想錄三個資訊,在第四個資訊的時候不想錄入了,約定price = 0就不連線到連結串列裡了
{ n++; if (n == 1) head = p1;//第一個新增到連結串列中的節點,我們做特殊處理,使head指向第一個元素 else p2->next = p1;//如果不是第一次輸入,我們就讓當前節點的前一個節點的next指向當前的這個節點,我們會用p2儲存之前建立的節點地址 p2 = p1;//用p2儲存之前建立的節點地址,然後下面再建立新的地址賦給p1,就形成了,p1儲存當前節點地址,p2儲存前一個節點地址 p1 = (struct wepaon *)malloc(sizeof(struct
weapon));再建立新的地址賦給p1,開闢了一個新的儲存區 scanf("%d,%d",&p1->price,&p1->atk)//開闢了一個新的儲存區之後又開始了輸入環節 } p2->next = NULL; return (head); } int main() { struct weapon *p; p = creat();//把creat的返回值賦給p,就是連結串列的頭指標 printf("%d,%d",p->price,p->atk);//列印的第一個節點的值 return 0; }

總結:p1用來儲存當前的節點,建立完後掛在前面節點後面,即就是p2的後面,掛好後呢,因為我們還要繼續建立新節點,然後掛在前面節點上,依次迴圈永不停息,所以得更新前面節點,就把p2指到p1,這樣p1就可以繼續申請記憶體建立新節點