鍊錶的C語言實現(一

2021-06-28 09:21:05 字數 1922 閱讀 3841

一、為什麼用動態記憶體分配

但我們未學習鍊錶的時候,如果要儲存數量比較多的同型別或同結構的資料的時候,總是使用乙個陣列。比如說我們要儲存乙個班級學生的某科分數,總是定義乙個float型(存在0.5分)陣列:

float score[30];

但是,在使用陣列的時候,總有乙個問題困擾著我們:陣列應該有多大?

在很多的情況下,你並不能確定要使用多大的陣列,比如上例,你可能並不知道該班級的學生的人數,那麼你就要把陣列定義得足夠大。這樣,你的程式在執行時就申請了固定大小的你認為足夠大的記憶體空間。即使你知道該班級的學生數,但是如果因為某種特殊原因人數有增加或者減少,你又必須重新去修改程式,擴大陣列的儲存範圍。這種分配固定大小的記憶體分配方法稱之為靜態記憶體分配。但是這種記憶體分配的方法存在比較嚴重的缺陷,特別是處理某些問題時:在大多數情況下會浪費大量的記憶體空間,在少數情況下,當你定義的陣列不夠大時,可能引起下標越界錯誤,甚至導致嚴重後果。

那麼有沒有其它的方法來解決這樣的外呢體呢?有,那就是動態記憶體分配。

所謂動態記憶體分配就是指在程式執行的過程中動態地分配或者**儲存空間的分配記憶體的方法。動態記憶體分配不象陣列等靜態記憶體分配方法那樣需要預先分配儲存空間,而是由系統根據程式的需要即時分配,且分配的大小就是程式要求的大小。從以上動、靜態記憶體分配比較可以知道動態記憶體分配相對於景泰記憶體分配的特點:

1、不需要預先分配儲存空間;

2、分配的空間可以根據程式的需要擴大或縮小。

二、如何實現動態記憶體分配及其管理

要實現根據程式的需要動態分配儲存空間,就必須用到以下幾個函式

1、malloc函式

malloc函式的原型為:

void *malloc (unsigned int size)

其作用是在記憶體的動態儲存區中分配乙個長度為size的連續空間。其引數是乙個無符號整形數,返回值是乙個指向所分配的連續儲存域的起始位址的指標。還有一點必須注意的是,當函式未能成功分配儲存空間(如記憶體不足)就會返回乙個null指標。所以在呼叫該函式時應該檢測返回值是否為null並執行相應的操作。

下例是乙個動態分配的程式:

#include

#include

main()

for (count=0;count〈10;count )

array[count]=count;

for(count=0;count〈10;count )

printf("-",array[count]);

}上例中動態分配了10個整型儲存區域,然後進行賦值並列印。例中if((array(int *) malloc(10*sizeof(int)))==null)語句可以分為以下幾步:

1)分配10個整型的連續儲存空間,並返回乙個指向其起始位址的整型指標

2)把此整型指標位址賦給array

3)檢測返回值是否為null

2、free函式

由於記憶體區域總是有限的,不能不限制地分配下去,而且乙個程式要盡量節省資源,所以當所分配的記憶體區域不用時,就要釋放它,以便其它的變數或者程式使用。這時我們就要用到free函式。

其函式原型是:

void free(void *p)

作用是釋放指標p所指向的記憶體區。

其引數p必須是先前呼叫malloc函式或calloc函式(另乙個動態分配儲存區域的函式)時返回的指標。給free函式傳遞其它的值很可能造成宕機或其它災難性的後果。

注意:這裡重要的是指標的值,而不是用來申請動態記憶體的指標本身。例:

int *p1,*p2;

p1=malloc(10*sizeof(int));

p2=p1;

……free(p2)

malloc返回值賦給p1,又把p1的值賦給p2,所以此時p1,p2都可作為free函式的引數。

malloc函式是對儲存區域進行分配的。

free函式是釋放已經不用的記憶體區域的。

所以由這兩個函式就可以實現對記憶體區域進行動態分配並進行簡單的管理了。

鍊錶 C語言實現(一)

由於cherry不太擅長c,故本系列文章中難免會有紕漏,但cherry會盡力把演算法的思路寫清楚啦!typedef 作用 給型別起別名 typedef struct listnode ptrtonode typedef ptrtonode position 起別名為 position typedef...

鍊錶的C語言實現

編輯 c巨集例項 以下 摘自linux核心2.6.21.5原始碼 部分 展示了鍊錶的另一種實現思路,未採用ansi c標準,採用gnu c標準,遵從gpl版權許可。struct list head define list head init name define list head name st...

雙向鍊錶C語言實現

ifndef stdlist h define stdlist h typedef struct tagstdnode stdnode,lpstdnode typedef struct tagstdlist stdlist,lpstdlist 鍊錶資料結構 struct tagstdnode 鍊錶節...