關於鍊錶中頭指標和頭結點的理解

2021-08-14 15:47:00 字數 2027 閱讀 5695

線性表使用順序(陣列)儲存時有個弊端,那就是在插入和刪除時需要大量的移動資料,這顯示是非常消耗時間的,所以可以採用鏈式儲存,即有乙個指標域(單鏈表),來記錄下個結點的儲存位置(位址),這樣在插入和刪除結點時只需要修改指標域即可,從而大量減少移動資料所消耗的時間。來看鍊錶的定義:

struct node ;
其中有兩個元素,data為資料域,用於儲存資料,next為指標域,用於儲存下個結點的位置(位址)。

單鏈表的示意圖如下:

head指標為單鏈表的頭指標,單鏈表l:l既是單鏈表的名字,也是其頭指標。鍊錶中的最後乙個結點的指標域定義為空指標(null)。

單鏈表的定義:當乙個序列中只含有指向它的後繼結點的鏈結時,就稱該鍊錶為單鏈表。

[plain]view plain

copy

struct node  

;  typedef struct node lnode;  

typedef struct node *linkedlist;  

那麼什麼是頭指標呢?我們把指向第乙個結點的指標稱為頭指標,那麼每次訪問鍊錶時都可以從這個頭指標依次遍歷鍊錶中的每個元素,例如:

struct node first;

struct node *head = &first;

這個head指標就是頭指標。

這個頭指標的意義在於,在訪問鍊錶時,總要知道鍊錶儲存在什麼位置(從何處開始訪問),由於鍊錶的特性(next指標),知道了頭指標,那麼整個鍊錶的元素都能夠被訪問,也就是說頭指標是必須存在的。示例如下:

[cpp]view plain

copy

#include 

structnode ;  

intmain(void)  

return0;  

}  需要著重注意的是while那部分(通過頭指標遍歷完整個鍊錶)。

單鏈表有帶頭結點和不帶頭結點之分。

上圖為沒有頭結點的單鏈表,下圖為帶有頭結點的單鏈表:

//不帶頭結點的單鏈表的初始化  

void linkedlistinit1(linkedlist l)  

//帶頭結點的單鏈表的初始化  

void linkedlistinit2(linkedlist l)  

l->next=null;  

}  那麼什麼又是頭結點呢?很多時候,會在鍊錶的頭部附加乙個結點,該結點的資料域可以不儲存任何資訊,這個結點稱為頭結點,

頭結點的指標域指向第乙個結點,例如:

struct node head, first;

head.next = &first;

那麼這裡的頭指標又是誰呢,不在是指向第乙個結點的指標,而是指向頭結點的指標,例如:

struct node *root = &head;
即root指標才是頭指標。示例如下:

[cpp]view plain

copy

#include 

structnode ;  

intmain(void)  

return0;  

}  注:在linux kernel中,定義頭結點使用巨集list_head。

關於鍊錶中頭指標和頭結點的理解

線性表使用順序 陣列 儲存時有個弊端,那就是在插入和刪除時需要大量的移動資料,這顯示是非常消耗時間的,所以可以採用鏈式儲存,即有乙個指標域 單鏈表 來記錄下個結點的儲存位置 位址 這樣在插入和刪除結點時只需要修改指標域即可,從而大量減少移動資料所消耗的時間。來看鍊錶的定義 struct node 其...

關於鍊錶中頭指標和頭結點的理解

線性表使用順序 陣列 儲存時有個弊端,那就是在插入和刪除時需要大量的移動資料,這顯示是非常消耗時間的,所以可以採用鏈式儲存,即有乙個指標域 單鏈表 來記錄下個結點的儲存位置 位址 這樣在插入和刪除結點時只需要修改指標域即可,從而大量減少移動資料所消耗的時間。來看鍊錶的定義 struct node 其...

頭結點和頭指標的理解

線性表使用順序 陣列 儲存時有個弊端,那就是在插入和刪除時需要大量的移動資料,這顯示是非常消耗時間的,所以可以採用鏈式儲存,即有乙個指標域 單鏈表 來記錄下個結點的儲存位置 位址 這樣在插入和刪除結點時只需要修改指標域即可,從而大量減少移動資料所消耗的時間。來看鍊錶的定義 struct node 其...