鍊錶中第乙個節點的儲存位置,叫做頭指標,最後乙個節點指標為空(null)
頭指標與頭結點的異同:
頭指標:
頭指標是指鍊錶指向第乙個結點的指標,若煉表有頭結點,則是指向頭結點的指標。
頭指標具有標識作用,所以常以頭指標冠以鍊錶的名字(指標變數的名字)。
無論鍊錶是否為空,頭指標均不為空。
頭指標是鍊錶的必要元素。
頭結點:
頭結點是為了操作的統一和方便而設立的,放在第乙個元素的結點之前,其資料域一般無意義(但也可以用來存放鍊錶的長度)。
有了頭結點,對在第一元素結點前插入結點和刪除第乙個結點,其操作與其他結點的操作就統一了。
頭結點不一定是鍊錶的必須要素。
單鏈表示例:
空鏈表示例:
使用c語言結構體概括單鏈表,如下:
typedef
struct node node;
typedef
struct node *linklist;
演算法思路:
宣告乙個節點p指向鍊錶的第乙個節點,初始化j從1開始;**實現如下:當j < i時,就遍歷鍊錶,讓p的指標向後移動,不斷指向下乙個節點,j+1;
若到鍊錶末尾,p為空,則說明第i個元素不存在;
否則,查詢成功,返回結點p的資料。
/*
* 獲取鍊錶中第i個資料
* 用e返回l中第i個資料元素的值
*/status getelem(linklist l, int i, elemtype *e)
if(!p || j > i)
*e = p->data;
return ok;
}
參考下圖思考:假設儲存元素e的結點為s,如何將結點s插入到ai-1和ai之間呢?
我們發現,根本不用驚動其他任何結點,只需要讓s->next和p->next做些改變即可。
s->next = p->next;
p->next = s;
演算法思路:
宣告一結點p指向煉表頭結點,初始化j從1開始;**實現如下:當j < i時,就遍歷鍊錶,讓p的指標向後移動,不斷向下乙個結點,j累加1;
若到鍊錶末尾,p為空,則說明第i個元素不存在;
否則,查詢成功,在系統中生成乙個空結點s;
將資料元素e賦值給s->data;
插入結點,返回成功。
/**
* 單鏈表插入操作:
* 在l中第i個位置之前插入新的資料元素e
*/status insertlist(linklist l,int i,elemtype e)
if(!p || j > i)
//建立s結點,資料域賦值為e
s = createlink();
s->data = e;
//插入s結點
s->next = p->next;
p->next = s;
return ok;
}
參考下圖思考:假設元素a1結點為q,要實現單鏈表刪除結點q的操作,其實就是將其前繼結點的指標繞過指向後繼結點即可。
實際上就是一步操作:
p->next = p->next->next;
也可以分步驟這樣:
q = p->next;
p->next = q->next;
演算法思路:
宣告一結點p指向煉表頭結點,初始化j從1開始;當j < i時,就遍歷鍊錶,讓p的指標向後移動,不斷向下乙個結點,j累加1;
若到鍊錶末尾,p為空,則說明第i個元素不存在;
否則,查詢成功,將欲刪除結點p->next賦值給q,將p->next指向p->next->next,即q->next;
將q結點資料賦值給e,作為返回值;
返回成功。
/**
* 單鏈表刪除操作:將l中第i個結點刪除
*/status deletelist(linklist l,int i,elemtype *e)
if(!p || j > i)
//將第i個結點賦值給q結點,刪除第i個結點
q = p->next;
p->next = p->next->next;
*e = q->data;
//free(q); //釋放q結點
return ok;
}
建立單鏈表的過程是乙個動態生成鍊錶的過程,從「空表」的初識狀態起,依次建立各元素結點,並逐個插入鍊錶。
演算法思路:
宣告一結點p和計數器變數i;頭插法建立單鏈表:初始化一空鍊錶l;
讓l的頭結點的指標指向null,即建立乙個帶頭結點的單鏈表;
迴圈實現後繼結點的賦值和插入。
頭插法從乙個空表開始,生成新結點,讀取資料存放到新結點的資料域中,然後將新結點插入到當前鍊錶的表頭上,直到結束為止。
簡單來說就是把新加進的元素放在表頭後的第乙個位置:
先讓新結點的next指向頭結點之後;
然後讓表頭的next指向新結點。
**如下:
其中,l表示頭結點,p表示待插入的節點,data表示待插入的值。
**實現:
/*
* 頭插法建立單鏈表
*/linklist createlisthead(int n)
return l;
}int main()
尾插法建立單鏈表:
頭插法建立鍊錶雖然演算法簡單,但生成的鍊錶中節點的次序和輸入的順序相反。而這種情況尾插法是可以彌補滴嘍~
**如下:
其中,l表示頭結點,r為中間變數,p表示待插入的節點,data表示待插入的值。
**實現:
/*
* 尾插法建立單鏈表
*/linklist createlisttail(int n)
r->next = null; //迴圈結束,將最後乙個結點指向null
return l;
}int main()
單鏈表 學習筆記1
首先我們來看一下整體 include define ok 1 using namespace std class infonode infonode createhead int el,infonode l void addtotail int el infonode l r new infonod...
c 學習筆記 單鏈表
總結自己關於鍊錶的一些理解與學習 鍊錶就是鏈結和 的結合,即指標與資料的結合,個人理解就是乙個個首尾相連的方格 如圖所示,就是乙個個小方格,裡面存放著資料與指標,每個小方格由指標相互連線起來,最前面的叫頭指標,最後面的指標為0.本例使用的是嵌入類來實現鍊錶,當然也有繼承類 復合類 結構體等實現方式。...
單鏈表學習
include stdafx.h include struct node 建立乙個結構體 void insertnode struct node head,int value ne struct node malloc sizeof struct node 申請堆空間 if ne null ne v...