王道1 2章重點演算法題

2021-10-09 21:44:04 字數 2964 閱讀 1164

#include

#include

#include

using

namespace std;

#define maxsize 20

//順序表

typedef

struct

sqlist;

//鍊錶

typedef

struct lnode

*linklist, lnode;

//初始化

void

init_sqist

(sqlist& l)

void

init_linklist

(linklist head)

//題目:兩個順序表a,b(有序遞增),合成乙個順序表到a,且不設新的順序表儲存空間

bool

merge

(sqlist &a,sqlist b)

else}if

(i ==-1

)}a.length = a.length + b.length;

return

true;}

//題目:設有乙個表頭結點指標為h的單鏈表,設計演算法,通過一次遍歷將鍊錶中的所有結點鏈方向逆轉

//單鏈表逆置

linklist reverse_link

(linklist &head)

}//順序表逆置

void

reverse_sqlist

(sqlist &l)

}//題目:對長度為n的順序表l,編寫乙個時間複雜度為o(n)空間複雜度為o(1)的演算法,該演算法刪除線性表中所有值為x的資料元素

void

delete_repeat

(sqlist &l,

int x)

else

} l.length = l.length - count;

}//題目:從有順序表中刪除值重複的元素,使表中所有元素的值均不同

void

del_same

(sqlist&l)

else}}

//鍊錶

//題目:兩個整數序列為a:a1,a2,a3,a4,...am和b=b1,b2,b3.....bn,已經存入兩個單鏈表中,設計乙個演算法判斷序列b是序列a的連續子串行

bool

is_include

(linklist a,linklist b)

else}if

(pb ==

null

)return

true

;else

return

false;}

//題目:設有乙個帶頭結點的迴圈單鏈表,其結點值均為正整數,設計乙個演算法,反覆找出單鏈表中結點值最小的結點並輸出,然後將該節點從中刪除,直到單鏈表為空為止,再刪除表頭結點

void

del_orderly

(linklist &head)

else

} cout << min-

>data;

premin-

>next = min-

>next;

free

(min);}

free

(head);}

//題目:將乙個帶有頭結點的但鍊錶a分解為兩個帶頭結點的單鏈表a,和b,使得表中含有原來序號為奇數的元素,而b表中含有原表中序號為偶數的元素,且保持相對順序不變

void

divide_odd

(linklist& a, linklist& b)

r->next =

null;}

}//題目:給定乙個帶表頭結點的單鏈表,設head為頭指標,試寫出演算法:按遞增次序輸出單鏈表中各個結點的資料元素,並釋放結點所佔的空間(不允許使用陣列)

void

del_increase

(linklist &head)

p = pre-

>next;

pre-

>next = p-

>next;

free

(p);

}free

(head);}

//題目:假設有兩個按元素值遞增次序排列的線性表,均以單鏈表形式儲存,請編寫演算法將這兩個單鏈表歸併為乙個按元素值遞減次序排列的單鏈表,並要求利用原來的兩個單鏈表的結點存放歸併後的單鏈表

void

merge_desc

(linklist &a,linklist&b)

else

}while

(p)while

(q)}

//題目:設線性表,l(a1,a2,a3,...,an-2,an-1,an)採用帶頭結點的單鏈表儲存,設計乙個空間複雜度為o(1)且時間上盡可能高效的演算法,重新排列高階的演算法,重新排列l中的各個節點,得到線性表l(a1,an,a2,an-1,a3,an-2...)

void

change_list

(linklist&head)

} linklist b = a-

>next;

a->next =

null

;//轉置b

linklist s = b-

>next;

linklist r = s;

b->next =

null

;while

(s)//二合一

a = head-

>next;

b = b-

>next;

r = b;

b->next =

null

;free

(b);

while

(a&&b)

}void

printsqlist

(sqlist l)

printf

("\n");

}int

main()

重點演算法解疑 穿越叢林

對mlmap 和move ap 的理解 有沒有感覺到我的系列文件的每一篇都是在講二個相關或相似的函式,這是一種巧合,作者的書中每篇都恰好用 到了二個這樣的函式,這二個函式可以涵蓋那一章的整體的知識體系,對那一章的理解只要理解了這二個函式就差不多了.mlmap 顧名思義就是 move link map...

程式設計練習 鍊錶必考重點演算法

一 單鏈表反轉 linklist reserve l linklist l 上面這一種是 不算表頭的 表頭里沒有資料 下面這一種是表頭帶資料,表頭也要丟到最後 listnode reverselist listnode phead return preversehead 二 判斷單鏈表是否有環 bo...

面試複試重點 演算法與資料結構

1.演算法的幾個特徵是什麼。2.演算法複雜性的定義。大o 小o分別表示的含義。3.遞迴演算法的定義 遞迴演算法的兩要素。4.分治演算法的思想,經典的分治演算法 全排列 二分搜尋 歸併排序 快速排序 線性時間選擇 最接近點對問題 5.動態規劃演算法解題框架,動態規劃演算法的兩個要素是什麼?備忘錄方法是...