單鏈表的建立 增刪改查

2021-10-10 04:51:57 字數 4079 閱讀 3924

二、單鏈表的插入

三、單鏈表的刪除

四、單鏈表的查詢

五、單鏈表的建立

單鏈表分為不帶頭結點的單鏈表和帶頭結點的單鏈表

宣告乙個不帶頭結點的單鏈表,&符號表示引用,initlist函式中將l賦值為null,防止髒資料,表示空表。

#include

#include

typedef

struct lnodelnode,

*linklist;

bool initlist

(linklist &l)

帶頭結點的單鏈表宣告在initlist函式中使用malloc函式建立頭結點,

malloc函式語法:

typedef

struct lnodelnode,

*linklist;

lnode *p=

(lnode *

)malloc

(sizeof

(lnode));

free

(p)

帶頭結點的單鏈表:

帶頭結點的單鏈表使用更方便

listinsert插入操作,在第i個位序上插入指定元素e,時間複雜度o(n)。

一般使用帶頭結點的位序插入。

#include

#include

typedef

struct lnodelnode,

*linklist;

bool initlist

(linklist &l)

bool insertlist

(linklist &l,

int i,

int e)

if(p==

null

)//i值不合法

return false;

lnode *s=

(lnode *

)malloc

(sizeof

(lnode));

//生成插入節點

s->data = e;

//給插入節點s賦值

s->next = p->next;

p->next = s;

//將s連到p後

return true;

}int

main()

**中多次出現在p節點後插入元素e,即後插操作

2.2.1指定節點的後插操作

將其封裝為乙個函式insertnextnode

bool insernextnode

(lnode *p,elemtype e)

2.2.2指定節點的前插操作

在p節點前插入元素e(實際上是與後繼p節點交換資料data)

bool inserprioenode

(lnode *p,elemtype e)

2.2.3按位序插入

不帶頭結點插入時,需特殊考慮第乙個節點

bool insertlist

(linklist &l,

int i,

int e)

lnode *p;

//指標p指向當前掃瞄到的節點

int j=1;

//記錄p指向的是第幾個節點

p=l;

//l指向第1個節點

while

(p!=

null

&& j

bool insernextnode

(lnode *p,elemtype e)

//後插操作

}

先迴圈找到第i-1個節點,使q指向被刪除節點,將*q節點從鏈中斷開,最後釋放q節點的儲存空間。

最壞、平均時間複雜度o(n)

最好時間複雜度o(1)

刪除q節點

bool listdelete

(linklist &l,

int i,

int&e)

if(p==

null

)return false;

if(p->next=

null

)return false;

lnode *q=p->next;

//使q指向被刪除節點

e=q->data;

//e返回刪除元素

p->next=q->next;

//將*q節點從鏈中斷開

free

(q);

return true;

}

上面的刪除遍歷前 i-1個資料,現在直接刪除單個節點,不過p不能是最後乙個節點,即p需要有後繼節點。

時間複雜度o(1)

//刪除指定節點p

bool deletenode

(lnode *p)

欲刪除節點p:

使q指向p的後繼節點:

將後繼節點的值賦給p:

將q節點從鏈中斷開:

釋放q記憶體後

迴圈找到第i個元素,時間複雜度o(n)

此段程式可封裝在前面插入、刪除函式裡

//按位查詢,返回第i個元素

lnode *

getelem

(linklist &l,

int i)

return p;

}

找到資料為e的節點

lnode *

locateelem

(linklist &l,

int e)

/求表的長度

intlength

(linklist &l)

return len;

}

核心是初始化操作,指定節點的後插操作先使用initlist函式定義、初始化乙個單鏈表,再用listinsert函式插入元素,使用迴圈尾插,時間複雜度o(n2),不可取,選擇下面的方法。

增加乙個尾指標,記錄位置。

時間複雜度o(n)

linklist list_tailnsert

(linklist &l)

r->next=

null

;//尾節點指標設為空

return l;

}

對頭節點的後插操作,實現鍊錶的逆置

linklist list_headnsert

(linklist &l)

return l;

}

參考:[王道考研]lin

單鏈表增刪改查

include include include include using namespace std struct node node int x,node next null 帶參初始化 建立煉表頭結點,新增引用因為要改變指標的位址指向 void createlink node head 新增鍊...

單鏈表增刪改查

單鏈表單鍊錶 linked list 由各個記憶體結構通過乙個 next 指標鏈結在一起組成,每乙個內 存結構都存在後繼記憶體結構 鏈尾除外 記憶體結構由資料域和 next 指標域組成。單鏈表實現圖示 解析 data 資料 next 指標,組成乙個單鏈表的記憶體結構 第乙個記憶體結構稱為 鏈頭,最後...

單鏈表 增刪改查

目錄基本面試題 class heronode class singlelinkedlistpublic void add heronode heronode public void addbyorder heronode heronode if temp.next.no heronode.no el...