编辑代码

#include <stdio.h>
#include <stdlib.h>
#define N 14
struct circle{
    int num;
    struct circle *next;
};
int main () {
    struct circle *head;
    struct circle *p1,*p2;
    int n=1;
    p1=p2=(struct circle *)malloc(sizeof(struct circle));
    p1->num=1;
    while(p1->num!=N+1){
        if(n==1){//判断是否为第一个头结点
            head=p1;//如果是第一个节点 则用head指向该结点
        }else{
            p2->next=p1;//如果不是头结点 则将p2的next指向该结点
        }
        p2=p1;//p2后移一个结点
        p1=(struct circle *)malloc(sizeof(struct circle));
        n++;
        p1->num=n;
        //p2后移后即可表示上一个结点已经被连
        //接上了,此时申请新的一个结点并用p1指向该空间
    }
    p2->next=head;//将最后一个指针指向头结点即可形成循环链表
    p1=head;
    for(int i=0;i<N;i++){
        printf("%d\n",p1->num);
        p1=p1->next;
    }
    p1=head;
    int sum=0;
    for(int j=0;j<N-1;){
        if(p1->num!=0){
            sum++;
        }
        if(sum==3){
            p1->num=0;
            j++;
            sum=0;
        }
        p1=p1->next;
    }
    // printf("~~\n");
    while(p1->num==0){
        p1=p1->next;
    }
    printf("最后剩下的数为%d",p1->num);
	return 0;
}