資料結構學習筆記(七)鍊錶演算法題 續

2021-09-20 06:08:10 字數 1505 閱讀 1620

有乙個遞增非空單鏈表,設計乙個演算法刪除值域重複的結點。比如。

解法一:定義指標p指向起始結點。將p所指當前結點值域和其直接後繼結點值域比較。如果當前結點值域等於後繼結點值域,刪除後繼結點;否則p指向後繼結點,重複以上過程,直到p的後繼結點為空。

本題**如下:

void delsl1(lnode *&l) 

else

p=p->next;

}}

解法二:依次將原序列中每個連續相等子串行的第乙個元素移動到表的前端,將剩餘的

元素刪除即可,即下圖所示過程。

令p指向起始將結點。q從p的後繼結點開始掃瞄,q每來到乙個新結點的時候進行檢測:當q->data等於p->data的時候,什麼也不做,q繼續往後走;當兩者不相等的時候,p往後走乙個位置,然後用q->data取代p->data。之後q繼續往後掃瞄,重複以上過程。當q為空的時候,釋放從p之後的所有結點空間。

void delsl2(lnode *&l) 

}q = p->next;

p->next = null;

while(q != null)

}free(r);

}

設計乙個演算法刪除單鏈表l(有頭結點)中的乙個最小值結點。

用p從頭至尾掃瞄鍊錶,pre指向*p結點的前驅,用minp儲存值最小的結點指標,minpre指向minp的前驅。一邊掃瞄,一邊比較,將最小值結點放到minp中。

**如下:

void delminnode(lnode *&l)

pre = p;

p = p->next;

}minpre->next = minp->next; //刪除*minp結點。

free(minp);

}

有乙個線性表,採用帶頭結點的單鏈表l來儲存。設計乙個演算法將其逆置。要求不能建立新結點,只能通過表中已有結點的重新組合來完成。

在前邊講過的演算法基礎中,提到過關與逆序的問題,那就是鍊錶建立的頭插法。頭插法完成後,鍊錶中的元素順序和原陣列中元素的順序相反。這裡我們可以將l中的元素作為逆轉後l的元素**,即將l->next設定為空,然後將頭結點後的一串結點用頭插法逐個插入l中,這樣新的l中的元素順序正好是逆序的。

**如下:

void reversel(lnode *&l) 

}

設計乙個演算法將乙個頭結點為a的單鏈表(其資料域為整數)分解成兩個單鏈表a

用指標p從頭至尾掃瞄a鍊錶,當發現結點data域為偶數的結點則取下,插入鍊錶b中。要用頭插法是用尾插法呢,因為題目要求保持原來資料元素的相對順序,所以要用尾插法來建立b鍊錶。

**如下:

void split2(lnode *&a,lnode *&b) 

p = p->next; //p後移乙個位置,即開始檢查下乙個結點。

}}

資料結構學習筆記(六)鍊錶演算法題

設順序錶用陣列a表示,表中元素儲存在陣列下標1 m n的範圍內,前m個元素遞增有序,後n個元素遞增有序,設計乙個演算法,使得整個順序表有序。1 給出演算法的基本設計思想。2 根據設計思想,採用c或c 語言描述演算法,關鍵之處給出注釋。3 說明你所設計演算法的時間複雜度和空間複雜度。1 演算法基本設計...

資料結構學習筆記(六)鍊錶演算法題

假期結束,看點題目。設順序錶用陣列a表示,表中元素儲存在陣列下標1 m n的範圍內,前m個元素遞增有序,後n個元素遞增有序,設計乙個演算法,使得整個順序表有序。1 給出演算法的基本設計思想。2 根據設計思想,採用c或c 語言描述演算法,關鍵之處給出注釋。3 說明你所設計演算法的時間複雜度和空間複雜度...

資料結構學習筆記 鍊錶

表示式的計算 表示式的計算涉及到棧的操作 對於表示式 a b c d e f 演算法 用到兩個棧,分別是符號棧和運算元棧。輸入表示式時,為了表示表示式輸入完畢,在表示式的最後加上 號,也就是說輸入的表示式為 a b c d e f 首先設定各個符號的優先順序,和 的優先順序為0,也就是最低的 和 的...