单循环链表
一个游戏,数到第n人出列
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct People
{
int num;
struct People* next;
};
struct People* creat(struct People** head,int N)
{
struct People* tail, * p;
tail = p = (struct People*)malloc(sizeof(struct People));
int i = 1;
for ( i = 1; i <= N; i++)
{
p->num = i ;
if (*head==NULL)
{
*head = tail = p;
}
else
{
tail->next = p;
tail = p;
}
p = (struct People*)malloc(sizeof(struct People));
}
tail->next = (*head);
return *head;
}
void Print(struct People** head)
{
struct People* p;
p = (struct People*)malloc(sizeof(struct People));
printf("链表为:\n");
for (p = (*head); p->next != (*head); p = p->next)
{
printf("%d\t", p->num);
}
printf("%d", p->num);
printf("\n");
}
void Findpeople(struct People** head,int N,int n)
{
int count, i;
struct People* temp,*p;
p = temp = (struct People*)malloc(sizeof(struct People));
p= *head;
for (count=1;count<N;count++)//从第一个人开始报数,直到剩下一个人,才结束
{
for ( i = 1; i < n; i++)
{
temp = p;//记录上一个节点的位置
p = p->next;
}
temp->next = p->next;//使前一个节点指向下下一个节点,起到删除节点的作用
//例如:要删除序号为3的人,则要使2指向4
printf("序号为%d的人出列\n", p->num);
free(p);
p = temp->next;//使p指向出列数的下一个数,游戏继续
}
printf("剩下的最后一个人的序号是%d\n", temp->num);
}
int main()
{
int N, n;
printf("请输入总人数:\n");
scanf("%d", &N);
printf("数到n的人出列,请输入n的值:\n");
scanf("%d", &n);
struct People* head;
head = NULL;
head=creat(&head,N);
Print(&head);
Findpeople(&head, N,n);
return 0;
}