(學習筆記 4)單鏈表

2021-08-09 08:28:51 字數 3776 閱讀 3408

鍊錶中第乙個節點的儲存位置,叫做頭指標,最後乙個節點指標為空(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...