Кажется, что здесь, в моем коде, у меня есть бесконечный цикл печати той же переменной class_t, называемой поиском, несмотря на попытку переместить переменную в следующую class_t. Все структуры class_t либо указывают на (class_t *) 0 (потому что я получил предупреждения компилятора, если я использовал NULL, потому что я сравнивал class_t * и void *) или указывал на следующую соответствующую структуру class_t. Что я делаю неправильно, или я должен искать где-то еще для моей проблемы?Связанный список бесконечной петли
class_t *search = (students + i)->class_p;//students is a seperate structure where class_p is a pointer to a class_t structure
while(search != (class_t*)0)
{
fprintf(output,": %s%d %d %d\n", search->name, search->number, search->section, search->credits);
search = search->nextClass;
}
Вот пример вывода, и, глядя на него, это последнее чтение в class_t из файла
: CS521 1 4
: CS521 1 4
: CS521 1 4
: CS521 1 4
: CS521 1 4
: CS521 1 4
: CS521 1 4
: CS521 1 4
: CS521 1 4
: CS521 1 4
: CS521 1 4
: CS521 1 4
А вот создание class_t:
class_t newClass;
newClass.number = classid;
newClass.section = section;
newClass.credits = credits;
newClass.nextClass = (class_t*)0;
И когда добавлен узел:
void addNode(student_t students[], class_t addClass, int ref)
{
int found = 0;
if((students + ref)->class_p == (class_t*)0)//no classes yet
{
(students + ref)->class_p = &addClass;
found = 1;
}
else if((*((students + ref)->class_p)).number > addClass.number && found == 0)//checks first class
{
class_t *temp = (students + ref)->class_p;
(students + ref)->class_p = &addClass;
addClass.nextClass = temp;
found = 1;
}
else//works way through the class linked list to find where it goes
{
class_t *beforesearch = (students + ref)->class_p;
class_t *search = beforesearch->nextClass;
while(search != (class_t*)0 && found == 0)
{
if(search->number < addClass.number)
{
beforesearch->nextClass = &addClass;
addClass.nextClass = search;
found = 1;
}
else
{
beforesearch = search;
search = search->nextClass;
}
}
if(found == 0)
{
beforesearch->nextClass = &addClass;
found = 1;
}
}
}
Header файлы с: определений типов
typedef struct class_t {
char name[3];
int number;
int section;
int credits;
struct class_t *nextClass;
} class_t;
typedef struct student_t {
int id;
class_t *class_p;
} student_t;
Возможно, у вашего списка есть петля? – SLaks
Я бы оценил, как вы обрабатываете голову/хвост при добавлении/удалении узлов. Вероятно, вы вводите цикл. – Thomas
Вам нужно посмотреть, как вы создали список. В нем есть петля! –