您的位置:

c语言猴子选大王增强版,猴子选大王c语言pta

本文目录一览:

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);

}