資料結構與演算法C語言實現筆記(1) 表

2022-09-14 01:51:08 字數 2533 閱讀 9978

1、表

表是最簡單的資料結構,是形如a1、a2、a3、a4、...、an的表,表的大小為n。大小為0的表為空表。

2、表的簡單陣列實現

對錶的所有操作都可以通過使用陣列來實現。但是陣列實現的表有兩個缺點:(1)需要對錶大小的最大值進行估計,通常需要估計的大一些,因此會浪費大量的空間;(2)、插入和刪除操作是昂貴的。這個是顯而易見的,當插入ai時,i到n的所有元素都需要往後移動乙個位置以空出空間來存放ai,因此這兩種操作最壞的情況為o(n)。所以,簡單陣列一般不用來實現表。

3、鍊錶

鍊錶由一系列不必在記憶體中連續的結構組成,每乙個結構均含有表元素和指向本元素後繼元的結構的指標,稱之為next指標。這樣,就可以允許表可以不連續儲存,從而避免了插入和刪除的線性開銷。表的示意圖如下:

刪除命令可以通過修改乙個指標來實現,比如上圖,要刪除a2,只需要修改a1指向a2的指標,將其直接指向a3即可;插入命令需要使用一次malloc操作得到乙個新的結構。比如要在a2和a3之間插入乙個新結構x,則先申請x的記憶體,讓a2的next指標指向x,x的next指標指向a3即可。以下為具體的程式實現細節。在程式實現時,有別於上圖的是,有乙個表頭,它沒有具體的資料,只有乙個指標,指向第乙個資料單元。

首先,在.**件中給出需要的宣告

#ifndef _list_h

#define _list_h

struct

node;

typedef

struct node *ptrtonode;

typedef ptrtonode list;

typedef ptrtonode position;

list makeempty(list l);

intisempty(list l);

intislast(list l);

position find(elementtype x, list l);

void

delete(elementtype x, list l);

position findprevious(elementtype x, list l);

void

insert(elementtype x, list l, position p);

void

deletelist(list l);

#endif

各個函式的作用由其命名即可清晰的看出。

下面是各個函式的實現,都比較簡單

/* 首先是具體的node節點的定義*/

struct node;/*

return true if l is empty

*/int

isempty(list l)

/* return true if p is last position in list l*/

/* parameter l is unused in this implemention*/

/* 引數l在這個實現中並沒有使用,寫在這裡,作者的意圖應該是易於以後的擴充套件*/

int islast(position p, list l)

find 函式返回元素x所在的node的指標;findprevious 返回x的前驅元的指標

/*

return postion of x in l; null if not found

*/position find(elementtype x, list l)

returnp;}

/* null if not found */

position findprevious(elementtype x, list l)

delete 函式刪除表中的元素x,這裡規定,例程刪除第一次出現的x,如果x不再表中,就什麼都不做。

/*

delete first occurrence of x from a list

*/void

delete(elementtype x, list l)

}

insert函式實現將x插入鍊錶中。書中的實現方法傳入了乙個位置,供x插入。在這裡,我將x插入到表中第乙個元素位置,即表頭後的乙個位置

/*

insert x into list

*/void

insert(elementtype x, list l)

deletelist 函式刪除鍊錶

/*

這個程式不同於書中的程式,此處刪除了表頭;書中的程式保留了表頭

*/void

deletelist(list l)

}

4、雙鏈表/迴圈列表

雙鏈表的實現非常簡單,即在結構體中新增乙個指標域,指向該單元的前乙個單元即可。它可以非常簡單的實現表的倒序掃瞄。同時,它簡化了刪除操作,因為你不在需要獲得前驅單元的指標,這個資訊是現成的。

迴圈列表讓最後的單元反過來指向的乙個單元,可以有表頭,也可以沒有表頭。

資料結構與演算法(六)查詢 c語言實現

靜態查詢表 include include include define max 20 typedef struct elemtype typedef struct stable stable initlist int n for int i 0 i n i st length n return s...

資料結構 C語言實現快速排序演算法

先從數列中選取乙個數為基準數 把所有大於基準數的數放在基準數的右邊,小於基準數的放在左邊 對上面的數列以上個基準數為軸,分別對左右兩個數列再次遞迴呼叫函式選擇新的基準數繼續比較 include intquick int arry,int left,int right arry left arry l...

資料結構 佇列(C語言實現)

佇列 c語言實現 include include define queueisempty arg arg size 0 define queueisfull arg arg size arg capacity 判斷是否為空或為滿。巨集定義,函式調銷太大。佇列使用size和capacity顯式的判斷是...