當前位置:首頁 » 編程語言 » 循環隊列約瑟夫環c語言
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

循環隊列約瑟夫環c語言

發布時間: 2022-09-14 20:52:14

A. c語言 約瑟夫環問題:用戶輸入M,N值,從1至N開始順序循環數數,每數到M輸出該數值,直至全部輸出。

幫你改了程序

#include <stdafx.h>
#include <stdlib.h>

struct number
{
int num;
struct number * next;
};

void main ()
{
int m, n;
struct number * p, * head=NULL, * tail;

printf("please input M and N:\n");
scanf("%d %d", &m, &n); //輸入M、N值。

for (int i=1; i<=n; i++) //建立循環鏈表。
{
p=(struct number *)malloc(sizeof(struct number));
p->num=i;
if(head==NULL){
head=p;
tail=p;//注意開始tail也要賦值
}
else
tail->next=p;
tail=p;
}
tail->next=head;
p = tail; //從head開始,記錄開始的前一個指針
while(n--) //剩下的數的個數為n
{ int t = m%n; //防止多數太多圈造成時間浪費
for(int j=1; j<t;j++ ) //數到要刪的那個數的前一個
p=p->next;
number *q = p->next; //要刪的數的指針
printf("%d ", q->num); //輸出要刪的數
p->next = q->next; //要刪的數從鏈表中去掉
free(q);
}
printf("\n");

}

B. 約瑟夫環(c語言)

怎麼了,代碼看不懂?

約瑟夫環(約瑟夫問題)是一個數學的應用問題:已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規律重復下去,直到圓桌周圍的人全部出列。通常解決這類問題時我們把編號從0~n-1,最後結果+1即為原問題的解。
首先我們列出一些有關約瑟夫環的結果:
1 1 2 2 3 2 4 1 5 4 6 1 7 4 8 7 9 1 10 4
11 7 12 10 13 13 14 2 15 5 16 8 17 11 18 14 19 17 20 2021 2 22 5 23 8 24 11 25 14 26 17 27 20 28 23 29 26 30 29
31 1 32 4 33 7 34 10 35 13 36 16 37 19 38 22 39 25 40 28
41 31 42 34 43 37 44 40 45 43 46 46 47 2 48 5 49 8 50 11
51 14 52 17 53 20 54 23 55 26 56 29 57 32 58 35 59 38 60 41
61 44 62 47 63 50 64 53 65 56 66 59 67 62 68 65 69 68 70 171 4 72 7 73 10 74 13 75 16 76 19 77 22 78 25 79 28 80 31
81 34 82 37 83 40 84 43 85 46 86 49 87 52 88 55 89 58 90 61
91 64 92 67 93 70 94 73 95 76 96 79 97 82 98 85 99 88 100 91
意思是,前一個數為約瑟夫環的人數,後一個數為最後出去的人的號碼。
從上面的表中我們可以歸納出以下兩個規則:
規則1:若上一組數字中最後保留號比人數少一,則下一數從1開始記。
例如第三組(3,2)為上一組,最後保留好為2,比3少1,下一組的數字(4,1),最後保留號為1
規則2:若上一組數字為最後保留號與人數相等,則下一數從2開始記。

C. 約瑟夫環問題 c語言程序

已經修改好了。上次調試程序調試的不仔細,這次應該沒問題了,如果有的話再跟我聯系。

#include<stdio.h>

#defineS()sizeof(structquene)

typedefstructquene

{intn;

structquene*next;

}QUE;

QUE*fun1(intn);

intfun2(QUE*p);

intmain()

{intm,i,n,j,s;

QUE*p,*p2;

printf("n=");

scanf("%d",&n);

printf("m=");

scanf("%d",&m);

printf("i=");

scanf("%d",&i);

p=fun1(n);

for(j=1;j<i;p=p->next,j++);

j=1;p2=p;

while((p->next)!=p)

{p=p->next;

if(++j==m)

{j=1;p=p->next;

s=fun2(p2);

printf("%d",s);

}

p2=p;

}

printf("%d ",p->n);

}

QUE*fun1(intn)

{QUE*head,*p1,*p2;

inti;

for(i=1;i<=n;i++)

{p1=(QUE*)malloc(S());

if(i==1)head=p1;

elsep2->next=p1;

p1->n=i;

p2=p1;

}

p1->next=head;

returnhead;

}

intfun2(QUE*p)

