本文目录一览:
C 语言中关于猴子选大王的代码
注释写得很清楚 相信你能看懂 #include stdio.h
#include stdlib.h
#define MAXSIZE 100
typedef struct Node
{
int data;//存储猴子编号
struct Node *next;
}*List;
/* 用链表来得出大王的序号 */
int LinkedList(int num_monkey,int number);
/* 用顺序表来得出大王的序号 */
int SequenceList(int num_monkey,int number);
/* 创建循环单链表 */
List CreateList(int n);
void main()
{
int m, n, way, king;
printf("请输入猴子个数:");
scanf("%d", n);
printf("请输入要报的数:");
scanf("%d", m);
while (1)
{
printf("\n请选择解决问题的方法:\n");
printf("1.单链表\n");
printf("2.顺序表\n");
scanf("%d", way);
if (way == 1)
{
king = LinkedList(n,m);
break;
}
else if (way == 2)
{
king = SequenceList(n,m);
break;
}
else
{
printf("输入不合法!\n");
}
}
printf("%d号猴子是大王\n", king);
}
/* 创建循环单链表 */
List CreateList(int n)
{
int i;
List head, p;
head = (List)malloc(sizeof(struct Node));
head-next = head;
for (i = 1; i n; ++i)
{
p = (List)malloc(sizeof(struct Node));
p-next = head-next;
head-next = p;
}
p = head;
for (i = 0; i n; ++i)
{
p-data = i+1;
p = p-next;
}
return head;
}
/* 用链表来得出大王的序号 */
int LinkedList(int num_monkey,int number)
{
int i,j;
List head = CreateList(num_monkey);
List tail = head;//用来存储最后一个节点的地址
List out,p;//out指向要淘汰的节点,p指向其前一个节点
/* 让tail指向最后一个节点 */
for (i = 1; i num_monkey; i++)
{
tail = tail-next;
}
/* 淘汰的猴子个数比总个数少1,报数一轮就淘汰一个猴子,所以需要报数的轮数比
猴子总个数少1*/
for( i = 1; i num_monkey; i++ )
{
p = tail;
/* 让p指向要淘汰的猴子的前一个 */
for ( j = 1; j number; j++ )
{
p = p-next;
}
out = p-next;
/* 如果最后一个猴子被淘汰就更新尾节点 */
if (out == tail)
{
tail = p;
}
p-next = out-next;
printf("猴子%d淘汰\n", out-data);
free(out);//删除被淘汰猴子的节点
}
return p-data;
}
/* 用顺序表来得出大王的序号 */
int SequenceList(int num_monkey,int number)
{
/* 用来表示个猴子的信息,如果猴子出局就存储0,否则存储1。第一个元素不使用 */
int monkey[MAXSIZE];
/* 用来表示出局的猴子的序号 */
int out = 1;
/* 用来表示当前猴子的个数 */
int num_now = num_monkey;
int i,j;
for (i = 0; i num_monkey+1; i++)
{ /* 开始将每个元素置1 */
monkey[i] = 1;
}
/* 报数次数比猴子个数少一 */
for (i = 1; i num_monkey; i++)
{
out = 1;
/* 报数整个过程 */
for (j = 0; j number; j++)
{
/* 如果序号数大于猴子个数,表示循环了一圈,那么去掉那个圈数 */
if (out num_monkey)
out -= num_monkey;
/* 之前已经出局的猴子不参加报数 */
while(monkey[out] == 0)
{
out ++;
/* 如果序号数大于猴子个数,表示循环了一圈,那么去掉那个圈数 */
if (out num_monkey)
out -= num_monkey;
}
out++;
}
out--;//报完数后out应该是被淘汰的猴子的下一个,所以要向前移动
monkey[out] = 0;
printf("猴子%d淘汰\n",out);
}
while(monkey[out] == 0)
{
out ++;
/* 如果序号数大于猴子个数,表示循环了一圈,那么去掉那个圈数 */
if (out num_monkey)
out -= num_monkey;
}
return out;
}
C语言猴子选大王的问题?
因为你让猴子的编号从0开始的。
head-num=0; ——虽然这一语句被注释掉了,的num的值还是有的(随机),但只要不是0(且它又没有当上大王),就不影响运行。
猴子选大王,C语言描述 请相信解释我的代码!
给你原文做了注释。还不懂hi我
#include stdio.h
#includemalloc.h
typedef struct LNode
{
int num;
struct LNode *next;
}LNode, *LinkList; //定义结点
LinkList InitList(LinkList L,int n) //初始化循环链表
{
LinkList p,q;
int i;
L = (LinkList)malloc(sizeof(LNode)); //头结点
L-num = 1; //一号猴子
q=L;
for(i = 2; i = n; i++) //从二号猴子开始生成结点
{
p = (LinkList)malloc(sizeof(LNode));
p-num = i;
q-next=p;
q=p;
}
q-next = L; //使链表循环起来
return L;
}
void ListDelete_L(LinkList L,int n)
{
LinkList p,q;
int j=1; //j为计数器
p=L;
while(p-next!=p) //p-next=p时是只剩一个结点。
{
while(j!=n-1) //当j=n-1时应该将该结点的下一个结点删除。当就j!=n-1时就应该指针向后移,同时计数器加一
{
p=p-next;
j++;
}
q=p-next; //q即为被点到的猴子
p-next=p-next-next; //删除q结点
printf("%d\n",q-num);
free(q);//释放
j=0; //计数器清零,重新开始计数
}
printf("%d",p-num);//此时的结点就是大王
free(p);
}
int main()
{
LinkList L=NULL;
int n,m,e=0;
printf("请输入猴子个数:");
scanf("%d",m);
printf("请输入n值:");
scanf("%d",n);
if(mn){printf("m应该 大于n请重新输入");return 0 ;
}
L=InitList(L,m);
printf("出列的顺序为:");
ListDelete_L( L,n);
return 0;
}
c语言链表问题,猴子选大王,哪位大神能帮我看看
#include stdio.h
#include stdlib.h
typedef int status;
typedef int ElemType;
typedef struct NODE_MONKY
{
ElemType serial_number;
struct NODE_MONKY *next;
}LNode, *LinkList;
void Build(LinkList L,int n){
LinkList p,q;
p = L;
for(int i=0;in;i++)
{
printf("%d\n",i+1);
q = (LinkList)malloc(sizeof(LNode));
q - serial_number = i+1;
q - next = NULL;
p - next = q;
p = q;
}
p - next = L-next;
}
void Print(LinkList L,int x)//计算单链表的长度,然后输出单链表
{
LinkList p;
p=L-next;
while(x--)
{
printf("%d ",p-serial_number);
p=p-next;
}
}
void Delete(LinkList L,int x,int y)//删除值为x的结点
{
LinkList p,q;
p=L-next;
for (int i = 1; i y; i++)
{
for(int j = 2; j x ; j++)
{
p = p-next;
printf("serial_number change = %d\n",p-serial_number);
}
q = p-next;
p-next = q-next;
printf("delete %d success\n",q-serial_number);
printf("p-serial_number = %d\n",p-serial_number);
free(q);
q = NULL;
p = p-next;
printf("p-serial_number now = %d\n",p-serial_number);
}
}
int main()
{
int m,n;
LinkList L,p,q;
L = (LinkList)malloc(sizeof(LNode));
L - next = NULL;
L - serial_number = 1;
printf("please input the number of mounky.\n");
scanf("%d",n);
Build(L,n);
Print(L,n);
printf("Please input the number M\n");
scanf("%d",m);
Delete(L,m,n);
}