資料結構-malloc申請動態空間-連結串列的建立
一: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);
}
相關文章
- 資料結構實驗之連結串列六:有序連結串列的建立資料結構
- 資料結構實驗之連結串列二:逆序建立連結串列資料結構
- 資料結構實驗之連結串列一:順序建立連結串列資料結構
- 動態連結串列的建立(程式碼)
- C#資料結構-靜態連結串列C#資料結構
- 資料結構-連結串列資料結構
- 資料結構 - 連結串列資料結構
- 連結串列-資料結構資料結構
- 資料結構--連結串列資料結構
- 資料結構—連結串列資料結構
- 資料結構-單連結串列、雙連結串列資料結構
- 資料結構之單連結串列的建立與刪除資料結構
- JavaScript資料結構--連結串列JavaScript資料結構
- 資料結構之「連結串列」資料結構
- 資料結構之連結串列資料結構
- 實戰資料結構(6)_靜態連結串列的使用資料結構
- 核心中的連結串列資料結構資料結構
- Redis資料結構—連結串列與字典的結構Redis資料結構
- Java版-資料結構-連結串列Java資料結構
- JavaScript資料結構 之 連結串列JavaScript資料結構
- 資料結構學習--連結串列資料結構
- 資料結構:跳躍連結串列資料結構
- js資料結構--連結串列(likedList)JS資料結構
- 資料結構基礎 連結串列資料結構
- 資料結構之連結串列【上】資料結構
- 資料結構之連結串列操作資料結構
- 資料結構——雙向連結串列資料結構
- 資料結構04——單連結串列資料結構
- JAVA資料結構之連結串列Java資料結構
- 資料結構之單連結串列資料結構
- 資料結構:雙向連結串列資料結構
- JS資料結構(四)——連結串列JS資料結構
- 資料結構實驗之連結串列三:連結串列的逆置資料結構
- 資料結構實驗之連結串列五:單連結串列的拆分資料結構
- 資料結構之連結串列篇(單連結串列的常見操作)資料結構
- 前端資料結構--線性結構-連結串列前端資料結構
- 資料結構:單迴圈連結串列的建立插入與刪除資料結構
- 資料結構實驗之連結串列九:雙向連結串列資料結構