#include<stdio.h>
#include<stdlib.h>
typedef struct Student
{
char Name[15];
struct Student* pNext;
}Student,*pStudent;
void Create(pStudent pHead,int N)
{
pStudent pNew,pEnd;
pEnd=pHead;
scanf("%d",&N);
int i;
while(i<N)
{
pNew=(pStudent)malloc(sizeof(Student));
scanf("%s",&pNew->Name );
pEnd->pNext =pNew;
pEnd=pNew;
i++;
}
pEnd->pNext =pHead->pNext ;
}
int main()
{
int N;
scanf("%d",&N);
pStudent pHead;
Create(pHead,N);
int W,S;
scanf("%d,%d",&W,&S);
pStudent pTemp;
pTemp=pHead;
int i=0;
while(i<W)
{
pTemp=pTemp->pNext ;
}
while(N!=0)
{
int j=1;
pStudent pPre;
while(j<S-1)
{
pPre=pTemp;
pTemp=pTemp->pNext ;
}
printf("%s\n",pTemp->Name );
pPre->pNext =pTemp->pNext ;
free(pTemp);
pTemp=pPre->pNext ;
N--;
}
}
可以参考一下代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Student {
char Name[15];
struct Student* pNext;
} Student, *pStudent;
// 创建循环链表
void Create(pStudent* pHead, int N) {
pStudent pNew, pEnd;
*pHead = (pStudent)malloc(sizeof(Student));
(*pHead)->pNext = NULL;
pEnd = *pHead;
int i;
for (i = 0; i < N; i++) {
pNew = (pStudent)malloc(sizeof(Student));
scanf("%s", &pNew->Name);
pEnd->pNext = pNew;
pNew->pNext = *pHead;
pEnd = pNew;
}
}
int main() {
int N;
scanf("%d", &N);
pStudent pHead;
Create(&pHead, N);
int W, S;
scanf("%d,%d", &W, &S);
pStudent pTemp = pHead;
int i = 0;
while (i < W) {
pTemp = pTemp->pNext;
i++;
}
while (N != 0) {
int j = 1;
pStudent pPre;
while (j < S) {
pPre = pTemp;
pTemp = pTemp->pNext;
j++;
}
printf("%s\n", pTemp->Name);
pPre->pNext = pTemp->pNext;
free(pTemp);
pTemp = pPre->pNext;
N--;
}
return 0;
}
上面代码,使用循环链表来模拟小孩围成一圈的情景。首先定义一个结构体Student来存储小孩的名字和指向下一个小孩的指针。然后使用Create函数来创建循环链表,其中pHead是指向头结点的指针,N是小孩的个数。在创建链表的过程中,需要特别处理一下尾结点,将其指向头结点,这样才能形成循环链表。
接下来,读入指定的W和S,并将指针pTemp指向第W个小孩。然后进入一个循环,不断地让小孩出列,直到所有小孩都出列。在每次出列中,先用一个循环找到要出列的小孩,然后将其从链表中删除,释放其内存空间。最后,将指针pTemp指向下一个小孩,继续下一轮出列。
题主的代码修改如下,改动处见注释,供参考:
#include<stdio.h>
#include<stdlib.h>
typedef struct Student
{
char Name[15];
struct Student* pNext;
}Student,*pStudent;
void Create(pStudent* pHead,int N)
//void Create(pStudent pHead,int N) 修改
{
pStudent pNew,pEnd;
//pEnd = pHead; // 修改
//scanf("%d",&N); // 修改
int i = 0; // 修改
while(i < N)
{
pNew=(pStudent)malloc(sizeof(Student));
scanf("%s", pNew->Name); // scanf("%s",&pNew->Name ); 修改
if (!(*pHead)) //修改
(*pHead) = pNew; //修改
else //修改
pEnd->pNext = pNew; //修改
pEnd = pNew;
pNew->pNext = (*pHead); //修改
i++;
}
//pEnd->pNext =pHead->pNext; 修改
}
int main()
{
int N;
scanf("%d",&N);
pStudent pHead = NULL; // 修改
Create(&pHead,N); // 修改
int W,S;
scanf("%d,%d",&W,&S);
pStudent pTemp;
pTemp = pHead;
int i = 1; //int i=0; 修改
while(i < W)
{
pTemp=pTemp->pNext ;
i++; // 修改
}
while(N!=0)
{
int j = 1;
pStudent pPre;
while(j < S) //while(j<S-1) 修改
{
pPre=pTemp;
pTemp=pTemp->pNext ;
j++; //修改
}
printf("%s\n",pTemp->Name );
pPre->pNext =pTemp->pNext ;
free(pTemp);
pTemp=pPre->pNext ;
N--;
}
return 0;
}