資料結構-malloc申請動態空間-連結串列的建立

w??oo.發表於2020-10-26

一:malloc申請動態空間注意以下事項:

1,malloc申請動態空間時必須宣告型別;

2,使用malloc申請的空間在使用完成之後必須使用free釋放;

3,malloc申請空間的型別必須和指向他的指標型別匹配;such as:

   int *p;

            p=(int *)malloc(sizeof(所要儲存資料的型別));

            free(p);

//在這裡要注意的是在第三點中所說的型別匹配指的是指標p的int型別和malloc前面的int 型別匹配,與sizeof括號裡的無關;
二:連結串列的建立

我們來建立一個連結串列用來儲存5個從鍵盤輸入的整數;

先來了解什麼是節點:在連結串列中我們把申請的一個動態空間稱之為節點,每一個節點分為兩個域,資料域和指標域,資料域用來存貯你要存的資料,指標域用來儲存下一個節點的地址;

1,我們首先使用結構體將節點的兩個域分別定義出來;

typedef struct node{

int date;                            //用來儲存整數的資料域

struct node *next;              //這裡定義了一個指向結構體的結構體指標,即節點的指標域;

}Elemsn; //為了方便書寫的方便我們為結構體起一個別名,Elemsn,等價於struct node;

2,申請動態空間作為節點,可以理解為連結串列的"一個"環;並用一個指標指向他,當然型別匹配指標的型別也要為結構體型別指標;

Elemsn *p;

p=(Elemsn *)malloc(sizeof(Elemsn));//申請的空間大小為sizeof(Elemsn);

3,準備工作做完,我們開始建連結串列;

我們使用函式的呼叫完成連結串列的建立

#includestdio.h

#includestdlib.h

#define N 5

#define null 0                                    //方便書寫,我們宣告null=0;

Elemsn *Creatlink(int a[]);            //宣告函式,該函式為建立連結串列的函式

void Printlink(Elemsn *h);            //宣告函式,該函式為輸出連結串列的函式
int main(void)    //   主函式

{

int a[N];                //   定義整形陣列a用來存放從鍵盤輸入的5個值

int i;

for(i=0;

   scanf("%d",a+i);                //從鍵盤輸入5個值

Elemsn *head=null;                /*在主函式中定義指向連結串列頭部的指標,我們稱為頭指標,領他的指標域為空*/

head=Creatlink(a);         /*呼叫函式,函式將返回已建立好的連結串列,我們只需用在主函式中定義好的頭指標將他指住,這樣我們的連結串列也就建好了;這裡我們將要存入連結串列中的陣列傳到形參中去,所以我們將陣列第一個單元的首地址傳過去*/

Printlink(head);            //將整個連結串列傳過去,呼叫輸出函式將連結串列存的值輸出

free(head);            //free釋放

return 0;

}

Elemsn *Creatlink(int a[]) //用指標a來接陣列的地址,開始建立連結串列

{

Elemsn *head,*tail,*p;            /*定義指向連結串列頭部的頭指標和指向尾部的tail指標,以及建立節點的指標p*/

int i;

head=tail=(Elemsn *)malloc(sizeof(Elemsn));//剛開始的時候頭和尾在同一個節點上

head->date=a[0];                        //令頭節點的資料域存a[0];

head->next=null;                        //因為此時還沒有建立下一個節點,所以頭指標指標域為空,沒有指向;

for(i=1;in;i++)        

{

    p=(Elemsn *)malloc(sizeof(Elemsn));

    p->date=a[i];

    p->next=null;        //這裡同上為建立節點並給   ‘域’  賦值

    tail->next=p;       // 這裡很重要,此處令尾部指標  tail  所指向節點的指標域儲存所創節點的地址,即為掛鏈



    tail=p;    //然後將尾部指標後移,移到p的位置,此時tail與p都指向所創的節點,然後反覆迴圈建立節點,掛鏈,後移直到迴圈結束,此時最後一個節點的指標域為空,即為null

}

return head;        //返回頭指標所儲存的地址,指標釋放,主函式中用已經定義好的head指標去接收返回的地址就好了;

}

void Printlink(Elemsn *h) //用指標h來接受連結串列,指向連結串列頭部

{

Elemsn *p;

for(p=h;p!=null;p=p->next)

    printf("%d\t",p->date);

}

相關文章