{QUE*p2;

intn;

p2=p->next;

n=p2->n;

p->next=p2->next;

free(p2);

returnn;

}

D. 關於循環隊列實現約瑟夫環(C語言)的問題

首先,p是指向頭結點的,或者說第一個結點,然後:
p->next = p; //p->next也指向頭結點,也就是頭結點的next指向自己,那麼一開始只有一個結點時這就已經是一個循環鏈表了,後面再插入結點時只要尾結點的next指向頭結點,就能保持它仍然是循環鏈表。
node *r = p;//用r來指向尾結點,r=p,因為p->next=p,所以也就是r->next==p,尾結點的next指向頭結點。
for循環中:
q->next = r->next;//把新增結點的next指向頭結點,其實等價於q->next=p,因為r->next==p,尾結點的next是指向頭結點的。
r->next = q;//把原先的尾結點的next指向新增結點。
r = q;//把尾結點改為新增結點,因為上面已經將新增結點的next指向頭結點,所以這個操作過後,尾結點的next仍然指向頭結點,也就保持了鏈表仍然是循環鏈表。

E. C語言約瑟夫問題

約瑟夫問題:
#include<iostream.h>
struct
node
{
int
data;
node
*pnext;
};
void
main()
{
int
n,k,m,i;
node
*p,*q,*head;
cout<<"輸入n的值:";
cin>>n;
cout<<"輸入起始報數人號碼k的值:";
cin>>k;
cout<<"輸入
數到m出列的m的值:";
cin>>m;
head=(node*)new
node;
//確定頭結點
p=head;
for(i=1;i<=n-1;i++)
//賦初值
{
p->data=i;
p->pnext=(node*)new
node;
//為下一個新建內存
p=p->pnext;
}
p->data=n;
//最後一個單獨處理
p->pnext=head;
//指向頭,形成循環鏈表
p=head;
while(p->data!=(p->pnext)->data)
//p->data==(p->pnext)->data表示只剩下一個結點的
{
while(p->data
!=k)
//尋找編號為k的結點
p=p->pnext;
if(m==1)
{
for(i=1;i<=n;i++)
{
cout<<p->data<<'\\t'
;
p=p->pnext
;
}
cout<<'\
';
return;
}
else
for(i=1;i<m-1;i++)
//開始報數
{p=p->pnext;}
//找到報m-1的結點
q=p->pnext;
//q為報m的結點
cout<<q->data<<"\\t";
//輸出報m的結點的值
k=(q->pnext)->data;
//k為下一個報數的起點
p->pnext=q->pnext;
//刪除報m的結點
}
cout<<p->data<<'\
';
//輸出最後一個結點的值
}

F. 用循環隊列實現約瑟夫環處理。若幹人循環報數,凡報到3的倍數退出,最後剩下的一個人是第幾人

// 首先確認n個人,並打上標記
int n = 10;
// 退出的報數數字
int say = 3;
Queue<Integer> qu = new LinkedList<Integer>();
for (int i = 0; i < n; i++) {
qu.add(i + 1);
}
// 開始報數技術
int j = 1;
int lastMan = 0;
while (qu.size() > 0) {
lastMan = qu.poll();
if (j % say == 0) {
j = 0;
} else {
qu.add(lastMan);
}
j++;
}
System.out.println(lastMan);

G. 求用循環隊列解決約瑟夫環問題的C語言代碼,急,速度!!!!!!!

他們都是用鏈表做的。。我沒用鏈表做。。。很簡單的寫了一個。。。

#include<iostream.h>

voidFmade(intx,inty,intz);

voidmain()

{

inta,b,c;

//ti,j,k;

//taa[100],b[100];

cout<<"請輸入總人數:";

cin>>a;

cout<<endl<<"請輸入開始位子:";

cin>>b;

cout<<endl<<"請輸入步長:";

cin>>c;

Fmade(a,b,c);

}

voidFmade(intx,inty,intz)

{

inti,j=0,k=0;

intaa[100],bb[100];

intstart;

aa[0]=0;

for(i=1;i<=x;i++)

{

aa[i]=i;

}

start=y;

while(j<x)

{

while(start<=x)

{

if(aa[start]!=0)

{

k++;

}

if(k==z)

{

bb[j]=aa[start];

aa[start]=0;

j++;

k=0;

}

start++;

}

start=1;

}

cout<<"出列順序為:";

for(i=0;i<x;i++)

{

cout<<bb[i]<<"";

}

}

