單鏈表的建立 刪除 反轉 插入 排序操作

2021-10-06 14:35:23 字數 3212 閱讀 9182

​ 在初學鍊錶時很多人會問,什麼是鍊錶,鍊錶怎麼實現,原理是什麼?的確帶著問題學習會讓你變得更快,鍊錶可以簡單理解為老師領著幼兒園小朋友過馬路,他們手拉手牽著一起,老師在最前面領著後面的小朋友,老師就是這個領頭人(鍊錶的頭節點),每乙個小朋友可以看做乙個節點。

/*鍊錶的節點結構定義*/

typedef

struct list_node list_node;

​ 建立鍊錶需要自定義乙個函式,指定煉表頭,應該建立幾個節點,每個節點的資料自行輸入所以進行如下定義。使用whlie語句進行建立幾個節點的判斷,並且對每乙個節點進行動態分配空間,通過scanf輸入資料。當知道有幾個小朋友需要連線老師(頭節點)時就很容易知道,老師的下乙個牽手的應該是乙個小朋友,而最後乙個小朋友沒有東西牽著,所以為null。

int

creat_list

(list_node *head,

int n)

p->next=

null

;//鍊錶的尾部節點下個指向為空,理解最後乙個小朋友沒東西牽著

return0;

}else

}

​ 列印鍊錶實現相對簡單,相當於老師牽著小朋友,讓每個小朋友進行報數,當到最後乙個小朋友時牽著為空氣,報數完畢,所以判斷條件就是當下乙個指標指向為空的時候停止遍歷鍊錶。

/*列印整個鍊錶*/

void

print_list

(list_node *head)

}}

​ 鍊錶插入的函式,指定要插入的鍊錶的頭節點,插入的位置,需要插入的資料。插入的原理如下圖:假設在1號和2號之間需要插入乙個小朋友,首先應該報數,當一號報數完畢後,我們知道了應該在此插入,然後停下操作,先建立乙個節點空間,然後把小朋友(節點資料)放進這個空間,新插入的小朋友應該是一邊被一號牽著,另一邊牽著2號。

/*第乙個引數指定煉表頭,第二引數在哪乙個位置之後插入值*/

void

insert_data

(list_node *head,

int data,

int n)

else

list_node *new_node=

(list_node *

)malloc

(sizeof

(list_node));

new_node->data=data;

new_node->next=p;

//此處對應紅色解釋圖

pre->next=new_node;

head->data++;}

}

​ 刪除某乙個節點,也是需要知道鍊錶的表頭,和刪除第幾個節點,原理和插入類似,如下圖所示:

}​ 刪除整個鍊錶可不是直接free表頭就行了,要乙個個遍歷整個鍊錶,然後記錄前乙個指標的位置進行乙個乙個free,原理和刪除乙個類似,這裡直接上**。

/*對整個鍊錶進行刪除*/

void

delete_list

(list_node *head)

free

(current);}

else

}

​ 這個相對來說難一點,但是理解原理之後還是很容易的,有點類似於排序,但是有點區別。

反轉一步一步的過程應該是這樣,也有其他方法,自己查一下。

head->1->2->3->4->5--------------------------------------原始鍊錶

head->2->1->3->4->5---------------------------------------第一步

head->3->2->1->4->5---------------------------------------第二步

head->4->3->2->1->5---------------------------------------第三步

head->5->4->3->2->1---------------------------------------第四步

也就是相當於,每次把遍歷到的當前資料提到最前面。

/*鍊錶的反轉*/

void

reversal_list

(list_node *head)

}else

}

​ 此次鍊錶的排序使用的是選擇排序,相對簡單,使用冒泡等也能實現,簡單講一下冒泡的原理:

head->1->2->3->4--------------------------------------原始鍊錶

head->4->2->3->1---------------------------------------第一步

head->4->3->2->1---------------------------------------第二步

就是進行先讓第乙個數和之後的每乙個數比較,只要遇到比他大的就和第乙個位置交換資料,然後第乙個位置就是最大的資料,之後讓第二位與之後的每乙個資料比較只要比他大的數就交換位置,…一直這麼結束,排序完成。

/*使用選擇排序*/

void

list_sort

(list_node *head)

s=s->next;

} p=p->next;}}

**持續更新鍊錶的迴圈鍊錶、雙向鍊錶操作*

*

單鏈表插入排序

單鏈表插入排序演算法基本思想是構建乙個新的有序煉表頭結點,並將原來的鍊錶節點依次插入到新建的有序鍊錶中。如下 include stdafx.h include using namespace std struct listnode class solution listnode tmpnext pt...

單鏈表插入排序

include include typedef int elemtype 元素的資料型別 typedef struct lnode linknode 單鏈表結點型別 尾插法建立單鏈表,細節不表 void createlistr linknode l,elemtype a,int n 輸出線性表,細節...

單鏈表插入排序

鍊錶插入排序的基本思想是 在每個物件的結點中增加乙個鏈域link。對於存放於陣列中的一組物件v 1 v 2 v n 若v 1 v 2 v i 1 已經通過鏈結指標link,按其排序碼的大小,從小到大鏈結起來 現在要插入v i i 2,3,n,則必須在前面i 1個鏈結起來的物件當中,循鏈順序檢測比較,...