有乙個遞增非空單鏈表,設計乙個演算法刪除值域重複的結點。比如。
解法一:定義指標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,也就是最低的 和 的...