今天主要來講一講單鏈表的插入與刪除操作的步驟和演算法解釋。這是單鏈表最基本的操作但是也是最重要的基礎之一,有些地方還比較容易出錯。下面我就結合源**在上面加上注釋來解釋每一步的作用。
**一、單鏈表的插入操作**
s->next=p->next; //把結點p的後繼作為結點s的後繼;
p->next=s; //把結點s作為結點p的後繼;
注意這兩個語句的順序不能調換不能調換不能調換!!!為什麼呢?如果調換①和②的順序,那麼插入操作就無法完成,並且會丟失ai結點的位址以及ai及其後面所有結點的資訊。
3、下面演示插入操作的演算法:
bool listinsert_l(linklist &l,int i,elemtype e)
//②尋找第i-1個結點並讓p指向此結點
if(j!=i-
1) return
false; //③若i的位置不合理則報錯
if((s=(lnode*)malloc(sizeof(lnode)))==
null) exit(1); //④查詢成功,在系統中生成乙個空結點s;
s->
data
=e; //⑤將資料元素e複製給s->data;
s->next=p->next;p->next=s; //⑥插入操作(關鍵語句)
return
true; //⑦返回成功;
}
二、單鏈表的刪除操作
1、刪除圖示(出處同上)
2、刪除操作和插入類似,在刪除乙個結點時,不需要移動元素,僅需要修改相應的指標鏈結,改變其前驅和後繼的關係即可。
主要操作語句為:
p->next=q->next; //結點q的後繼成為結點p的後繼
e=q->
data; //將被刪除的元素的值賦給e
free(q); //釋放被刪除結點的空間
3、下面演示刪除元素的演算法,注釋含有步驟解釋。
bool listinsert_l(linklist &l,int i,elemtype e)
//②尋找第i-1個結點並讓p指向此結點
if(j!=i-
1) return
false; //③若i的位置不合理則報錯
q=p->next; //④若查詢成功,q指向其後繼
p->next=p->next; //⑤結點q的後繼成為結點p的後繼
e=q->
data;
free(q); //⑥將被刪除的元素的值賦給e,釋放被刪除結點的空間
return
true; //⑦返回成功;
} //linkdelete_l
三、關於順序儲存與鏈式儲存中插入刪除操作的效率pk
1、無論是單鏈表的插入操作還是刪除操作,都是由兩部分組成的:一是遍歷查詢第i個元素,二是實現插入或刪除操作。
就整個演算法而言,他們的時間複雜度都是o(n),這樣來看的話,再不知道要找的第i個元素所處的位置時,單鏈表的插入刪除操作和順序儲存是沒有什麼優越性的。
但是!如果知道要插入或者刪除的元素的位置時,鏈式儲存就表現出它的優越性了。假如我們要在a10與a11之間插入10個元素,那麼順序儲存每插入乙個元素後面的元素就要移動一次位置,每次都是o(n)。而鏈式儲存,只需要第一次時找到要插入的那個位置,後面的就只是賦值移動指標而已,時間複雜度為o(1)。
因此,可以得出乙個結論:對於插入或者刪除操作越頻繁的操作,單鏈表的效率優勢就越是明顯。
資料結構與演算法之單鏈表
include include define maxsize 100 typedef int elemtype typedef struct lnode linknode void createlistf linknode l,elemtype a,int n 頭插法建立單鏈表 void initl...
資料結構與演算法之單鏈表
鍊錶的實現 實現單鏈表的 構建 資料新增 資料刪除 返回元素所在位置 資料查詢 返回元素所在的位置 的演算法設計 鍊錶的實現 實現單鏈表的 構建 資料新增 資料刪除 返回元素所在位置 資料查詢 返回元素所在的位置 的演算法設計 include include using namespace std ...
資料結構基礎之單鏈表
資料結構基礎之單鏈表 對單鏈表的建立,插入,刪除,逆序,列印元素做乙個小小的總結,不過我不覺得這些東西在具體的工作後到底能發揮什麼作用,因為強大的stl已經把這些都做好了,我們只需要明白在什麼場合使用哪乙個stl就可以了。鍊錶有乙個資料域,有乙個指標域,它的操作其實就是對指標域的操作,無非是指來指去...