利用表链实现循环报数退圈


#include<stdio.h>
int main()
{
    struct person
    {
        int num;
        struct person *next;
    }a[13],*head,*p;
    int i,count=0,n=13;
    head=a;
    for(i=0;i<12;i++)
    {
        a[i].num=i+1;
        a[i].next=&a[i+1];
    }
    a[12].next=NULL;
    p=a;
    while(n>1)
    {
        if(p->num!=0)
        {
            count++;
            if(count==3)
            {
                p->num=0; 
                count=0;
                n--;
            }
        }
        p++;
        if(p==NULL) p=head;
    }
    for(p=head;p!=NULL;p++)
    if(p->num!=0) printf("%d",p->num);
    return 0;
} 

13个人围成一圈,从第一个人开始报数123,凡是报到3的退出圈子,用表链实现。我的代码哪一步有问题,最后输出结果是什么都没有

题主的代码修改如下,改动处见注释,供参考:

#include<stdio.h>
int main()
{
    struct person
    {
        int num;
        struct person *next;
    }a[13],*head,*p;
    int i,count=0,n=13;
    head=a;
    for(i=0;i<12;i++)
    {
        a[i].num=i+1;
        a[i].next=&a[i+1];
    }
    a[12].num=13;    // 修改
    a[12].next=NULL;
    p=a;
    while(n > 1)
    {
        if(p->num!=0)
        {
            count++;
            if(count==3)
            {
                p->num=0;
                count=0;
                n--;
            }
        }
        p=p->next; //p++;  修改
        if (p==NULL) p=head;
    }
    for(p=head;p!=NULL;p=p->next) //for(p=head;p!=NULL ;p++) 修改
        if(p->num!=0) printf("%d",p->num);
    return 0;
}

你的代码既然是链表,为什么又定义了数组。你根本就是数组在做,根本没体现出链表,而且数组也没弄对。

链表的思路应该是让最后一个人指向第一个人,然后不断删除,直到某个节点的next还是他,说明他就是剩下的了。

#include <stdio.h>
#include <stdlib.h>

struct person
{
    int num;
    struct person* next;
};

int main()
{
    struct person* L = NULL;
    struct person* current = NULL;

    for (int i = 1; i <= 13; i++)
    {
        struct person* newNode = (struct person*)malloc(sizeof(struct person));
        newNode->num = i;
        newNode->next = NULL;

        if (L == NULL)
        {
            L = newNode;
            current = L;
        }
        else
        {
            current->next = newNode;
            current = current->next;
        }
    }

    current->next = L;

    struct person* prev = current;
    current = L;
    while (current->next != current)
    {
        for (int i = 0; i < 2; i++)
        {
            prev = prev->next;
            current = current->next;
        }
        printf("出队 %d\n", current->num);
        prev->next = current->next;
        current = current->next;
    }

    printf("节点编号为:\n");
    printf("%d ", current->num);

    return 0;
}

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^