動態資料結構-動態建立連結串列
阿新 • • 發佈:2019-02-10
#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就可以繼續申請記憶體建立新節點