說明下:因為這個數組只定義了100個位元組。其中第一位元組沒有用。。所以只能計算99以內的出列。。。包括99,如果需要擴大計算范圍,只需要擴大數組長度就行了。。。也就Fmade函數的定義。。。

最夠插入運算的答案的圖片:

H. 關於約瑟夫環的問題 c++循環隊列實現

給,已經編譯運行確認:
#include <iostream.h>
#include <stdlib.h>

typedef struct Node
{
int data;
struct Node* next;
}LNode, *LinkList;

LinkList list = NULL;
int n; //人數
int m; //報數號

//n為總人數,k為第一個開始報數的人,m為出列者喊到的數
void JosephRing(int n, int k, int m)
{
LinkList p, r; /* p為當前結點,r為輔助結點,指向p的前驅結點*/

for(int i = 1; i <= n; i++) /*建立循環隊列*/
{
p = (LinkList)malloc(sizeof(LNode));
p->data = i;
if(list == NULL) list = p;
else r->next = p;
r = p;
}
p->next = list; /*使隊列循環起來*/
p = list; /*使p指向頭節點*/

/*把當前指針移動到第一個報數的人*/
for(i = 1; i < k; i++)
{
r = p;
p = p->next;
}

/*循環地刪除隊列結點*/
while(p->next != p)
{
for(i = 1; i < m; i++)
{
r = p;
p = p->next;
}
r->next=p->next;
cout<<p->data<<endl;
free(p);
p=r->next;
}
cout<<endl<<"最終剩下的人為: "<<p->data<<endl;
}

int main()
{
int m,n,i;
cout<<"請輸入人數n: ";
cin>>n;

cout<<"請輸入開始位置i: ";
cin>>i;

cout<<"請輸入報數m: ";
cin>>m;

cout<<"出隊順序如下: "<<endl;
JosephRing(n, i, m);

system("pause");
return 1;
}

I. 求一個,循環隊列解決約瑟夫環問題的C語言程序,謝謝

正好我以前寫的這個還留著,如下:
n為人數,m是初始隨機數
#include<stdio.h>

int main(void)
{
int m,n,i,j,k,times,num,a[2][100],b[100];
scanf("%d %d",&n,&m);
k=0;
if(n>0&&n<100)
{
for(num=1;num<n+1;num++)
{
scanf("%d",&a[0][num]);
a[1][num]=1;
}
for(j=0,i=1,times=1;times<=n;i++)
{

if(a[1][i]==1)
j++;
else
;
if(j==m)
{
a[1][i]=0;
j=0;
m=a[0][i];
b[k]=i;
k++;
times++;
}
if(i>=n)
i=0;
}
for(num=0;num<n;num++)
printf("%d ",b[num]);
}
return 0;
}

J. 約瑟夫環用C循環鏈表解

約瑟夫環問題的參考程序:
#include "stdio.h"
#include "stdlib.h"
typedef struct node
{ int data;
struct node *next;
}JD;
JD *xhlbjl(JD *front, JD *rear,int n)
{ /*建立循環隊列*/
int i;

front=(JD *)malloc(sizeof(JD));
front->data=n; /*頭指針指向n號*/
front->next=front;
for (i=n-1;i>0;i--)
{ rear=(JD *)malloc(sizeof(JD));
rear->data=i;
rear->next=front->next;
front->next=rear;
}
return(front);
}

JD *outqueue(JD *front, JD *rear,int m) /*出隊列*/
{int i,s;

for (i=0;i<s-1;i++)
front=front->next;
return(front);
}
main()
{ JD *h,*p,*q,*s;
int i,j,m,n;
printf("請輸入人數 ");
scanf("%d",&n);
h=xhlbjl( p,q,n);
p=h->next;
printf("坐成一圈的人是: ");
for(i=1;i<=n;i++)
{ printf("%3d",p->data);
p=p->next;
}
printf("\n請輸入開始位置 ");
scanf("%d",&s);
printf("數幾個出去 ");
scanf("%d",&m);
s=outqueue(p,q,m);

q=s;
p=s->next;
for(j=0;j<n;j++)
{ for (i=1;i<m;i++)
{ q=p;
p=p->next;
}
printf("\n出列的人是第 %d 號",p->data);
q->next=p->next;
free(p);
p=q->next;
}

}