




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
線性表習(xí)題編程題1編寫一算法,實現(xiàn)單鏈表的原地置逆。即利用原來的結(jié)點將線性表L=(a1,a2,……,an)變換為:L
=(
an, ……
,
a2,
a1)第2
頁La1a2a3線性表習(xí)題編程題1succ
p標(biāo)志后繼結(jié)點(*succ);修改指針(將*p
在頭結(jié)點之后);重置結(jié)點*p(p重新指向原表中后繼);第3
頁線性表習(xí)題void inverse(
LinkList
&L
){ //
逆置
結(jié)點的單鏈表
Lp
=
L->next;
L->next
=
NULL;while
(
p
!=
NULL
){ succ=p->next;
//succ指向
*p
的后繼在頭結(jié)點之后p->next
=
L->next;L->next
=
p; //
*pp
=
succ;}}第4
頁線性表習(xí)題第5
頁編程題2將兩個非遞減有序的有序單鏈表la和lb歸并為非遞增的有序表。Typedef
struct LNode
{intstruct
Lnodedata;*next;//數(shù)據(jù)域//指針域}
LNode,
*LinkList;LinkList
la,
lb;//單鏈表的頭指針請用la
和lb
中的結(jié)點合并生成一個新的非遞增的有序單鏈表lc。合并完成后,原來的la
和lb
成為空鏈表。線性表習(xí)題操作步驟建空表Lc;依次從La
或Lb
中“”元素值較小的4)結(jié)點
到
Lc表中第一個結(jié)點之前直至其中一個表變空為止;3)
繼續(xù)將La
或Lb
其中一個表的剩余結(jié)點插入在Lc
表的表頭結(jié)點之后;La
表和Lb
表的表頭結(jié)點。第6
頁線性表習(xí)題void
union
(
LinkList&
Lc,
LinkList&
La,
LinkList&
Lb
){//將非遞減的有序表La
和Lb歸并為非遞增的//有序表Lc,歸并之后,La和Lb表不再存在。//
上述三個表均為
結(jié)點的單鏈表,Lc
表//中的結(jié)點即為原
La
或Lb
表中的結(jié)點。Lc
=
new
LNode;
Lc->next
=
NULL;pa=La->next; pb=Lb->next;
//初始化……
……
//歸并dele
a;
dele
b;
//}//unionLa
和Lb的頭結(jié)點第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é)點的單鏈表,結(jié)點結(jié)構(gòu)為如下:第9
頁假設(shè)該鏈表只給出了頭指針
list。在不改變鏈表的前提下,請設(shè)計一個盡可能高效的算法,查找鏈表中倒數(shù)第k個位置上的結(jié)點(k為正整數(shù))。若查找成功,輸出該結(jié)點的data的值,并返回1;否則,返回
0。datalink線性表習(xí)題問題關(guān)鍵如何盡可能高效?常規(guī)算法對鏈表進行第一遍掃描,計算出鏈表的長度
len,然后進行第二遍掃描,計數(shù)到len-k的位置即為需要查找的倒數(shù)第k
個元素。算法時間復(fù)雜度:O(n)。問題:是否有更高效的算法能否只進行一遍掃描即可完成?第10
頁線性表習(xí)題算法的基本設(shè)計思想假設(shè)鏈表的最后一個結(jié)點為倒數(shù)第1
個結(jié)點。對鏈表進行掃描:用指針p
和q
分別指向兩個結(jié)點,且保持指針p
和指針q
之間的“距離”(包含的結(jié)點數(shù))為k,當(dāng)p
指向最后一個結(jié)點時,q
指向的就是倒數(shù)第k
個結(jié)點。第11
頁線性表習(xí)題算法的詳細(xì)實現(xiàn)步驟假表頭指針為list,兩個指針變量p
和q:
距離計數(shù)器count
=0;p=q=list->link,指向鏈表第一個數(shù)據(jù)結(jié)點;若p
非空,則執(zhí)行③和④;否則,轉(zhuǎn)⑤;
如果count
小于k,則count
=count
+1;否則q
指向下一個結(jié)點;p
指向下一個結(jié)點,轉(zhuǎn)步驟②;
若count
等于k,則查找成功,輸出q
結(jié)點的data值,返回1;否則,返回0。結(jié)束。第12
頁線性表習(xí)題第13
頁int SearchRevk(
pLinkList
list, intk)intcount; /*
距離計數(shù)器*//*
p和q指向第一個數(shù)據(jù)結(jié)點*/{
pLinkList p,
q;p=q
=
list->link;count
=
0;while
(
p!=
NULL
){
if
(count<k)
count++; /*
計數(shù)器+1
*/elsep
=p->
link;q=q->link; /*
q指向下一結(jié)點*//*
p指向下一個結(jié)點*/}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ù)。如果采用鏈表表示各個小數(shù),對于循環(huán)節(jié)采用循環(huán)鏈表表示。head11/8=
0.125形式2∧5.
.0.
6125
(循環(huán)節(jié)125)形式5261head第14
頁線性表習(xí)題算法設(shè)計模擬手工計算過程。關(guān)鍵:記錄計算過程中的余數(shù)和對應(yīng)的商,一旦發(fā)現(xiàn)余數(shù)出現(xiàn)重復(fù),則找到循環(huán)節(jié)。算法實現(xiàn)動態(tài)申請有M個元素的指針數(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ù)擴大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é)編寫一個盡可能高效的查找循環(huán)節(jié)起始點的函數(shù):NODE
*
find(
NODE
*
head)。函數(shù)的返回值為循環(huán)節(jié)的起點(即圖中的指針p)。head11/8=
0.125形式2∧5.
.0.
6125
(循環(huán)節(jié)125)形式5261head第18
頁線性表習(xí)題第19
頁算法設(shè)計關(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;
//找到重合點則退出}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)的起始點{ count
++; p
=
p->next;}while
(p!=q){ p
=
p->next; q
=
q->next;}*n
=ring;returnp;}線性表習(xí)題將n(n>1)個整數(shù)存放到一維數(shù)組R中。試設(shè)計一個在時間和空間兩方面都盡可能高效的算法,將R
中保有的序列循環(huán)左移p(0﹤p﹤n)個位置,即將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)左移算法的時間復(fù)雜度肯定是比較大的。的法:采用一個變量作為輔助空間,每次移動一位,反復(fù)進行移動K次,則時間復(fù)雜度為O(
n*k)。另一種算法是采用p
位輔助空間,空間復(fù)雜度O(
p),時間復(fù)雜度O(
n+p)。第23
頁線性表習(xí)題第24
頁基本設(shè)計思想先將前面p個元素置反,再將后邊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--;}}算法時間復(fù)雜度為O(n),空間復(fù)雜度為O(1)。第25
頁線性表習(xí)題第26
頁本題曾經(jīng)出現(xiàn)在《編程珠璣》中。基本思想從第n個元素開始移位,將它直接移到第n-p位,然后再對第n-p位操作,依次類推n-2p,n-3p.....;上述移位操作經(jīng)過一定次數(shù)后,必定又重新對第n位操作,此時完成了一次循環(huán);例如,當(dāng)n=6,p=2時,先將第6位移到第4
位,第4
位移到第2位,第2位移到第
6
位,循環(huán)一次,此時一次循環(huán)未能將數(shù)組移位完畢。當(dāng)n=6,p=5
時,6->1;1->2;
2->3;3->4;4->5;5->6;此時一次循環(huán)即將整個數(shù)組移位完畢。線性表習(xí)題基本思想當(dāng)一次循環(huán)不能將整個數(shù)組完全移位時,可從第n-1位,再進行第(1)步的操作;如果還沒移完,繼續(xù)從第n-2位開始循環(huán),依次類推?,F(xiàn)在的關(guān)鍵之處是移動需要多少次循環(huán)。由數(shù)論性質(zhì)可知:a.當(dāng)n
和p的最大公約數(shù)(記為(n,p))為1時,一次循環(huán)必定將整個數(shù)組移動完畢。b.
當(dāng)
n
和
p
的最大公約數(shù)(記為
(
n,
p
))大于
1時,則需要的循環(huán)次數(shù)就是
(n,p)!如
n=6,p=2,
(6,
2)
=2,第一次循環(huán)從第
6
位開始,第二次循環(huán)從第5
位開始,兩次后完成!第27
頁線性表習(xí)題定義:一個長度為L(L≥1)的升序序列S,處在第L/2
個位置的數(shù)稱為S的中位數(shù)。
例如,若序列S1=(11,13,15,17,19),則S1
的中位數(shù)是15。兩個序列的中位數(shù)是含它們所有元素的升序
序列的中位數(shù)。例如,若S2=(2,4,6,8,20),則S1
和S2
的中位數(shù)是11?,F(xiàn)有兩個等長升序序列A和B,設(shè)計一個在時間和空間兩方面都盡可能高效的算法,找出兩個序列A
和B
的中位數(shù)。第28
頁線性表習(xí)題較小者即為所求的中位數(shù)。第29
頁基本設(shè)計思想分別求兩個升序序列A、B的中位數(shù),設(shè)為a和b。求中位數(shù)的過程如下:若a=b,則a或b即為所求的中位數(shù),結(jié)束;若a<b,則舍棄A中較小一半,同時舍棄B中較大一半,要求兩次舍棄的元素個數(shù)相同。若a>b,則舍棄A中較大一半,同時舍棄B中較小一半,要求兩次舍棄的元素個數(shù)相同。在保留的兩個升序序列中,重復(fù)上述過程,直到兩個序列中均只含1
個元素時為止,則線性表習(xí)題}第30
頁基本設(shè)計思想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)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 農(nóng)村共建共治共享合作協(xié)議
- 高端酒店經(jīng)營管理經(jīng)驗分享
- 旅游行業(yè)旅游景區(qū)規(guī)劃與設(shè)計練習(xí)題
- 對未來的無限憧憬抒情作文10篇
- 公司行政人員考勤表格
- 旅游管理與文化體驗知識點詳解
- 市場調(diào)研數(shù)據(jù)表-種類一
- 代繳納社保協(xié)議書
- 漁業(yè)資源養(yǎng)護與漁民利益共享協(xié)議
- 互聯(lián)網(wǎng)站點設(shè)置與發(fā)布管理
- 基于AI的智能汽車用戶體驗優(yōu)化策略
- 公司信息安全管理制度
- 行政后勤管理員專業(yè)實操復(fù)習(xí)題
- GB/T 10810.2-2025眼鏡鏡片第2部分:漸變焦
- AI時代小學(xué)數(shù)學(xué)智慧課堂的構(gòu)建與實踐探索
- T-CECS 10400-2024 固廢基膠凝材料
- 八年級語文上冊第四單元整體公開課一等獎創(chuàng)新教學(xué)設(shè)計
- 智慧小區(qū)建設(shè)方案
- 2024國家安全教育大學(xué)生讀本題庫
- DBJ04T 439-2023 房屋建筑和市政基礎(chǔ)設(shè)施工程造價指標(biāo)指數(shù)編制標(biāo)準(zhǔn)
- 新版統(tǒng)編版一年級道德與法治下冊全冊教案(完整版)教學(xué)設(shè)計含教學(xué)反思
評論
0/150
提交評論