1. 程式人生 > >單鏈表指標和頭結點的理解

單鏈表指標和頭結點的理解

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

struct node {
	int data;
	struct node *next;
};

其中有兩個元素,data為資料域,用於儲存資料,next為指標域,用於儲存下個結點的位置(地址)。那麼什麼是頭指標呢?我們把指向第一個結點的指標稱為頭指標,那麼每次訪問連結串列時都可以從這個頭指標依次遍歷連結串列中的每個元素,例如:

struct node first;
struct node *head = &first;

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

#include <stdio.h>
 
struct node {
	int data;
	struct node *next;
};
 
int main(void)
{
	struct node *head, first, second;
 
	head = &first;
	first.data = 1;
	first.next = &second;
	
	second.data = 2;
	second.next = NULL;
	
	while (head) {
		printf("%d\n", head->data);
		head = head->next;
	}
	return 0;
}

需要著重注意的是while那部分(通過頭指標遍歷完整個連結串列)。

那麼什麼又是頭結點呢?很多時候,會在連結串列的頭部附加一個結點,該結點的資料域可以不儲存任何資訊,這個結點稱為頭結點,
頭結點的指標域指向第一個結點,例如:
struct node head, first;
head.next = &first;
那麼這裡的頭指標又是誰呢,不在是指向第一個結點的指標,而是指向頭結點的指標,例如:
struct node *root = &head;
即root指標才是頭指標。示例如下:

#include <stdio.h>
 
struct node {
	int data;
	struct node *next;
};
 
int main(void)
{
	struct node *root, head, first, second;
	
	root = &head;
	root->data = 0;
	root->next = &first;
	
	first.data = 1;
	first.next = &second;
	
	second.data = 2;
	second.next = NULL;
	
	while (root) {
		printf("%d\n", root->data);
		root = root->next;
	}
	
	return 0;
}

頭結點的作用

資料結構中,在單鏈表的開始結點之前附設一個型別相同的結點,稱之為頭結點。頭結點的資料域可以不儲存任何資訊,頭結點的指標域儲存指向開始結點的指標(即第一個元素結點的儲存位置)。

1、防止單鏈表是空的而設的.當連結串列為空的時候,帶頭結點的頭指標就指向頭結點.如果當連結串列為空的時候,單鏈表沒有帶頭結點,那麼它的頭指標就為NULL.

2、是為了方便單鏈表的特殊操作,插入在表頭或者刪除第一個結點.這樣就保持了單鏈表操作的統一性!

3、單鏈表加上頭結點之後,無論單鏈表是否為空,頭指標始終指向頭結點,因此空表和非空表的處理也統一了,方便了單鏈表的操作,也減少了程式的複雜性和出現bug的機會。

4、對單鏈表的多數操作應明確對哪個結點以及該結點的前驅。不帶頭結點的連結串列對首元結點、中間結點分別處理等;而帶頭結點的連結串列因為有頭結點,首元結點、中間結點的操作相同 ,從而減少分支,使演算法變得簡單 ,流程清晰。對單鏈表進行插入、刪除操作時,如果在首元結點之前插入或刪除的是首元結點,不帶頭結點的單鏈表需改變頭指標的值,在C 演算法的函式形參表中頭指標一般使用指標的指標(在C+ +中使用引用 &);而帶頭結點的單鏈表不需改變頭指標的值,函引數表中頭結點使用指標變數即可。


作者:mcgrady_tracy
來源:CSDN
原文:https://blog.csdn.net/mcgrady_tracy/article/details/32130421
版權宣告:本文為博主原創文章,轉載請附上博文連結!