版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
線性表習(xí)題編程題1編寫一算法,實(shí)現(xiàn)單鏈表的原地置逆。即利用原來的結(jié)點(diǎn)將線性表L=(a1,a2,……,an)變換為:L
=(
an, ……
,
a2,
a1)第2
頁La1a2a3線性表習(xí)題編程題1succ
p標(biāo)志后繼結(jié)點(diǎn)(*succ);修改指針(將*p
在頭結(jié)點(diǎn)之后);重置結(jié)點(diǎn)*p(p重新指向原表中后繼);第3
頁線性表習(xí)題void inverse(
LinkList
&L
){ //
逆置
結(jié)點(diǎn)的單鏈表
Lp
=
L->next;
L->next
=
NULL;while
(
p
!=
NULL
){ succ=p->next;
//succ指向
*p
的后繼在頭結(jié)點(diǎn)之后p->next
=
L->next;L->next
=
p; //
*pp
=
succ;}}第4
頁線性表習(xí)題第5
頁編程題2將兩個(gè)非遞減有序的有序單鏈表la和lb歸并為非遞增的有序表。Typedef
struct LNode
{intstruct
Lnodedata;*next;//數(shù)據(jù)域//指針域}
LNode,
*LinkList;LinkList
la,
lb;//單鏈表的頭指針請用la
和lb
中的結(jié)點(diǎn)合并生成一個(gè)新的非遞增的有序單鏈表lc。合并完成后,原來的la
和lb
成為空鏈表。線性表習(xí)題操作步驟建空表Lc;依次從La
或Lb
中“”元素值較小的4)結(jié)點(diǎn)
到
Lc表中第一個(gè)結(jié)點(diǎn)之前直至其中一個(gè)表變空為止;3)
繼續(xù)將La
或Lb
其中一個(gè)表的剩余結(jié)點(diǎn)插入在Lc
表的表頭結(jié)點(diǎn)之后;La
表和Lb
表的表頭結(jié)點(diǎn)。第6
頁線性表習(xí)題void
union
(
LinkList&
Lc,
LinkList&
La,
LinkList&
Lb
){//將非遞減的有序表La
和Lb歸并為非遞增的//有序表Lc,歸并之后,La和Lb表不再存在。//
上述三個(gè)表均為
結(jié)點(diǎn)的單鏈表,Lc
表//中的結(jié)點(diǎn)即為原
La
或Lb
表中的結(jié)點(diǎn)。Lc
=
new
LNode;
Lc->next
=
NULL;pa=La->next; pb=Lb->next;
//初始化……
……
//歸并dele
a;
dele
b;
//}//unionLa
和Lb的頭結(jié)點(diǎn)第7
頁線性表習(xí)題while
(
pa
!=
NULL
||
pb
!=
NULL
){
if (
pa
==NULL
){
q
=
pb; pb
=
pb->next;
}elseif (
pb
==NULL
){
q
=
pa; pa
=
pa->next;}else
if
(
pa->data
<=
pb->data
){
q
=
pa; pa
=
pa->next;}else{
q
=
pb; pb
=
pb->next;
}q->next
=
Lc->next;
//Lc->next
=
q;}第8
頁線性表習(xí)題已知一帶有表頭結(jié)點(diǎn)的單鏈表,結(jié)點(diǎn)結(jié)構(gòu)為如下:第9
頁假設(shè)該鏈表只給出了頭指針
list。在不改變鏈表的前提下,請?jiān)O(shè)計(jì)一個(gè)盡可能高效的算法,查找鏈表中倒數(shù)第k個(gè)位置上的結(jié)點(diǎn)(k為正整數(shù))。若查找成功,輸出該結(jié)點(diǎn)的data的值,并返回1;否則,返回
0。datalink線性表習(xí)題問題關(guān)鍵如何盡可能高效?常規(guī)算法對鏈表進(jìn)行第一遍掃描,計(jì)算出鏈表的長度
len,然后進(jìn)行第二遍掃描,計(jì)數(shù)到len-k的位置即為需要查找的倒數(shù)第k
個(gè)元素。算法時(shí)間復(fù)雜度:O(n)。問題:是否有更高效的算法能否只進(jìn)行一遍掃描即可完成?第10
頁線性表習(xí)題算法的基本設(shè)計(jì)思想假設(shè)鏈表的最后一個(gè)結(jié)點(diǎn)為倒數(shù)第1
個(gè)結(jié)點(diǎn)。對鏈表進(jìn)行掃描:用指針p
和q
分別指向兩個(gè)結(jié)點(diǎn),且保持指針p
和指針q
之間的“距離”(包含的結(jié)點(diǎn)數(shù))為k,當(dāng)p
指向最后一個(gè)結(jié)點(diǎn)時(shí),q
指向的就是倒數(shù)第k
個(gè)結(jié)點(diǎn)。第11
頁線性表習(xí)題算法的詳細(xì)實(shí)現(xiàn)步驟假表頭指針為list,兩個(gè)指針變量p
和q:
距離計(jì)數(shù)器count
=0;p=q=list->link,指向鏈表第一個(gè)數(shù)據(jù)結(jié)點(diǎn);若p
非空,則執(zhí)行③和④;否則,轉(zhuǎn)⑤;
如果count
小于k,則count
=count
+1;否則q
指向下一個(gè)結(jié)點(diǎn);p
指向下一個(gè)結(jié)點(diǎn),轉(zhuǎn)步驟②;
若count
等于k,則查找成功,輸出q
結(jié)點(diǎn)的data值,返回1;否則,返回0。結(jié)束。第12
頁線性表習(xí)題第13
頁int SearchRevk(
pLinkList
list, intk)intcount; /*
距離計(jì)數(shù)器*//*
p和q指向第一個(gè)數(shù)據(jù)結(jié)點(diǎn)*/{
pLinkList p,
q;p=q
=
list->link;count
=
0;while
(
p!=
NULL
){
if
(count<k)
count++; /*
計(jì)數(shù)器+1
*/elsep
=p->
link;q=q->link; /*
q指向下一結(jié)點(diǎn)*//*
p指向下一個(gè)結(jié)點(diǎn)*/}if
(count==k) /*查找成功
*/{
printf("%d\n",
q->data); return
1;}else
return
0; /*
查找失敗*/}線性表習(xí)題求循環(huán)小數(shù)對于任意的真分?jǐn)?shù)N/M
(0<N<M<500),均可以求出對應(yīng)的小數(shù)。如果采用鏈表表示各個(gè)小數(shù),對于循環(huán)節(jié)采用循環(huán)鏈表表示。head11/8=
0.125形式2∧5.
.0.
6125
(循環(huán)節(jié)125)形式5261head第14
頁線性表習(xí)題算法設(shè)計(jì)模擬手工計(jì)算過程。關(guān)鍵:記錄計(jì)算過程中的余數(shù)和對應(yīng)的商,一旦發(fā)現(xiàn)余數(shù)出現(xiàn)重復(fù),則找到循環(huán)節(jié)。算法實(shí)現(xiàn)動(dòng)態(tài)申請有M個(gè)元素的指針數(shù)組:以每次求得的余數(shù)作為下標(biāo),對應(yīng)的數(shù)組元素保存該余數(shù)對應(yīng)的商。第15
頁線性表習(xí)題第16
頁void
change(int
n,
int
m,
NODE
*
head
){ NODE
*
*
array; NODE
*
p=head; intk;array=(NODE
**)malloc(sizeof(NODE
*
)*
m);
for(k=0;k<m;k++)
//建立保存余數(shù)的數(shù)組array[k] =NULL;while
(n!=0)
//余數(shù)不為0,則繼續(xù)循環(huán){
if
(n*10%m==0)
//若能夠整除,則處理,結(jié)束{
p->next=
(NODE
*)
malloc(
sizeof(NODE)
);p->next->data
=
n*10
/m;p->next->next
=
NULL;n=
0;}else
{
處理一般情況}}}線性表習(xí)題第17
頁else{
if
(array[n]==NULL)
//若該余數(shù)第一次出現(xiàn){
array[n]=p->next=(NODE
*)malloc(sizeof(NODE));
p->next->data=n
*
10/m;
//保存商n=n*
10%m;
//余數(shù)擴(kuò)大10倍p
=
p->next;}else
//該余數(shù)不是第一次出現(xiàn),則發(fā)現(xiàn)循環(huán)節(jié){
p->next=array[n];
//建立環(huán)n
=0;}}線性表習(xí)題求循環(huán)節(jié)編寫一個(gè)盡可能高效的查找循環(huán)節(jié)起始點(diǎn)的函數(shù):NODE
*
find(
NODE
*
head)。函數(shù)的返回值為循環(huán)節(jié)的起點(diǎn)(即圖中的指針p)。head11/8=
0.125形式2∧5.
.0.
6125
(循環(huán)節(jié)125)形式5261head第18
頁線性表習(xí)題第19
頁算法設(shè)計(jì)關(guān)鍵是要找出高效算法。判斷是否有環(huán)。在確認(rèn)有環(huán)的情況下,找到環(huán)的開始。線性表習(xí)題第20
頁NODE
*
find(
NODE
*
head,
int
*
n
){ int
count=0,
ring; NODE
*
p,
*q;p
=
q=
head->next;while
(
p!=NULL&&
q!=NULL){ count
++;//p指針一次走一步p
=
p->next;q
=
q->next;if
(q!=NULL
)if
(p==q)//q指針一次走兩步q=q->next;break;
//找到重合點(diǎn)則退出}if
(
q
==
NULL)//如果不存在環(huán)則返回{ *n
=0;return
NULL;}線性表習(xí)題第21
頁ring
=
1;while
(q->next
!=p
)//求環(huán)長{ q
=
q->next; ring
++;}count
=
0; q
=
p
=
head->next;while(count<ring)
//求環(huán)的起始點(diǎn){ count
++; p
=
p->next;}while
(p!=q){ p
=
p->next; q
=
q->next;}*n
=ring;returnp;}線性表習(xí)題將n(n>1)個(gè)整數(shù)存放到一維數(shù)組R中。試設(shè)計(jì)一個(gè)在時(shí)間和空間兩方面都盡可能高效的算法,將R
中保有的序列循環(huán)左移p(0﹤p﹤n)個(gè)位置,即將R中的數(shù)據(jù)由:(x0,
x1,…,xp-1,xp,xp+1,…,xn-1)變換為:(xp,xp+1,……,xn-1,x0,x1,……,xp-1)第22
頁線性表習(xí)題問題關(guān)鍵如何盡可能高效?常規(guī)算法一般的循環(huán)左移算法的時(shí)間復(fù)雜度肯定是比較大的。的法:采用一個(gè)變量作為輔助空間,每次移動(dòng)一位,反復(fù)進(jìn)行移動(dòng)K次,則時(shí)間復(fù)雜度為O(
n*k)。另一種算法是采用p
位輔助空間,空間復(fù)雜度O(
p),時(shí)間復(fù)雜度O(
n+p)。第23
頁線性表習(xí)題第24
頁基本設(shè)計(jì)思想先將前面p個(gè)元素置反,再將后邊n-p元素置反,最后整體置反。參考程序void
leftShift(
int
r[
],
int
n,
int
p){ if
(
p>0
&&
p<n
){
rever(r,
0,
n-1);rever(r,
0,
n-p-1);rever(r,
n-p,
n-1);}}線性表習(xí)題void
rever(
int
a[
],
int
left,
int
right
){
int k=lift,
j=right,
temp;while
(
k
<
j
){ temp
=
r[k];r[k]
=
r[j];r[j]
=
temp;k++;j--;}}算法時(shí)間復(fù)雜度為O(n),空間復(fù)雜度為O(1)。第25
頁線性表習(xí)題第26
頁本題曾經(jīng)出現(xiàn)在《編程珠璣》中?;舅枷霃牡趎個(gè)元素開始移位,將它直接移到第n-p位,然后再對第n-p位操作,依次類推n-2p,n-3p.....;上述移位操作經(jīng)過一定次數(shù)后,必定又重新對第n位操作,此時(shí)完成了一次循環(huán);例如,當(dāng)n=6,p=2時(shí),先將第6位移到第4
位,第4
位移到第2位,第2位移到第
6
位,循環(huán)一次,此時(shí)一次循環(huán)未能將數(shù)組移位完畢。當(dāng)n=6,p=5
時(shí),6->1;1->2;
2->3;3->4;4->5;5->6;此時(shí)一次循環(huán)即將整個(gè)數(shù)組移位完畢。線性表習(xí)題基本思想當(dāng)一次循環(huán)不能將整個(gè)數(shù)組完全移位時(shí),可從第n-1位,再進(jìn)行第(1)步的操作;如果還沒移完,繼續(xù)從第n-2位開始循環(huán),依次類推。現(xiàn)在的關(guān)鍵之處是移動(dòng)需要多少次循環(huán)。由數(shù)論性質(zhì)可知:a.當(dāng)n
和p的最大公約數(shù)(記為(n,p))為1時(shí),一次循環(huán)必定將整個(gè)數(shù)組移動(dòng)完畢。b.
當(dāng)
n
和
p
的最大公約數(shù)(記為
(
n,
p
))大于
1時(shí),則需要的循環(huán)次數(shù)就是
(n,p)!如
n=6,p=2,
(6,
2)
=2,第一次循環(huán)從第
6
位開始,第二次循環(huán)從第5
位開始,兩次后完成!第27
頁線性表習(xí)題定義:一個(gè)長度為L(L≥1)的升序序列S,處在第L/2
個(gè)位置的數(shù)稱為S的中位數(shù)。
例如,若序列S1=(11,13,15,17,19),則S1
的中位數(shù)是15。兩個(gè)序列的中位數(shù)是含它們所有元素的升序
序列的中位數(shù)。例如,若S2=(2,4,6,8,20),則S1
和S2
的中位數(shù)是11?,F(xiàn)有兩個(gè)等長升序序列A和B,設(shè)計(jì)一個(gè)在時(shí)間和空間兩方面都盡可能高效的算法,找出兩個(gè)序列A
和B
的中位數(shù)。第28
頁線性表習(xí)題較小者即為所求的中位數(shù)。第29
頁基本設(shè)計(jì)思想分別求兩個(gè)升序序列A、B的中位數(shù),設(shè)為a和b。求中位數(shù)的過程如下:若a=b,則a或b即為所求的中位數(shù),結(jié)束;若a<b,則舍棄A中較小一半,同時(shí)舍棄B中較大一半,要求兩次舍棄的元素個(gè)數(shù)相同。若a>b,則舍棄A中較大一半,同時(shí)舍棄B中較小一半,要求兩次舍棄的元素個(gè)數(shù)相同。在保留的兩個(gè)升序序列中,重復(fù)上述過程,直到兩個(gè)序列中均只含1
個(gè)元素時(shí)為止,則線性表習(xí)題}第30
頁基本設(shè)計(jì)思想int
M_Search
(intA[],
intB[],intn){ int
start1,
end1,
mid1,
start2,
end2,
mid2;start1=
0;end1=
n-1; start2
=
0;
end2=
n-1;while (
start1!=
end1
||start2
!=end2
){ mid1
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《安全感悟分享》課件
- 《職業(yè)適應(yīng)與發(fā)展》課件
- 《生產(chǎn)安全事故應(yīng)急》課件
- 2024教師發(fā)言稿(34篇)
- 藝術(shù)與人生和社會(huì)的關(guān)系
- 單位管理制度匯編大全【人事管理】
- 單位管理制度分享合集【人員管理篇】十篇
- 單位管理制度分享大合集【人員管理】十篇
- 單位管理制度范文大合集【員工管理篇】十篇
- 單位管理制度呈現(xiàn)大全【人員管理】
- 安全生產(chǎn)培訓(xùn)法律法規(guī)
- 廣東省廣州市2021-2022學(xué)年高二上學(xué)期期末五校聯(lián)考生物試題
- 2024年領(lǐng)導(dǎo)干部任前廉政知識(shí)考試測試題庫及答案
- 2023-2024學(xué)年浙江省寧波市鎮(zhèn)海區(qū)四年級(上)期末數(shù)學(xué)試卷
- 舞蹈演出編導(dǎo)排練合同模板
- 融資合作法律意見
- 污水泵站運(yùn)營維護(hù)管理方案
- 湖北省武漢市洪山區(qū)2023-2024學(xué)年六年級上學(xué)期語文期末試卷(含答案)
- 中醫(yī)辨證-八綱辨證(中醫(yī)學(xué)課件)
- 冠脈介入進(jìn)修匯報(bào)
- 蔣詩萌小品《誰殺死了周日》臺(tái)詞完整版
評論
0/150
提交評論