資料結構實驗之約瑟夫生死遊戲

2022-08-14 15:48:12 字數 2834 閱讀 6795

資料結構與演算法實驗報告

約瑟夫生死遊戲

姓名:孫瑞霜

一、實驗目的

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...