【问题标题】:Why is there an infinite loop here? (linked list printing)为什么这里有一个无限循环? (链表打印)
【发布时间】:2019-06-15 00:42:23
【问题描述】:

我正在用链表做一些练习,这些是结构。

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() 的退出条件无济于事.

【问题讨论】:

    标签: c loops data-structures infinite-loop doubly-linked-list


    【解决方案1】:
        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; 排除在循环之外。您只想指向房间中的第一个学生一次。

    【讨论】:

    • 更准确地说,if (room->nrOfStudents != 0) { studentList *student = room->students; while (student != NULL) { ... } }
    • 谢谢!这个可耻的问题是对我在 AM 深处做 kata 的惩罚。
    • @ikegami 我喜欢这个,我的老师总是告诉我要避免复合if()'s。
    • @Rami Raghfan,您的意思是避免使用&&?这很愚蠢。这里使用两个语句的原因是因为room 永远不会改变,所以多次检查room->nrOfStudents != 0 是没有意义的。
    • @Rami Raghfan,当room->nrOfStudents0 时,人们会假设room->studentsNULL,所以你可以简单地使用studentList *student = room->students; while (student != NULL) { ... }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    • 2021-08-16
    • 2018-01-13
    • 2020-08-08
    • 2011-02-19
    相关资源
    最近更新 更多