繁体   English   中英

为什么这里有无限循环? (链接列表打印)

[英]Why is there an infinite loop here? (linked list printing)

提示:本站提供中英文对照查看,鼠标放在中文字句上可显示英文原文。 若本文未解决您的问题,推荐您尝试使用帮您解决。

我正在对链表进行一些练习,这些是结构。

typedef struct roomList roomList;
typedef struct school school;
typedef struct studentList studentList;
roomList *getRoom(school* school, int class, int roomNr);

struct studentList{

    char *name;
    int class; 
    float grade;
    int roomNr;
    studentList *next;
    studentList *prev;
};


struct roomList{

    int nrOfStudents;
    int roomNr;
    studentList *students; //pointer to student list.
    roomList *next;
    roomList *prev; 
};



struct school{

    int totalStudents;
    roomList *Class[13]; //array of classes, each index contains rooms.
};

这是发生无限循环的地方,它是打印房间内所有学生的功能。

void printRoom(school *school, int class, int roomNr)
{
    roomList *room = getRoom(school, class, roomNr);
    studentList *student;

    if(room != NULL)
    {
        int i = 1;
        printf("Nr of students: %d\n", room->nrOfStudents);
        while(room->nrOfStudents != 0 && student != NULL)
        {
            student = room->students;
            printf("%d - \"%s\" ",i, student->name);
            student = student->next;
            i++;
        }
    }   
}

这就是我创造student

studentList *createStudent(int class, char *name, int roomNr)
{
    studentList *newNode;
    newNode = (studentList*)calloc(1, sizeof(studentList));
    newNode->class  = class;
    newNode->name   = (char*)malloc(strlen(name)+1);
    strcpy(newNode->name, name);
    newNode->roomNr = roomNr;
    newNode->grade  = 0;
    newNode->next   = newNode->prev = NULL;

    return newNode;
}

最后,这就是我将student插入room

void insertStudentToRoom(school* school, int class, int roomNr, char *name)
{
    roomList *room;
    room = getRoom(school, class, roomNr);
    studentList *newStudent;
    newStudent = createStudent(class, name, roomNr);

    if(room->students != NULL)
    {
        newStudent->next = room->students;
        room->students->prev = newStudent;
        room->students = newStudent;
        room->nrOfStudents++;
        school->totalStudents++;
    }
    else
    {
        room->students = newStudent;
        room->nrOfStudents++;
        school->totalStudents++;
    }
}

无限无限循环仅在我将一个以上的student插入一个room时才发生,而在只有一个学生的情况下退出就很好了,我试图为while()摸索退出条件无济于事。

    while(room->nrOfStudents != 0 && student != NULL)
    {
        student = room->students;
        printf("%d - \"%s\" ",i, student->name);
        student = student->next;
        i++;
    }

仔细看。 您永远不会在循环中改变room 因此, student = room->students; 将在循环中的每个时间为student设置非常相同的值。 如果它在第一次之后没有中断,那么它将不会再中断。

您可能想让student = room->students; 跳出循环。 您只想指向房间中的第一个学生。

问题未解决?试试使用:帮您解决问题。
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2023 STACKOOM.COM