單向鍊錶的演算法實現

2021-10-01 22:39:07 字數 4499 閱讀 4460

#include

#include

using

namespace std;

//定義乙個鍊錶

typedef

struct _linknode linklist, linknode;

//1. 表示首節點 2.表示節點

//初始化鍊錶

bool

initlist

(linklist*

&list)

list-

>next =

null

;return

true;}

//前插法

bool

listinsert

(linklist*

&list, linknode*

&node)

//前插法 把首節點的next 賦值給 新節點的next(如果只有乙個首節點那麼新節點的next指向為空)

//然後把首節點next指向 新節點本身 以此類推建立多個節點

node-

>next = list-

>next;

list-

>next = node;

return

true;}

//後插法插入鍊錶

bool

listinsert_back

(linklist*

&list, linknode*

&node)

last = list-

>next;

while

(last-

>next)

//找到最後乙個節點後 要在最後乙個節點後插入節點

//那麼就是把 last(上次迴圈找到的最後乙個節點) 指向要插入的新節點

//然後把新插入節點的next指向空. 以此類推

last-

>next = node;

node-

>next =

null

;return

true;}

// 由使用者任意指定位置插入節點

//需要傳遞三個引數1. 首節點 2.要插入的節點的位置int i 3.要插入節點的資料 int e

bool

linkinsert_rand

(linklist*

& list,

int i,

int e)

int j =0;

//用於計數 找到要新插入節點的位置

linknode* p =

null

;//臨時指標

linknode* s =

null

;//要插入的新節點的指標

//要想實現在任意位置插入節點的話 那麼就要先找到插入節點的位置

//方法就是 先建立乙個臨時指標p 先指向首節點 然後while迴圈

//如果節點的位置是5 那麼要插入的節點位置就是5-1

//小學數學問題 要插入的位置是 n的話 那麼他的位置就是n-1

p = list;

//從首節點開始找

//就是要插入的節點在哪個位置 就迴圈多少次

while

(p &&

(j < i -1)

)//如果 i=負數 的話 那麼上面while迴圈的j永遠不會i-1 那麼迴圈會一直進行

// p為null 也就是到最後乙個節點... 那麼這個時候就是非法的了

//如果使用者輸入的資料大於已有節點的數量 p會一直遍歷到最後乙個節點 導致p=null

//那麼就需要下面的防禦性檢查了...

//合法性檢查 如果p為空的話 說明插入的位置已經超過節點數量了

//那麼就是非法的 或者使用者輸入的插入位置小於0 if(

!p || j > i -1)

s =new linknode;

//前面找到為插入節點的位置以後 新節點傳入資料

s->data = e;

s->next = p-

>next;

//新節點的next指向 插入點位置前面節點的next(p->next)

p->next = s;

//然後再把前面位置節點(p->next)指向新節點本身

return

true;}

//查詢鍊錶資料 (按位置查詢)

bool

link_getelem

(linklist*

& list,

int i,

int& e)

index =1;

p = list-

>next;

while

(p && index < i)if(

!p || index > i)

e = p-

>data;

return

true;}

//查詢鍊錶資料 (按值查詢)

bool

link_findelem

(linklist*

& list,

int e,

int&index)

p = list-

>next;

while

(p && p-

>data != e)if(

!p)return

true;}

//刪除鍊錶的節點

bool

linkdelete

(linklist*

& list,

int i)if(

!p || index > i -1)

q = p-

>next;

//臨時儲存要被刪除的節點 以後用來delete

p->next = q-

>next;

//p的next指向被刪除節點的下乙個節點

delete q;

return

true;}

//單鏈表的銷毀

void

linkdestroy

(linklist*

& list)

}//遍歷鍊錶資料(列印鍊錶)

//需要傳入首節點 根據首節點 找到後面的節點

void

linkprint

(linklist*

& list)

//遍歷鍊錶資料首先建立乙個臨時指標然後指向首節點的next

//然後迴圈遍歷 因為節點本身的next就是指向下乙個節點的

//所以 通過每個節點的next 來訪問下乙個節點

//只需要把每個節點的next 賦值給 臨時指標p 然後逐次列印每個節點的data

// 那麼就實現了遍歷真個鍊錶

p = list-

>next;

int i =1;

while

(p)}

intmain

(void

)//遍歷鍊錶 列印資料

linkprint

(list)

;//3. 使用後插法插入節點

cout <<

"2.------使用後插法插入節點---------"

"後插法建立單鏈表:"

; cin >> n;

cout <<

"請以此輸入n個元素:"

;while

(n >0)

//遍歷鍊錶 列印資料

linkprint

(list)

;//4. 任意位置插入節點'

cout <<

"3.------任意位置插入節點------"

<< endl;

int i, e;

cout <<

"請輸入插入節點的位置:"

; cin >> i;

cout <<

"請輸入要插入節點的data(資料):"

; cin >> e;if(

linkinsert_rand

(list, i, e)

)else

linkprint

(list)

;//5. 查詢鍊錶的資料(按位置查詢值)

int elems =0;

if(link_getelem

(list,

2, elems)

)else

//6. 查詢鍊錶的資料(按值查詢 並返回位置)

int index =0;

if(link_findelem

(list,

100, index)

)else

//7. 單鏈表節點的刪除if(

linkdelete

(list,2)

)else

linkprint

(list)

;//8. 單鏈表的銷毀

linkdestroy

(list)

;system

("pause");

return0;

}

實現單向鍊錶

鍊錶類 public class link 增加節點 public void add node node else 輸出節點 public void print else 內部搜尋節點的方法 public boolean search string data 直到不存在下乙個節點結束搜尋 if th...

實現單向鍊錶

鍊錶類 public class link 增加節點 public void add node node else 輸出節點 public void print else 內部搜尋節點的方法 public boolean search string data 直到不存在下乙個節點結束搜尋 if th...

單向鍊錶的實現

c語言實現單向鍊錶是利用結構體作為節點,結構體指標傳遞位址 include include include typedef struct node node typedef struct node lnode 定義結構體資料型別lnode typedef struct node linklist 定...