![拆分與約瑟夫問題_第1頁](http://file2.renrendoc.com/fileroot_temp3/2021-7/3/aa2ffc50-79f4-42c6-8ffb-e7890e927dc2/aa2ffc50-79f4-42c6-8ffb-e7890e927dc21.gif)
![拆分與約瑟夫問題_第2頁](http://file2.renrendoc.com/fileroot_temp3/2021-7/3/aa2ffc50-79f4-42c6-8ffb-e7890e927dc2/aa2ffc50-79f4-42c6-8ffb-e7890e927dc22.gif)
![拆分與約瑟夫問題_第3頁](http://file2.renrendoc.com/fileroot_temp3/2021-7/3/aa2ffc50-79f4-42c6-8ffb-e7890e927dc2/aa2ffc50-79f4-42c6-8ffb-e7890e927dc23.gif)
![拆分與約瑟夫問題_第4頁](http://file2.renrendoc.com/fileroot_temp3/2021-7/3/aa2ffc50-79f4-42c6-8ffb-e7890e927dc2/aa2ffc50-79f4-42c6-8ffb-e7890e927dc24.gif)
![拆分與約瑟夫問題_第5頁](http://file2.renrendoc.com/fileroot_temp3/2021-7/3/aa2ffc50-79f4-42c6-8ffb-e7890e927dc2/aa2ffc50-79f4-42c6-8ffb-e7890e927dc25.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)B B 張立紅張立紅 1340533045913405330459(8802888028) 辦公室:辦公室:9-5019-501 第第10章章 鏈鏈 表表 主要內(nèi)容主要內(nèi)容 動態(tài)內(nèi)存分配動態(tài)內(nèi)存分配 鏈表的概念、操作以及基本應(yīng)用。鏈表的概念、操作以及基本應(yīng)用。 10.5.3 單鏈表的拆分單鏈表的拆分 單鏈表的拆分單鏈表的拆分是將一個單鏈表拆分成幾個是將一個單鏈表拆分成幾個 小的鏈表。小的鏈表。 單鏈表的拆分是一個建立多個子鏈表的過單鏈表的拆分是一個建立多個子鏈表的過 程,程,建子鏈表的過程可以根據(jù)題目的要求建子鏈表的過程可以根據(jù)題目的要求 選擇順序或逆序的方式,選擇順序
2、或逆序的方式,結(jié)點(diǎn)來源于原始結(jié)點(diǎn)來源于原始 大鏈表。大鏈表。 單鏈表的拆分過程:單鏈表的拆分過程: 1)為各個子鏈表為各個子鏈表分別建立各自只包含頭結(jié)點(diǎn)分別建立各自只包含頭結(jié)點(diǎn)的空鏈表。的空鏈表。 2)依次訪問原始鏈表中的每一個結(jié)點(diǎn),根據(jù)結(jié)點(diǎn)的特征,確依次訪問原始鏈表中的每一個結(jié)點(diǎn),根據(jù)結(jié)點(diǎn)的特征,確 定將該結(jié)點(diǎn)插入哪個子鏈表。定將該結(jié)點(diǎn)插入哪個子鏈表。 3)當(dāng)原始鏈表訪問結(jié)束后,所有的結(jié)點(diǎn)也分別插入到的子鏈)當(dāng)原始鏈表訪問結(jié)束后,所有的結(jié)點(diǎn)也分別插入到的子鏈 表上。表上。 -一一個單鏈表個單鏈表-拆分成了幾個子鏈表。拆分成了幾個子鏈表。 例例12:一個帶頭結(jié)點(diǎn)的單鏈表存放了一批整數(shù)值,一個帶
3、頭結(jié)點(diǎn)的單鏈表存放了一批整數(shù)值, 其中有負(fù)整數(shù)、其中有負(fù)整數(shù)、非非負(fù)整數(shù)。負(fù)整數(shù)。 要求:要求:將鏈表拆分成兩個子鏈表。將鏈表拆分成兩個子鏈表。 一個存放原鏈表中所有負(fù)數(shù)。一個存放原鏈表中所有負(fù)數(shù)。 一個存放原鏈表中所有一個存放原鏈表中所有非非負(fù)數(shù)。負(fù)數(shù)。 單鏈表的拆分過程:單鏈表的拆分過程: -5109-712 head1 -8 head2=(struct node *) malloc (sizeof(struct node); head2-next=NULL; p=head1-next; head1-next=NULL; q=p-next; head2 p q 單鏈表的拆分過程:單鏈表的拆
4、分過程: -5109-712 head1 -8 if (p-data=0) p-next=head1-next; head1-next=p; head2 p q p=q; if (q!=NULL) q=q-next; if (p-data=0) 單鏈表的拆分過程:單鏈表的拆分過程: -5109-712 head1 -8 if(p-data=0) p-next=head1-next; head1-next=p; else p-next=head2-next; head2-next=p; head2 pq p=q; if (q!=NULL) q=q-next; 單鏈表的拆分過程:單鏈表的拆分過程:
5、 -5109-712 head1 -8 if(p-data=0) p-next=head1-next;head1-next=p; else p-next=head2-next; head2-next=p; head2 p q struct node *split(struct node *head1) /鏈表拆分鏈表拆分 struct node * head2,* p,* q; head2=(struct node *) malloc (sizeof(struct node); head2-next=NULL;p=head1-next; head1-next=NULL;q=p-next; wh
6、ile(p!=NULL) if (p-data=0) p-next=head1-next; head1-next=p; else p-next=head2-next; head2-next=p; p=q; if (q!=NULL) q=q-next; return (head2); /返回一個新鏈表的頭指針返回一個新鏈表的頭指針 例例12:一個帶頭結(jié)點(diǎn)的單鏈表存放了一批整數(shù)值,其中有負(fù)整:一個帶頭結(jié)點(diǎn)的單鏈表存放了一批整數(shù)值,其中有負(fù)整 數(shù)也有非負(fù)整數(shù),要求將其拆分成兩個子鏈表,一個存放原鏈數(shù)也有非負(fù)整數(shù),要求將其拆分成兩個子鏈表,一個存放原鏈 表中所有負(fù)數(shù),另外一個存放原鏈表中所有非負(fù)數(shù)。表
7、中所有負(fù)數(shù),另外一個存放原鏈表中所有非負(fù)數(shù)。-閱讀閱讀 #include #include struct node int data; struct node *next; ; struct node * create(int n) / 順序建鏈表順序建鏈表 struct node * h,* tail,* p; int i; h=(struct node *)malloc(sizeof(struct node); h-next=NULL; tail=h; for(i=1;idata); p-next=NULL; tail-next=p; tail=p; return (h); int mai
8、n() struct node *h1,*h2,*p; h1=create(10);/建立建立10個節(jié)點(diǎn)的鏈表個節(jié)點(diǎn)的鏈表 h2=split(h1); /h1鏈表拆分偉個鏈表鏈表拆分偉個鏈表h1、h2 p=h1-next; / 輸出正數(shù)鏈表輸出正數(shù)鏈表 while (p!=NULL) printf(%d ,p-data); p=p-next; printf(n); p=h2-next; / 輸出負(fù)數(shù)鏈表輸出負(fù)數(shù)鏈表 while (p!=NULL) printf(%d ,p-data); p=p-next; printf(n); return 0; 例例12 (續(xù)(續(xù)) head a2a1 a3
9、 anan-1 p 10.6.1 循環(huán)鏈表循環(huán)鏈表 一般單鏈表的最后一個結(jié)點(diǎn)的指針為一般單鏈表的最后一個結(jié)點(diǎn)的指針為NULL。 如果將單鏈表的最后一個結(jié)點(diǎn)又指向了第一個如果將單鏈表的最后一個結(jié)點(diǎn)又指向了第一個 結(jié)點(diǎn)結(jié)點(diǎn)-形成形成循環(huán)鏈表循環(huán)鏈表 注意:注意:在循環(huán)鏈表中,沒有在循環(huán)鏈表中,沒有空的頭結(jié)點(diǎn)空的頭結(jié)點(diǎn)。 10.6 循環(huán)鏈表與約瑟夫問題循環(huán)鏈表與約瑟夫問題 head a2a1 a3 anan-1 循環(huán)鏈表循環(huán)鏈表的操作與的操作與單單鏈表操作的鏈表操作的不同點(diǎn):不同點(diǎn): 1、建立一個循環(huán)鏈表時,必須使其建立一個循環(huán)鏈表時,必須使其最后一個結(jié)點(diǎn)的指針指最后一個結(jié)點(diǎn)的指針指 向表頭結(jié)點(diǎn)向表
10、頭結(jié)點(diǎn)-此情況還適用于在最后一個結(jié)點(diǎn)后插入此情況還適用于在最后一個結(jié)點(diǎn)后插入/刪刪 除一個結(jié)點(diǎn)。除一個結(jié)點(diǎn)。 2、循環(huán)鏈表判斷是否到表尾的條件:循環(huán)鏈表判斷是否到表尾的條件:判斷該結(jié)點(diǎn)判斷該結(jié)點(diǎn)指針域的指針域的 值值是否是表頭結(jié)點(diǎn)是否是表頭結(jié)點(diǎn)-當(dāng)當(dāng)指針域指針域值等于表頭指針時值等于表頭指針時-已到已到 表尾。表尾。 單鏈表判斷是否到表尾:單鏈表判斷是否到表尾:判斷判斷指針域值指針域值是否為是否為NULL。 10.6.2 約瑟夫問題約瑟夫問題-1197 約瑟夫問題的描述有多種方式,約瑟夫問題的描述有多種方式,“猴子選大王猴子選大王”是其是其 中典型的代表之一。中典型的代表之一。 問題描述:問題
11、描述: 1)n只猴子圍成一圈,順時針方向從只猴子圍成一圈,順時針方向從 1 到到 n 編號;編號; 2)從從1號開始沿順時針方向讓猴子從號開始沿順時針方向讓猴子從1、2、m 依次報(bào)數(shù),凡報(bào)到依次報(bào)數(shù),凡報(bào)到 m 的猴子,都讓其出圈,取消候的猴子,都讓其出圈,取消候 選資格;選資格; 3)再按順時針方向逐一讓報(bào)出再按順時針方向逐一讓報(bào)出 m 者出圈。者出圈。 結(jié)果:最后剩下一個就是猴王。結(jié)果:最后剩下一個就是猴王。 1# 2# 3# 4# 5# 6# 7# 8# 起始位置起始位置 例如:有例如:有n=8只猴子,只猴子, 數(shù)到數(shù)到 m=3 出圈。出圈。 出圈順序:出圈順序:3 615284 猴王猴
12、王 1、需要重復(fù)對猴子群體進(jìn)行報(bào)數(shù)。需要重復(fù)對猴子群體進(jìn)行報(bào)數(shù)。 2、在報(bào)數(shù)過程中要對滿足出圈條件的猴子進(jìn)行出圈在報(bào)數(shù)過程中要對滿足出圈條件的猴子進(jìn)行出圈 操作。操作。 3、用循環(huán)鏈表來進(jìn)行模擬:用循環(huán)鏈表來進(jìn)行模擬: 方便循環(huán)訪問。方便循環(huán)訪問。 容易實(shí)施出圈(即刪除)操作。容易實(shí)施出圈(即刪除)操作。 約瑟夫環(huán)問題約瑟夫環(huán)問題-分析分析 h 21 3 nn-1 1)結(jié)點(diǎn)數(shù)據(jù)域:)結(jié)點(diǎn)數(shù)據(jù)域:存放猴子在圈中的初始序號存放猴子在圈中的初始序號 。 結(jié)點(diǎn)指針域:結(jié)點(diǎn)指針域:指向下一個猴子指向下一個猴子-完成結(jié)點(diǎn)的鏈接。完成結(jié)點(diǎn)的鏈接。 結(jié)點(diǎn)定義如下:結(jié)點(diǎn)定義如下: struct monkey i
13、nt num; struct mon *next; ; 約瑟夫環(huán)問題約瑟夫環(huán)問題-分析分析 2)變量定義:)變量定義: 游動指針游動指針 p:對鏈表對鏈表從第一個結(jié)點(diǎn)從第一個結(jié)點(diǎn)開始逐個循環(huán)訪問時,開始逐個循環(huán)訪問時, p 指向當(dāng)前正在被訪問的結(jié)點(diǎn)。指向當(dāng)前正在被訪問的結(jié)點(diǎn)。 計(jì)數(shù)變量計(jì)數(shù)變量cn :用于統(tǒng)計(jì)出圈的猴子數(shù)目用于統(tǒng)計(jì)出圈的猴子數(shù)目 -循環(huán)鏈表中被刪除的結(jié)點(diǎn)數(shù)目。循環(huán)鏈表中被刪除的結(jié)點(diǎn)數(shù)目。 跟隨指針跟隨指針q:q指向指向當(dāng)前結(jié)點(diǎn)的當(dāng)前結(jié)點(diǎn)的前驅(qū)結(jié)點(diǎn)前驅(qū)結(jié)點(diǎn)。 要刪除當(dāng)前結(jié)點(diǎn)時,必須修改要刪除當(dāng)前結(jié)點(diǎn)時,必須修改跟隨指針跟隨指針q 所指結(jié)點(diǎn)(即所指結(jié)點(diǎn)(即 被刪結(jié)點(diǎn)的前驅(qū)結(jié)點(diǎn))的指
14、針域。被刪結(jié)點(diǎn)的前驅(qū)結(jié)點(diǎn))的指針域。 報(bào)數(shù)變量報(bào)數(shù)變量 s :對結(jié)點(diǎn)進(jìn)行報(bào)數(shù),如果報(bào)數(shù)對結(jié)點(diǎn)進(jìn)行報(bào)數(shù),如果報(bào)數(shù)s=m,則刪,則刪 除除游動指針游動指針 p 所指的結(jié)點(diǎn)所指的結(jié)點(diǎn)。 約瑟夫環(huán)問題約瑟夫環(huán)問題-分析分析 3)循環(huán)執(zhí)行的次數(shù)(即循環(huán)條件)循環(huán)執(zhí)行的次數(shù)(即循環(huán)條件)可以通過可以通過計(jì)數(shù)計(jì)數(shù)來控來控 制,也可以通過對循環(huán)鏈表本身的判定來實(shí)現(xiàn):制,也可以通過對循環(huán)鏈表本身的判定來實(shí)現(xiàn): 若若通過通過計(jì)數(shù)判斷計(jì)數(shù)判斷-判斷循環(huán)鏈表是否只剩一個結(jié)點(diǎn):判斷循環(huán)鏈表是否只剩一個結(jié)點(diǎn): 如果只剩一個結(jié)點(diǎn),則已刪除如果只剩一個結(jié)點(diǎn),則已刪除n-1個,剩余是猴王,個,剩余是猴王, 停止循環(huán)。停止循環(huán)。
15、 否則,表示還未找到猴王,需要繼續(xù)循環(huán)。否則,表示還未找到猴王,需要繼續(xù)循環(huán)。 約瑟夫環(huán)問題約瑟夫環(huán)問題-分析分析 1197-約瑟夫問題約瑟夫問題 #include /用循環(huán)鏈表完成約瑟夫問題用循環(huán)鏈表完成約瑟夫問題 #include struct monkey int num; struct monkey *next; struct monkey *creat(int n) / 循環(huán)鏈表創(chuàng)建循環(huán)鏈表創(chuàng)建順序建立無頭結(jié)點(diǎn)的鏈表順序建立無頭結(jié)點(diǎn)的鏈表 int i; struct monkey *p,*tail,*h; p=(struct monkey *)malloc(sizeof(struct
16、 monkey); p-num=1; p-next=NULL; / 第一個結(jié)點(diǎn)的生成第一個結(jié)點(diǎn)的生成 h=p; tail=p; /h、tail-均指向第一個結(jié)點(diǎn)均指向第一個結(jié)點(diǎn) for(i=2;inum=i; p-next=NULL; tail-next=p; tail=p; tail-next=h; / 最后一個結(jié)點(diǎn)的指針域指向第一個結(jié)點(diǎn)形成循環(huán)鏈表最后一個結(jié)點(diǎn)的指針域指向第一個結(jié)點(diǎn)形成循環(huán)鏈表 return h; int sel(struct monkey *h,int n,int m) / n只猴子報(bào)數(shù)只猴子報(bào)數(shù)m出圈出圈-返回猴王序號返回猴王序號 int s=0; / 猴子報(bào)數(shù)的計(jì)數(shù)變
17、量猴子報(bào)數(shù)的計(jì)數(shù)變量 int cn=0; /統(tǒng)計(jì)出圈猴子的數(shù)目統(tǒng)計(jì)出圈猴子的數(shù)目 struct monkey *p,*q; / 分別指向當(dāng)前結(jié)點(diǎn)及其前驅(qū)結(jié)點(diǎn)的指針分別指向當(dāng)前結(jié)點(diǎn)及其前驅(qū)結(jié)點(diǎn)的指針 q=h; while(q-next!=h) q=q-next; / 前驅(qū)指針前驅(qū)指針 q 指向尾結(jié)點(diǎn)指向尾結(jié)點(diǎn) while(cnnext;s+; if (s=m) / 找到一個被刪結(jié)點(diǎn),完成刪除、計(jì)數(shù)找到一個被刪結(jié)點(diǎn),完成刪除、計(jì)數(shù) q-next=p-next; cn+; free(p); s=0; else q=p; return q-num; / 最后一個結(jié)點(diǎn)的數(shù)據(jù)域即為留在最后一個結(jié)點(diǎn)的數(shù)據(jù)域
18、即為留在圈內(nèi)的猴王序號圈內(nèi)的猴王序號 int main() /1197-用循環(huán)鏈表完成約瑟夫問題用循環(huán)鏈表完成約瑟夫問題 int n,m; struct monkey *head; scanf(%d%d, head=creat(n); printf(%dn,sel(head,n,m); return 0; 如何通過鏈表本身判斷,圈內(nèi)剩余一個猴王?如何通過鏈表本身判斷,圈內(nèi)剩余一個猴王? -當(dāng)循環(huán)鏈表只剩一個結(jié)點(diǎn),此時循環(huán)鏈表結(jié)當(dāng)循環(huán)鏈表只剩一個結(jié)點(diǎn),此時循環(huán)鏈表結(jié) 構(gòu)如下圖所示:構(gòu)如下圖所示: h i 基本特征是:基本特征是:q-next=q ; 此時:循環(huán)條件此時:循環(huán)條件while(cnn
19、ext!=q) 2056不敢死隊(duì)問題不敢死隊(duì)問題 #include /2056不敢死隊(duì)問題不敢死隊(duì)問題 #include struct person int num; struct person *next; struct person *creat(int m) /建立循環(huán)鏈表建立循環(huán)鏈表 int i; struct person *p,*tail,*head; p=(struct person *)malloc(sizeof(struct person); /建立循環(huán)鏈表的第一個結(jié)點(diǎn)建立循環(huán)鏈表的第一個結(jié)點(diǎn) p-num=1; p-next=NULL; /第第1個結(jié)點(diǎn)是排長個結(jié)點(diǎn)是排長 head=p; tail=p; for(i=2;inum=i; tail-next=p; tail=p; p-next=NULL; tail-next=head; /形成循環(huán)鏈表形成循環(huán)鏈表 return head; void del(
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 文學(xué)社組社方案及招生簡章范文
- 現(xiàn)代企業(yè)財(cái)務(wù)管理的全球化視角
- 全鋼爬架施工方案
- 汽車行業(yè)的品牌競爭戰(zhàn)略分析
- 國慶節(jié)小吃店鋪活動方案
- 國慶節(jié)手工干貨活動方案
- 12《富起來到強(qiáng)起來》第一課時說課稿-2023-2024學(xué)年道德與法治五年級下冊統(tǒng)編版001
- 2023六年級英語上冊 Unit 3 Winter in canada Lesson 14 Snow!It's Winter說課稿 冀教版(三起)
- 2024-2025學(xué)年新教材高中物理 第三章 恒定電流 第3節(jié) 測量金屬絲的電阻率說課稿 粵教版必修3
- 2024秋七年級數(shù)學(xué)上冊 第3章 一次方程與方程組3.4 二元一次方程組的應(yīng)用 2列二元一次方程組解實(shí)際應(yīng)用(一)說課稿(新版)滬科版
- 2024過敏性休克搶救指南(2024)課件干貨分享
- 醫(yī)療行業(yè)提高醫(yī)院服務(wù)質(zhì)量的改進(jìn)方案三篇
- 飛機(jī)儀電與飛控系統(tǒng)原理智慧樹知到期末考試答案章節(jié)答案2024年中國人民解放軍海軍航空大學(xué)
- JJG(交通) 192-2023 負(fù)壓篩析儀
- 七年級下冊第四單元第七章 人類活動對生物圈的影響作業(yè)設(shè)計(jì)
- 農(nóng)行網(wǎng)點(diǎn)負(fù)責(zé)人述職報(bào)告范本
- 常見軍事訓(xùn)練傷的康復(fù)流程
- 人教版小學(xué)數(shù)學(xué)一年級(上)口算題1000道
- 急診科管理手冊
- 售后工程師的績效考核與評估
- 新HSK一至六級詞匯表
評論
0/150
提交評論