
c约瑟夫环问题 问题描述:设编号为1,2,…,n(n>0)个人按顺时针方向围坐-圈,每人持有一个正整数密码。开始 10
#include<stdio.h>#include<malloc.h>typedefintDatetype;//----------声明结点-------------ty...
#include<stdio.h>
#include<malloc.h>
typedef int Datetype;
//----------声明结点-------------
typedef struct node{
int state;
struct node* next;
}ListNode;
//--------主程序------------
int main()
{
int i,n,Num[10];
ListNode *h;
printf("输入人数");
scanf("%d",&n);
h=CreatList(n);
for(i=1,i<=n,i++)
{
h->state =n;//把编号从链表头结点开始传给链表
h=h->next;
printf("输入第%d个人的密码",i);
scanf("%d",&Num[i]);
p->Num[i]=m;
}
PrintList(h,Num,n);
return 0;
}
//---------创建链表-----------
ListNode *CreatList(int n){
ListNode *p,*pre;
ListNode *head;
head=(ListNode*)malloc(sizeof(ListNode));
head->next =Null;
pre=head;
for(int i=0;i<n,i++){
p=(ListNode*)malloc(sizeof(ListNode));
pre->next =p;/*将p指向的新结点插入链表*/
pre=p;
}
p->next =head;//循环链表
return head;
}
//----------主要操作 输出链表------------
ListNode *PrintList(ListNode *h,int Num,int n){
ListNode *p,*q;
p=h;
while(p->next !=Null&&Num>0)
{
for(int i=0,i<n,i++){
int j=0;
while(j<Num[j+1]-1)//在前一个位子停下经行去结点操作
{
p=p->next ;
j++
}
q=p->next;
p->next=q->next
printf("%d",&q->state );//输出编号第21行定义
free(q);
p=p->next ;//p指向下一个结点
}
}
} 展开
#include<malloc.h>
typedef int Datetype;
//----------声明结点-------------
typedef struct node{
int state;
struct node* next;
}ListNode;
//--------主程序------------
int main()
{
int i,n,Num[10];
ListNode *h;
printf("输入人数");
scanf("%d",&n);
h=CreatList(n);
for(i=1,i<=n,i++)
{
h->state =n;//把编号从链表头结点开始传给链表
h=h->next;
printf("输入第%d个人的密码",i);
scanf("%d",&Num[i]);
p->Num[i]=m;
}
PrintList(h,Num,n);
return 0;
}
//---------创建链表-----------
ListNode *CreatList(int n){
ListNode *p,*pre;
ListNode *head;
head=(ListNode*)malloc(sizeof(ListNode));
head->next =Null;
pre=head;
for(int i=0;i<n,i++){
p=(ListNode*)malloc(sizeof(ListNode));
pre->next =p;/*将p指向的新结点插入链表*/
pre=p;
}
p->next =head;//循环链表
return head;
}
//----------主要操作 输出链表------------
ListNode *PrintList(ListNode *h,int Num,int n){
ListNode *p,*q;
p=h;
while(p->next !=Null&&Num>0)
{
for(int i=0,i<n,i++){
int j=0;
while(j<Num[j+1]-1)//在前一个位子停下经行去结点操作
{
p=p->next ;
j++
}
q=p->next;
p->next=q->next
printf("%d",&q->state );//输出编号第21行定义
free(q);
p=p->next ;//p指向下一个结点
}
}
} 展开
2个回答
展开全部
#include<iostream>
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
typedef int Status;
typedef double ElemType;
//-----------------------------------
//定义单向循环链表
typedef struct LNode
{
int number;
int data;
struct LNode *next;
}LNode, *LinkList;
//-----------------------------------
LinkList EvaluList(int n);//对单向循环链表进行尾插入赋值
int size(LinkList L);//求链表的节点个数
Status ScanList(LinkList L);//遍历单向循环链表
Status Joseph(LinkList &L,int m);//约瑟夫环的实现
//-------------------------------------------------
void main()
{
int m,n;
cout<<"请输入初始密码(正整数)和人数"<<endl;
cin>>m>>n;
cout<<endl<<"请输入"<<n<<"个人的密码"<<endl<<endl;
LinkList L=EvaluList(n);
cout<<n<<"个人的密码为"<<endl;
ScanList(L);
cout<<n<<"个人的出列顺序为"<<endl;
Joseph(L,m);
}
//---------对单向循环链表进行尾插入赋值----------------
LinkList EvaluList(int n)
{
if(n==0)
return NULL;
int key;
cout<<"输入第1个人的密码 ";
cin>>key;
LinkList L=new LNode;
L->data=key;
L->number=1;
L->next=L;
for(int i=2;i<=n;i++)
{
LinkList p=new LNode;
int key;
cout<<"输入第"<<i<<"个人的密码 ";
cin>>key;
p->data=key;
p->number=i;
p->next=L->next;
L->next=p;
L=L->next;
}
cout<<endl;
L=L->next;
return L;
}
//---------------求链表的节点个数-------------------
int size(LinkList L)
{
if(L==NULL)
return 0;
int i=1;
LinkList p=L->next;
while(p!=L)
{
i++;
p=p->next;
}
return i;
}
//---------------遍历单向循环链表--------------------
Status ScanList(LinkList L)
{
LinkList p=L;
if(p==NULL)
{
cout<<"人数为空"<<endl;
return FALSE;
}
cout<<"第1个人的密码 ";
cout<<p->data<<endl;
p=p->next;
while(p!=L)
{
cout<<"第"<<p->number<<"个人的密码 ";
cout<<p->data<<endl;
p=p->next;
}
cout<<endl;
return TRUE;
}
//----------------约瑟夫环的实现-----------------------
Status Joseph(LinkList &L,int m)
{
if(L==NULL)
{
cout<<"人数为空,出列结束"<<endl;
return FALSE;
}
LinkList p=L;
while(p->next!=L)
p=p->next;
for(int n=size(L); n>0 ; n--)
{
cout<<"密码为"<<m<<",出列编号为";
for(int i=1; i<=m%n-1; i++)
p=p->next;
cout<<p->next->number<<endl;
m=p->next->data;
LinkList q=p->next;
p->next=q->next;
free(q);
}
return OK;
}
展开全部
#include <iostream>
using namespace std;
int main()
{
int n; //一共n个人
int m; //数到m的人做处理
cin>>n>>m;
int a[100];
for(int j=0;j<=n+1;j++)
{
a[j]=1;
}
int count=0; //从1数到count , 与m做比较
int outNum=0; //出列的个数
int i=0;
while(outNum<n)
{
if(a[i]==1)
count++;
if(count==m)
{
cout<<i+1<<" ";
a[i]=0;
count=0; //从新开始数数
}
i++;
if(i==n)
i=0;
// i++;
}
return 0;
}
using namespace std;
int main()
{
int n; //一共n个人
int m; //数到m的人做处理
cin>>n>>m;
int a[100];
for(int j=0;j<=n+1;j++)
{
a[j]=1;
}
int count=0; //从1数到count , 与m做比较
int outNum=0; //出列的个数
int i=0;
while(outNum<n)
{
if(a[i]==1)
count++;
if(count==m)
{
cout<<i+1<<" ";
a[i]=0;
count=0; //从新开始数数
}
i++;
if(i==n)
i=0;
// i++;
}
return 0;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询