急求C语言关于约瑟夫环问题,关于指针
2个回答
2013-12-06
展开全部
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define ElemType int
typedef int Status;// 链表类型
typedef struct Node
{
ElemType data;
struct Node *next;
} Node, *LinkList;// 判断存储分配是否成功
Status MallocOK(LinkList P)
{
if(P) return(1);
printf("\n Malloc Error \n");
return(0);
}// 建立一个带头结点的、能够产生n个数据元素的线性链表L
void CreateJosephus(LinkList &L,int n)
{
L=(LinkList) malloc(sizeof(Node));
if (MallocOK(L)==0) return;
L->next=L;
LinkList p,q=L;
int i;
for (i=1; i<=n; ++i)
{
p = (LinkList)malloc(sizeof(Node)); //生成新结点
if (MallocOK(p)==0) return;
q->next=p;
p->data=rand()%100+1;
q=p;
}
p->next=L;
}// 输出线性链表L中的所有数据元素
void PrintJosephus(LinkList L)
{
LinkList p=L->next;
printf("\nJosephus = ( ");
while (p!=L && L->next!=L)
{
printf("%d ",p->data);
p=p->next;
}
printf(")\n");
}// 销毁线性链表L
void DestroyJosephus(LinkList &L)
{
free(L); L=NULL;
printf("\n线性链表L已销毁\n");
}// 根据计数情况依次弹出线性链表L中的n个数据元素
void Josephus(LinkList &L,int n,int k,int m)
{
int j=0;
int i=1;
LinkList q,p=L->next;
while (i<k)
{
++i;
p=p->next;
if (p==L) p=p->next;
}
printf("\nResult is ( ");
while (j<n)
{
i=1; //指针指向第m个结点
while (i<m)
{
++i;
p=p->next;
if (p==L) p=p->next;
}
printf("%d ",p->data); //输出被弹元素
q=p->next;
if (q==L) q=q->next;
p->data=q->data;
p->next=q->next;
free(q); //删除并释放结点
++j;
}
printf(")\n");
}
void main()
{
LinkList L;
int n0,k0,m0;
printf("\nPlease input Terms n = ");
scanf("%d",&n0);
if (n0<1)
{
printf("\n%d < 1\n",n0);
return;
}
CreateJosephus(L,n0);
PrintJosephus(L); printf("\nPlease input k, m = ");
scanf("%d, %d",&k0,&m0);
if (n0>0 && k0>0 && m0>0) Josephus(L,n0,k0,m0); DestroyJosephus(L);
}
#include <malloc.h>
#include <stdlib.h>
#define ElemType int
typedef int Status;// 链表类型
typedef struct Node
{
ElemType data;
struct Node *next;
} Node, *LinkList;// 判断存储分配是否成功
Status MallocOK(LinkList P)
{
if(P) return(1);
printf("\n Malloc Error \n");
return(0);
}// 建立一个带头结点的、能够产生n个数据元素的线性链表L
void CreateJosephus(LinkList &L,int n)
{
L=(LinkList) malloc(sizeof(Node));
if (MallocOK(L)==0) return;
L->next=L;
LinkList p,q=L;
int i;
for (i=1; i<=n; ++i)
{
p = (LinkList)malloc(sizeof(Node)); //生成新结点
if (MallocOK(p)==0) return;
q->next=p;
p->data=rand()%100+1;
q=p;
}
p->next=L;
}// 输出线性链表L中的所有数据元素
void PrintJosephus(LinkList L)
{
LinkList p=L->next;
printf("\nJosephus = ( ");
while (p!=L && L->next!=L)
{
printf("%d ",p->data);
p=p->next;
}
printf(")\n");
}// 销毁线性链表L
void DestroyJosephus(LinkList &L)
{
free(L); L=NULL;
printf("\n线性链表L已销毁\n");
}// 根据计数情况依次弹出线性链表L中的n个数据元素
void Josephus(LinkList &L,int n,int k,int m)
{
int j=0;
int i=1;
LinkList q,p=L->next;
while (i<k)
{
++i;
p=p->next;
if (p==L) p=p->next;
}
printf("\nResult is ( ");
while (j<n)
{
i=1; //指针指向第m个结点
while (i<m)
{
++i;
p=p->next;
if (p==L) p=p->next;
}
printf("%d ",p->data); //输出被弹元素
q=p->next;
if (q==L) q=q->next;
p->data=q->data;
p->next=q->next;
free(q); //删除并释放结点
++j;
}
printf(")\n");
}
void main()
{
LinkList L;
int n0,k0,m0;
printf("\nPlease input Terms n = ");
scanf("%d",&n0);
if (n0<1)
{
printf("\n%d < 1\n",n0);
return;
}
CreateJosephus(L,n0);
PrintJosephus(L); printf("\nPlease input k, m = ");
scanf("%d, %d",&k0,&m0);
if (n0>0 && k0>0 && m0>0) Josephus(L,n0,k0,m0); DestroyJosephus(L);
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐于2018-03-21
展开全部
以前做过一个,函数结合指针的,还有用单链表处理的,给你贴一个,仅供参考 #include<stdio.h>
#include<stdlib.h>
//应用函数调用来实现
void Fun_Kill(int *pa,int n,int m)
{
for(int i=0;i<n;i++)
{
*(pa+i)=i+1;//给每个人编号
}
i=0;
int mCount=0;
int iCount=0;
while(iCount<n-1)//控制循环条件:出局人数小于总人数
{
if(*(pa+i)!=0)//报数条件,编号不为0
{
mCount++;
}
if(mCount==m)
{
printf("%d is out!\n",*(pa+i));//输出出局者的编号
mCount=0;//重新开始报数
iCount++;//出局人数统计
*(pa+i)=0;//出局者编号改为0,下次报数不进入计数
}
i++;//报数的同时指针也开始走动
if(i==n)
{
i=0;//当i==n的时候,让i=0,让指针重新指向第一个人,循环计数
}
}
for(i=0;i<n;i++)
{
if(*(pa+i)!=0)
{
printf("%d is survival!",*(pa+i));
}
}
}int main()
{
int n,m;
printf("请输入总人数:");
scanf("%d",&n);
printf("请输入要报的数:");
scanf("%d",&m);
int *pKill=(int *)malloc(sizeof(int)*n);
Fun_Kill(pKill,n,m);
free(pKill);
pKill=NULL;
return 0;
}
#include<stdlib.h>
//应用函数调用来实现
void Fun_Kill(int *pa,int n,int m)
{
for(int i=0;i<n;i++)
{
*(pa+i)=i+1;//给每个人编号
}
i=0;
int mCount=0;
int iCount=0;
while(iCount<n-1)//控制循环条件:出局人数小于总人数
{
if(*(pa+i)!=0)//报数条件,编号不为0
{
mCount++;
}
if(mCount==m)
{
printf("%d is out!\n",*(pa+i));//输出出局者的编号
mCount=0;//重新开始报数
iCount++;//出局人数统计
*(pa+i)=0;//出局者编号改为0,下次报数不进入计数
}
i++;//报数的同时指针也开始走动
if(i==n)
{
i=0;//当i==n的时候,让i=0,让指针重新指向第一个人,循环计数
}
}
for(i=0;i<n;i++)
{
if(*(pa+i)!=0)
{
printf("%d is survival!",*(pa+i));
}
}
}int main()
{
int n,m;
printf("请输入总人数:");
scanf("%d",&n);
printf("请输入要报的数:");
scanf("%d",&m);
int *pKill=(int *)malloc(sizeof(int)*n);
Fun_Kill(pKill,n,m);
free(pKill);
pKill=NULL;
return 0;
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询