鍊錶相對於順序表,具有更好的動態性。下面主要討論最簡單的一種鍊錶——單鏈表。
在單鏈表中,表的每乙個物件除了含有關鍵字element外,還有乙個指標next。物件中還可以含有其他的輔助資料,稱作衛星資料。當我們要移動關鍵字時,衛星資料也必須要移動。如果物件中含有大量衛星資料,則通常移動指標而不是物件本身。簡單起見,我們這裡沒有衛星資料。所以物件就可以用下面圖中的結點表示:
從上面的圖中可以看出,結點包含兩個域:資料域element和指標域next。現在資料域裡面只有關鍵字沒有衛星資料。指標域next指向該結點的後繼,注意的是最後乙個結點的next為null(在圖中用^表示)。有了以上模型,鍊錶結點的宣告如下:
typedef
int elementtype;
typedef
struct node *position;
struct node;
下面是乙個含有5個物件的鍊錶。
在用c語言實現的鍊錶中,結點是動態地分配儲存的,即程式在需要時才開闢乙個結點的儲存單元。c語言標準庫提供了malloc函式來從作業系統那裡獲得所需要的儲存空間。當然如果你申請的空間不再需要,記得用free函式來**,以免記憶體洩漏噢。
為了使刪除操作能夠更一般的進行(主要為了避免刪除第乙個節點這種特殊情況),我們在表的第乙個節點前面新增了乙個頭結點。則上面的表可以表示成這樣:
首先是list.h:
typedef int elementtype;
#ifndef list_h
#define list_h
struct node;
typedef struct node *position;
typedef struct node *list;
list makeempty( list l );
int isempty( list l );
int islast( position p, list l );
position find( elementtype x, list l );
position findprevious( elementtype x, list l );
void delete( elementtype x, list l );
void insert( elementtype x, list l, position p );
void deletelist( list l );
position header( list l );
position first( list l );
position advance( position p );
elementtype retrieve( position p );
#endif
fatal.h:
#include
#include
#define error( str ) fatalerror( str )
#define fatalerror( str ) fprintf( stderr, "%s\n", str ), exit( 1 )
list.c:
#include
#include
"list.h"
#include
"fatal.h"
struct node;
list makeempty( list l )
return l;
}int isempty( list l )
int islast( position p, list l )
position find( elementtype x, list l )
/* if x is not found, then next field of returned value is null */
position findprevious( elementtype x, list l )
/* delete from a list */
/* cell pointed to by p->next is wiped out */
/* assume that the position is legal */
/* assume use of a header node */
void delete( elementtype x, list l )
}void insert( elementtype x, list l, position p )
void deletelist( list l )
}position header( list l )
position first( list l )
position advance( position p )
elementtype retrieve( position p )
main.c:
#include
#include "list.h"
void printlist( const list l )
while( !islast( p, l ) );
printf( "\n" );
}}int main(int argc, char *argv)
for(int i = 0; i < 5; i += 2 )
delete( i, l );
printf( "finished deletions\n" );
printlist( l );
return
0;}
雜湊表(雜湊表)及其實現
雜湊表 hash table,也叫雜湊表 是根據關鍵碼值 key value 而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表。例如 給定表m,存在函式f key 對任意給定的關鍵字值key,代入函...
線性表及其實現
類項名稱 線性表 list 資料物件集 n個元素的構成的有序序列 n 0 操作集 l list,x elementtype,整線性表的基本操作主要有 如下 線性表的基本操作 list makeempty 初始化乙個空的線性表 elementtype findkth int k list l 返回位序...
線性表 順序表,鍊錶等)及其實現(C 版)
線性表的實現方式有下面幾種 線性表的順序儲存是指在記憶體中用一塊位址連續的空間依次存放線性表的資料元素,用這種方式儲存的線性表叫順序表,它的實現主要依賴於陣列。1 空間上 順序表的實現一般是實現連續開闢一段空間,然後在進行資料的增刪查改,所以當我們不知道要儲存多少資料時,用順序表來開闢的空間如果太大...