關於單鏈表的一些基本操作,以下為基本思路**首先看一張直觀圖
鍊錶的結構體定義如下(為簡便,這裡的elemtype採用int):
//單鏈表
typedef
struct lnode linklist;
接下來肯定就是建立鍊錶,而目前建立單鏈表分為兩種方式,分別是"頭插法"與"尾插法",首先看圖示:
清楚明白:
我們對比來看節點的插入:
//頭插法核心**
s =(linklist *
)malloc
(sizeof
(linklist));
s->data = a[i]
;s->next = l->next;
//將s插入到下一節點之前
l->next = s;
//尾插法核心**
s =(linklist *
)malloc
(sizeof
(linklist));
s->data = a[i]
;r->next = s;
//將s插入到r之後
r = s;
那麼寫成函式,就是如下所示:
/**
* 頭插法建立單鏈表
* @param a 陣列元素,對應data
* @param n 鍊錶長度(除去頭結點)
*/void
createlistbyhead
(linklist *l,
const
int a,
int n)
}/**
* 尾插法建立單鏈表
* @param a 陣列元素,對應data
* @param n 鍊錶長度(除去頭結點)
*/void
createlistbytail
(linklist *l,
const
int a,
int n)
r->next =
null
;//尾節點next域置為空
}
那麼接下來的集中基本操作方法也就不再贅述,其實都是一些對鍊錶的操作,指標的移動,臨界條件的判斷,我也都寫在注釋中了,尤其是第乙個delete方法寫的最詳細,可以仔細看一下哦,為了直觀一點,我也附上**(編譯環境clion)~按照邏輯序號刪除某節點
這裡也要注意是否會斷鏈的問題,free()不要釋放錯了,否則會有錯誤
* 刪除單鏈表中的第i個元素
* @param l 鍊錶
* @param i 第i個元素
* @return 程式執行完畢狀態
*/int
listdelete
(linklist *l,
int i)
if(p ==
null
)return error;
else
}在邏輯位置之後插入節點
這裡注意,插入操作遵循***先右後左***原則,否則會斷鏈,如圖:
* 在邏輯位置後插入節點
* @param l 傳入鍊錶
* @param i 邏輯位置
* @param e 插入資料
* @return 插入成功返回1,失敗返回0
*/int
listinsert
(linklist *l,
int i,
int e)
if(p ==
null
)//如果為空返回錯誤值
return error;
else
}按照元素值查詢特定節點
這裡預設鍊錶中的元素是唯一的,如果想要查詢不唯一的數值,就需要大家去拓展了,也不是很難,可以採用將查到的資料邏輯序號放到陣列中返回等等等等方法~
* 按照元素值查詢特定節點並返回邏輯序號
* @param l 傳入單鏈表
* @param e 傳入特定元素
* @return 沒有找到返回0,找到返回邏輯序號i
*/intfindelement
(linklist *l,
int e)
if(s ==
null
)return error;
else
return i;
}輸出鍊錶
* 輸出單鏈表
*/void
displist
(linklist *l)
printf
("%d"
, l->data)
;}最後附上測試用的main函式,為了方便就直接用陣列賦值了
#include
資料結構 單鏈表 基礎
在實現單鏈表的基本功能後 單鏈表的幾個基本問題 1.比較順序表和煉表的優缺點,說說它們分別在什麼場景下使用?順序表 物理位置相鄰 優點 在一段記憶體中用陣列連續存放,所以方便隨機查詢元素。缺點 動態開闢,容易造成記憶體浪費,需要乙個元素,開闢過多。前面新增元素時,要逐個挪動後面的每個元素,較麻煩。場...
資料結構基礎之單鏈表
資料結構基礎之單鏈表 對單鏈表的建立,插入,刪除,逆序,列印元素做乙個小小的總結,不過我不覺得這些東西在具體的工作後到底能發揮什麼作用,因為強大的stl已經把這些都做好了,我們只需要明白在什麼場合使用哪乙個stl就可以了。鍊錶有乙個資料域,有乙個指標域,它的操作其實就是對指標域的操作,無非是指來指去...
資料結構基礎之單鏈表
資料結構基礎之單鏈表 對單鏈表的建立,插入,刪除,逆序,列印元素做乙個小小的總結,不過我不覺得這些東西在具體的工作後到底能發揮什麼作用,因為強大的stl已經把這些都做好了,我們只需要明白在什麼場合使用哪乙個stl就可以了。鍊錶有乙個資料域,有乙個指標域,它的操作其實就是對指標域的操作,無非是指來指去...