資料結構與演算法實驗報告
約瑟夫生死遊戲
姓名:孫瑞霜
一、實驗目的
1、熟練掌握學習的每種結構及其相應演算法;
2、理論聯絡實際,會對現實問題建模並設計相應演算法。
3、優化演算法,使得演算法效率適當提高
二、實驗要求:
1. 認真閱讀和掌握教材上和本實驗相關的內容和演算法;
2. 上機將各種相關演算法實現;
3. 實現上面實驗目的要求的功能,並能進行簡單的驗證。
三、實驗內容
認真學習
學習通->資料結構->資料->資料結構實驗指導書--陳越版,從第二章高階實驗1~10中任選乙個來實現,編寫程式,輸入給定的資料,能得到給定的輸出。總結演算法思想、畫出流程圖,並思考程式有無改進空間,如何改進。
三、演算法描述
選擇實驗2「約瑟夫生死遊戲」。
該實驗採用迴圈鍊錶將30個資料串聯起來,首先建立迴圈鍊錶,其次進入刪除函式,刪除函式中採用雙重迴圈,外迴圈負責控制刪除資料的個數,內迴圈負責找出每次要刪除人的位置的前乙個位置,然後定義乙個指標指向刪除位置,將刪除位置的前乙個位置和後乙個位置連線,輸出刪除位置的資料和餘下的資料,釋放刪除的節點。
函式還可以改進,比如從根節點開始,直接找到刪除的位置。
四、詳細設計
五、程式**
#include
#include
/* 定義鍊錶節點型別
*/typedef struct nodelinklist;
linklist * init(int n,linklist * ptrl){
linklist *p,*q;
int i;
ptrl=(linklist *)malloc(sizeof(linklist));
q=ptrl;
for(i=1;ip=(linklist *)malloc(sizeof(linklist));
q->data=i;
q->next=p;
q=p;
q->data=n;
p->next=ptrl;
ptrl=q;
return ptrl; //此時
ptrl
指向鍊錶的最後乙個位置
void outlist(int n,int i,linklist *ptrl){ //將倖存的人的編號輸出
linklist *s;
s=ptrl->next;
for(int t=1;t<=n-i;t++,s=s->next)
printf("%d ",s->data);
linklist * delete(int n,int k,linklist *ptrl)
int i,j;
linklist *p,*q;
p=ptrl;
for(i=1;i<=n/2;i++) //剔除一半的人
for(j=1;j<=k-1;j++) //迴圈找到要刪除的前乙個位置 用指標
p表示
p=p->next;
q=p->next; //q此時指向要刪除的位置
p->next=q->next; //將要刪除的位置的前乙個位置與要刪除的位置的後乙個位置連線
printf("\n\n第
%d次被拋下海的序號為
:",i);
printf("%d\n",q->data);
printf("船上還剩下倖存者的序號
:\n");
if(q->data==ptrl->data) //如果剛好刪除最後乙個位置
ptrl=p;
outlist(n,i,ptrl); //將倖存的人的編號輸出
free(q);
return ptrl;
int main(){
linklist * ptrl;
int n,k;
printf("船上的總人數
(n)是
:");
scanf("%d",&n);
printf("從第
k個人開始拋下海
:");
scanf("%d",&k);
ptrl=init(n,ptrl);
ptrl=delete(n,k,ptrl);
六、測試和結果
七、使用者手冊
開啟dev c++,將五部分**拷貝進去,點選執行,按照提示輸入資料,最後得出結果,關閉程式。
資料結構之約瑟夫環
資料結構之約瑟夫環 c語言實現 因為最近在學習資料結構和做相關的實驗,所以想把自己的所做的分享一下 設有編號為1,2,n的n n 0 個人圍成乙個圈,每個人持有乙個密碼m。從第乙個人開始報數,報到m時停止報數,報m的人出圈,再從他的下乙個人起重新報數,報到m時停止報數,報m的出圈,如此下去,直到所有...
資料結構之約瑟夫環問題
有 n 個人,按 1 到 n 編號,要求從第 s 個人開始迴圈報數,報到 m 時,此人出列,再從下乙個人開始報 m個數,直到所有人出列。給出 n 個人出列的順序。include stdio.h typedef struct nodelnode,linklist void creatjoseph li...
資料結構之約瑟夫迴圈鍊錶
public class test public class joseph 如果不是首節點 node newnode newnode i,null 建立乙個新節點 pre.next newnode 為當前節點儲存下個節點 pre newnode 將新節點設為當前節點 if i total int c...