关于#链表#的问题,如何解决?

img

#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;
}