C語言

當前位置 /首頁/計算機/C語言/列表

連結串列的C語言實現方法

C語言的應用範圍廣泛,具備很強的資料處理能力,不僅僅是在軟體開發上,而且各類科研都需要用到C語言,適於編寫系統軟體,三維,二維圖形和動畫,具體應用比如微控制器以及嵌入式系統開發。以下是小編為大家搜尋整理連結串列的C語言實現方法,希望能給大家帶來幫助!更多精彩內容請及時關注我們應屆畢業生考試網!

連結串列的C語言實現方法

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

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

float score[30];

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

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

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

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

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

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

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

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

1、malloc函式

malloc函式的原型為:

void *malloc (unsigned int size)

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

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

[cpp] view plaincopy

#include "malloc.h"

#include "stdlib.h"

main(void)

{

/*count是一個計數器,array是一個整型指標,也可以理解為指向一個整型陣列的首地址*/

int count;

int *array;

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

if(array==NULL)

{

printf("Out of memory!n");

exit(1);

}

/*給陣列賦值*/

for(count=0;count<10;count++)

{

array[count]=count;

}

/*列印陣列元素*/

for(count=0;count<10;count++)

{

printf("%2dn",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) /*或者free(p2)*/

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

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

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

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

中 連結串列的C語言實現之單鏈表的實現

  一、單鏈表的建立

有了動態記憶體分配的基礎,要實現連結串列就不難了。

所謂連結串列,就是用一組任意的儲存單元儲存線性表元素的一種資料結構。連結串列又分為單鏈表、雙向連結串列和迴圈連結串列等。我們先講講單鏈表。所謂單鏈表,是指資料接點是單向排列的。一個單鏈表結點,其結構型別分為兩部分:

1、資料域:用來儲存本身資料

2、鏈域或稱為指標域:用來儲存下一個結點地址或者說指向其直接後繼的指標。

例:

[cpp] view plaincopy

typedef struct node

{

char name[20];

struct node *link;

}stud;

這樣就定義了一個單鏈表的結構,其中char name[20]是一個用來儲存姓名的字元型陣列,指標*link是一個用來儲存其直接後繼的指標。

定義好了連結串列的結構之後,只要在程式執行的時候資料域中儲存適當的資料,如有後繼結點,則把鏈域指向其直接後繼,若沒有,則置為NULL。

下面就來看一個建立帶表頭(若未說明,以下所指連結串列均帶表頭)的單鏈表的完整程式。

[cpp] view plaincopy

#include

#include

#include /*包含動態記憶體分配函式的標頭檔案*/

#define N 10 /*N為人數*/

typedef struct node

{

char name[20];

struct node *link;

}stud;

stud * creat(int n) /*建立單鏈表的函式,形參n為人數*/

{

stud *p,*h,*s;/* *h儲存表頭結點的指標,*p指向當前結點的前一個結點,*s指向當前結點*/

int i;/*計數器*/

if((h=(stud *)malloc(sizeof(stud)))==NULL) /*分配空間並檢測*/

{

printf("不能分配記憶體空間!");

exit(0);

}

h->name[0]='