约瑟夫环的问题,我给你一个,程序首先输入小孩子个数,然后输入W
首先输出每个小孩子的编号,然后输出出列的数序,最后输出留下的小孩的编号
#include<stdioh>
int Josephus(int Child,int n,int m);
void main()
{
int allChild,j,k,l;
scanf("%d%d",&j,&k);
//cin>>j>>k;
if((allChild= new int[j])!=NULL)
{
for(l=0;l<j;l++)
{
printf("%d,",l+1);
//cout<<l+1<<",";
allChild[l]=l+1;
}
printf("\n");
//cout<<endl;
printf("%d",Josephus(allChild,j,k));
//cout<<Josephus(allChild,j,k);
}
}
int Josephus(int Child,int n,int m)
{
int i=-1,j=0,k=1;
while(1)
{
for(j=0;j<m;)
{
i=(i+1)%n;
if(Child[i]!=-1)
j++;
}
if(k==n)
break;
//cout<<Child[i]<<",";
printf("%d,",Child[i]);
Child[i]=-1;
k=k+1;
}
printf("\n");
//cout<<endl;
return(Child[i]);
}
我这有个类似的,你根据你的需求改一下就可以了
—————————————————————————
#include<stdioh>
#include<malloch>
typedef struct tagRing_t
{
int Num;
struct tagRing_t pnext;
}Ring_t;
int InitRing(Ring_t pstRing)
{
pstRing = (Ring_t )malloc(sizeof(Ring_t));
if (NULL == pstRing)
{
return 0;
}
(pstRing)->Num = 1;
(pstRing)->pnext = pstRing;
return 1;
}
int CreateRing(Ring_t pstRing, int iNum)
{
int i = 0;
Ring_t pstTemp = NULL, pst = NULL;
if (iNum < 1)
{
return 0;
}
pstTemp = pstRing;
for (i = 0; i < iNum; i++)
{
if (0 == i)
{
(pstRing)->Num = 1;
}
else
{
pst = (Ring_t )malloc(sizeof(Ring_t));
if (NULL == pst)
{
return 0;
}
pst->Num = i + 1;
pstTemp->pnext = pst;
pst->pnext = pstRing;
pstTemp = pstTemp->pnext;
}
}
return 1;
}
int DeleteNode(Ring_t pstRing, int s, int iNum)
{
int i = 0;
Ring_t pstTemp = pstRing, pst = NULL;
while (pstTemp->pnext != pstRing)
{
pstTemp = pstTemp->pnext;
}
for (i = 1; i < s; i++)
{
pstTemp = pstTemp->pnext;
}
while (pstTemp->pnext != pstTemp)
{
for (i = 1; i < iNum; i++)
{
pstTemp = pstTemp->pnext;
}
pst = pstTemp->pnext;
pstTemp->pnext = pst->pnext;
printf(" %d ", pst->Num);
free (pst);
pst = NULL;
}
printf(" %d\n", pstTemp->Num);
free (pstTemp);
pstTemp = NULL;
return 1;
}
int main()
{
Ring_t pstRing = NULL;
int n = 0, s = 0, m = 0;
InitRing(&pstRing);
printf("请输入n, s 和 m的值:");
scanf("%d %d %d", &n, &s, &m);
CreateRing(&pstRing, n);
printf("出列顺序为: ");
DeleteNode(&pstRing, s, m);
return 1;
}
正好之前写过基础的约瑟夫环,稍作修改就可以满足你的题目
#include <stdioh>#include <stdlibh>
typedef struct _node {
int id;
int key;
struct _node next;
} Linklist;
int main() {
int n, m;
scanf("%d %d", &n, &m);
int i, count = 0;
Linklist head = (Linklist)malloc(sizeof(Linklist)), tail = head;
head->id = 1;
scanf("%d", &head->key);
head->next = head;
for(i = 2; i <= n; i++) {
Linklist p = (Linklist)malloc(sizeof(Linklist));
p->id = i;
scanf("%d", &p->key);
p->next = head;
tail->next = p;
tail = p;
}
while(head != tail) {
if(++count % m) {
tail = head;
} else {
m = head->key;
count = 0;
printf("%d ", head->id);
tail->next = head->next;
free(head);
}
head = tail->next;
}
printf("%d\n", head->id);
free(head);
return 0;
}
楼主好,约瑟夫问题的
程序如下:
#include<stdioh>
int
main()
{
int
i,k,m,n,num[50],p;
int
n;
printf("输入两个数字n和m:\n");
scanf("%d",&n);
while(scanf("%d",&n)!=eof)
{
if(n==0)
return
0;
else
{
p=num;
for(i=0;i<n;i++)
(p+i)=i+1;
i=0;
k=0;
m=0;
}
while(m<n-1)
{
if((p+i)!=0)
k++;
if(k==n)
{
(p+i)=0;
k=0;
m++;
}
i++;
if(i==n)i=0;
}
while(p==0)
p++;
printf("%d\n",p);
}
}
望采纳哦~~
#include<iostream>
using namespace std;
struct Node//循环节点的定义
{
int number;//编号
Node next;
};
Node CreateList(Node L,int &n,int &m);//建立约瑟夫环函数
void Joseph(Node L,int n,int m);//输出每次出列号数函数
Node DeleteList(Node L,int i,Node q);//寻找每次出列人的号数
int LengthList(Node L);//计算环上所有人数函数
void main()//主函数
{
Node L;
L=NULL;//初始化尾指针
int n, m;
cout<<"请输入人数N:";
cin>>n;//环的长度
if(n<1){cout<<"请输入正整数!";}//人数异常处理
else
{
cout<<"请输入所报数M:";
cin>>m;
if(m<1){cout<<"请输入正整数!";}//号数异常处理
else
{
L=CreateList(L,n,m);//重新给尾指针赋值
Joseph(L,n,m);
}
}
system("pause");
}
Node CreateList(Node L,int &n,int &m)//建立一个约瑟夫环(尾插法)
{
Node q;
for(int i=1;i<=n;i++)
{
Node p;
p=new Node;
p->number=i;
p->next=NULL;
if(i==1) L=q=p;//工作指针的初始化
else
{
q->next=p;
q=q->next;
}
}
q->next=L;
if(L!=NULL){return(L);}//返回尾指针
else cout<<"尾指针异常!"<<endl;//尾指针异常处理
}
void Joseph(Node L,int n,int m)//输出每次出列的人
{
int k;
cout<<"请输入第一个报数人:";
cin>>k;
if(k<1||k>n){cout<<"请输入1-"<<n<<"之间的数"<<endl;}
else
{
cout<<"\n出列顺序:\n";
for(int i=1;i<n;i++)
{
Node q = new Node;
if(i==1) q=DeleteList(&L,k+m-1,q);//第一个出列人的号数
else q=DeleteList(&L,m,q);
cout<<"号数:"<<q->number<<endl;
delete q;//释放出列人的存储空间
}
cout<<"最后一个出列号数是:"<<L->number<<endl;;//输出最后出列人的号数
}
}
Node DeleteList(Node L,int i,Node q) //寻找每次出列的人
{
if(i==1) i+=LengthList(L);//顺序依次出列情况的处理方式
Node p;
p=L;
int j=0;
while(j<i-2) {p=p->next;j++;}
q = p->next;
p->next=p->next->next;
L = p->next;
return(q);
}
int LengthList(Node L)//计算环上的人数
{
if(L){cout<<"尾指针错误!"<<endl;}//异常处理
else
{
int i=1;
Node p=L->next;
while(p!=L)
{
i++;
p=p->next;
}
return(i);
}
}
首先,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仍然指向头结点,也就保持了链表仍然是循环链表。
以上就是关于C语言编程求解约瑟夫问题全部的内容,包括:C语言编程求解约瑟夫问题、约瑟夫问题(c语言)、用c语言实现约瑟夫环等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)