資料結構與演算法 單鏈表的使用

2021-09-01 13:00:28 字數 3598 閱讀 3999

2. 單鏈表的變形

3. 總結

資料域 (資料元素) + 指標域 (指示後繼元素儲存位置) = 結點

以「結點的序列」 表示的線性表稱作鍊錶

1.不帶頭結點:

不帶頭結點的的單鏈表

以線性表中第乙個資料元素a1的儲存位址作為線性表的位址,稱作線性表的頭指標(head)。

2.帶頭結點 :

帶頭結點的的單鏈表(箭頭所指表示頭結點)

有時為了操作方便,在第乙個結點之前虛加乙個「頭結點」,並用鍊錶的頭指標指向頭結點,稱為帶頭結點的單鏈表。

用法舉例:已知指標p指向單鏈表l的第i個結點,則訪問第i個資料和第i+1個資料的方法分別是p->datap->next->data

簡單鏈表示例:

具有兩個節點的單鏈表

**實現:

// 型別定義

typedef

struct node

node,

*ptr;

typedef ptr *sqlistptr;

//變數的定義和使用

node n1, n2;

/* 定義2個結點變數*/

ptr p =

&n1;

/* 定義乙個指向結點的指標變數p, 並存放n1的位址(指標) */

n1.next =

&n2;

/* 結點n1的指標域存放結點n2的位址*/

sqlistptr l = p;

//定義乙個單鏈表l

n2.next =

null

;

**實現:

//尋找位於 pos 的結點,並將資料儲存到 *elem 中。

status list_retrieve

(sqlistptr l,

int pos, elemtype *elem)

if(p && i == pos)

)/*找到指定位置,且該結點存在*/

return s;

}

**實現:

//尋找資料域等於 elem 的結點,並將其位置儲存到 *pos中。

status list_locate

(sqlistptr l, elemtype elem,

int*pos)

if(p)

return s;

}//也可用下面表示

status list_locate

(sqlistptr l, elemtype elem,

int*pos)

if(p)

return s;

}

插入示意圖:

插入操作示意圖

將 s節點插入到 a(i-1)和 ai之間,其中p指向a(i-1)節點。

**如下所示:

status list_insert

(sqlistptr l,

int pos-

1, elemtype elem)

else status = fatal;

}else status = range_error;

return status;

}

刪除操作表示從單鏈表中刪除ai這個節點。

下圖為示例圖:

**如下:

status list_delete

(sqlistptr l,

int pos)

return status;

}

要建立新鍊錶,則需先建立an,然後建立a(n-1),……,依次建立到a1。示意圖如下:

建立新煉表示意圖

**如下:

status list_create

(sqlistptr l, elemtype data,

int len)

else}}

return s;

}

最後乙個結點的指標域的指標又指回第乙個結點的鍊錶,和單鏈表的差別僅在於,判別鍊錶中最後乙個結點的條件不再是「後繼是否為空」,而是「後繼是否為頭結點」

這裡介紹一下帶尾指標的迴圈單鏈表的應用。

關鍵**:

p= la –>next; /*儲存la 的頭結點指標*/

la->next= lb->next->next; /*頭尾連線*/

free(lb->next); /*釋放第二個表的頭結點*/

lb->next=p; /*組成迴圈鍊錶*/

由於單鏈表找後繼很方便,找前驅很複雜,所以另用乙個空間/指標域來存放前驅的指標,即雙向鍊錶。

雙向鍊錶的節點用**表示如下:

typedef

struct dunodedunode,

*dunodeptr,

**dulist;

插入操作示意圖:

刪除操作示意圖:

雙向的鍊錶的插入和刪除操作**:

//雙向鍊錶插入操作核心**

s->next = p->next;

p->next = s;

s->next->prior = s;

s->prior = p;

//雙向鍊錶刪除操作核心**

p->next = p->next->next;

p->next->prior = p;

線性表可以採用順序儲存結構,也可以採用鏈式儲存結構。

單鏈表(演算法與資料結構)

鍊錶 單鏈表 為每個結點新增1個指標域,每個結點包括兩個域 資料域 存放元素本身資訊 指標域 存放後繼結點的儲存位置 指向鍊錶中第乙個結點的指標,稱為這個鍊錶的頭指標。最後乙個元素的指標不指向任何結點,稱為空指標,圖示中用 表示,在演算法中用 null 表示 帶頭結點的單鏈表 頭結點 可以不存資訊,...

資料結構與演算法 單鏈表

鍊錶是有序的列表,但是它在記憶體中是儲存如下 鍊錶是以節點的方式來儲存的 鍊錶的各個節點不一定是連續儲存的 鍊錶分帶頭結點的鍊錶和不帶頭結點的鍊錶 新增先建立乙個 head 頭結點,作用就是表示單鏈表的頭 後面我們每新增乙個結點,就直接加入到鍊錶的最後 遍歷 通過乙個輔助變數,幫助來遍歷整個鍊錶 第...

資料結構與演算法 單鏈表

單鏈表的建立 1.建立乙個head頭節點,作用就是表示單鏈表的頭 2.後面我們每新增乙個節點,就直接加入鍊錶的最後 定義heronode,每個heronode物件就是乙個節點 class heronode 為了顯示方法,重新tostring public string tostring 定義sing...