C語言 單鏈表相關操作

2021-10-25 20:17:36 字數 2180 閱讀 8689

結構體定義:

struct link_list

;typedef link_list* list;

將資料封裝成節點:

資料要想放入鍊錶中必須將資料做成節點,由於很多操作都需要所以單獨寫成乙個函式,這裡只拿int型別舉例,其他資料型別差別不大

list create_node

(int data)

修改遍歷及查詢

總結設定乙個不存放有意義資料的頭節點用於頭插,後輸入的資料排在表前端,頭節點不動,每次將生成的新節點插入頭節點後。

list head_create()

return head;

}

初始化head,tail為null,head用於儲存第乙個節點即表頭位址,tail用於儲存當前表末最後乙個元素的位址,tail在建立過程中會被不斷地更新,類似於臨時變數。

list tail_create()

return head;

}

往煉表中插入資料只需知道煉表表頭位址,待插入資料,以及待插入位置即可,在函式內用前後指標的方式遍歷鍊錶,前指標始終在後指標前一步,當遍歷到待插入位置時,也就知道了待插入位置前後的節點位址,分別讓後指標連線到新節點,新節點連線到前指標就可以了。例外的是當待插入位置就是表頭時,則只需要將新生成節點連線到表頭並將頭節點更新為新生成的節點即可。

void

insert

(list* head,

int pos,

int n)

else

//發現待插入位置即跳出迴圈後,將新節點node插在post和pre之間

post-

>next = node;

node-

>next = pre;

}}

刪除指定位置的節點和插入很相似,也需要知道待刪除位置的前後兩處節點位址才能完成,同樣用前後指標的遍歷,直到發現帶查詢的位置後跳出迴圈,將前指標指向的節點連線到後指標的下乙個節點,即跳過前指標指向的節點,前指標指向的節點就被刪除了。同樣的,如果待刪除的節點就是表頭的話只需要將頭節點更新為原表的第二個節點,第乙個節點失去了與整個鍊錶的連繫,也就被刪除了,但是需要警惕該鍊錶是不是帶無效頭結點。

void

delete

(list* head,

int pos)

while

(pre)

//待刪除的節點即為pre,讓post指向pre的下乙個節點,pre在鍊錶中已丟失前後聯絡即被刪除

post-

>next = pre-

>next;

}

鍊錶逆置有很多種思路,可以逆序遍歷原表同時將元素去除放在新錶中,也可以不使用多餘的空間在原表上就地逆置,這裡說的是後者。

大致思路就是遍歷原表的同時將該節點到後一節點的連線斷開,改為連線到前一節點。仍然用前後指標的思想,前指標和後指標同時向前並將前指標指向的節點連線到後指標指向的節點,這樣當前指標踏空(即遍歷到null)的時候後指標就成為了新的頭節點。

void

reverse

(list* head)

*head = new_head;

//更改原表的頭節點為新的頭節點

}

void

print_list

(list head)

cout<}

查詢可以分為根據下標求對應元素和根據元素求元素對應的下標,這裡拿後者舉例,返回鍊錶中第乙個與帶查詢元素相同的節點的下標,很好理解不需要過多解釋。

int

find

(list head,

int number)

head = head-

>next;

index++;}

return-1

;}

鍊錶之於陣列各有各的優點,鍊錶在大規模刪除插入以及未知輸入規模時更適合,陣列則強在能快速通過下標查詢。陣列自不必說,鍊錶在很多語言中都已經封裝的非常完善,但是通過學習這些底層的資料結構可以更深入理解對記憶體的操作,知其然&&知其所以然可以走得更遠。這也是我寫的第一篇文章,以後看到可能會貽笑大方,但凡是貴在堅持,希望能一起進步。

單鏈表相關操作

這是自己寫的最長的一次 了 在機房敲了一天。以前一直用list來水鍊錶的題 這次終於體會到痛苦了 include include include include include include using namespace std typedef struct node 單鏈表 s,list vo...

單鏈表相關操作

typedef int sltdatatype typedef struct slistnode slistnode typedef struct slist slist 通過畫圖來理解無頭單向非迴圈鍊錶的相關操作 其中操作在圖中用簡易偽 描述 先將要插入的結點指向第乙個結點,然後頭指標指向插入的結...

單鏈表相關演算法

include include using namespace std typedef int elemtype typedef struct node nodetype nodetype create s next null return head void dis nodetype head w...