#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;
}
不知道你这个问题是否已经解决, 如果还没有解决的话: