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節點的定義*/find 函式返回元素x所在的node的指標;findprevious 返回x的前驅元的指標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)
/*delete 函式刪除表中的元素x,這裡規定,例程刪除第一次出現的x,如果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)
/*insert函式實現將x插入鍊錶中。書中的實現方法傳入了乙個位置,供x插入。在這裡,我將x插入到表中第乙個元素位置,即表頭後的乙個位置delete first occurrence of x from a list
*/void
delete(elementtype x, list l)
}
/*deletelist 函式刪除鍊錶insert x into list
*/void
insert(elementtype x, list l)
/*4、雙鏈表/迴圈列表這個程式不同於書中的程式,此處刪除了表頭;書中的程式保留了表頭
*/void
deletelist(list l)
}
雙鏈表的實現非常簡單,即在結構體中新增乙個指標域,指向該單元的前乙個單元即可。它可以非常簡單的實現表的倒序掃瞄。同時,它簡化了刪除操作,因為你不在需要獲得前驅單元的指標,這個資訊是現成的。
迴圈列表讓最後的單元反過來指向的乙個單元,可以有表頭,也可以沒有表頭。
資料結構與演算法(六)查詢 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顯式的判斷是...