#c #linked-list
#c #связанный список
Вопрос:
У меня есть многоуровневый связанный список со списком пациентов, каждый список пациентов указывает на связанный список с пациентами, каждый пациент указывает на связанный список врачей. Я пытаюсь добавить несколько докторов, но когда я пытаюсь отобразить докторов, я получаю бесконечный цикл, как будто нет следующего указателя, указывающего на NULL. Если это только один doctor, все работает нормально.
Я пробовал несколько подходов, таких как присвоение старому узлу временного указателя, а затем присвоение новому узлу значения, указывающего на временный. Мой связанный список пациентов и связанный список пациентов работают на 100%.
struct doctor {
char name[MAX_NAME];
struct doctor *next;
};
void addDoctor(char* patientNameInput, char* doctorNameInput)
{
struct patientList* tempList = list; // work on a copy of 'list'
int i = 0;
struct doctor* newDoctorNode = NULL;
newDoctorNode = (struct doctor*) malloc(sizeof(struct doctor));
struct doctor* tmp = NULL;
while (tempList != NULL)
{
while (tempList->patient->name[i] == patientNameInput[i])
{
if (tempList->patient->name[i] == '')
{
tempList->patient->doctors = newDoctorNode;
newDoctorNode->next = NULL;
for (int i = 0; i < 30; i )
tempList->patient->doctors->name[i] = doctorNameInput[i];
}
i ;
}
tempList = tempList->next;
}
}
Функция выполняет поиск имени пациента и соответствующего связанного списка списка пациентов. При обнаружении добавляется узел doctor для соответствующего пациента. Если я включу свою старую попытку временного указателя и выведу функцию, я получу бесконечный цикл. Я ожидаю, что на выходе будет отображаться более 1 doctor без ошибок.
Ответ №1:
Измените следующее:
tempList->patient->doctors = newDoctorNode;
newDoctorNode->next = NULL;
Для:
newDoctorNode->next = tempList->patient->doctors;
tempList->patient->doctors = newDoctorNode;
Это добавит новый узел doctor в начало существующего списка doctor. Если вы вместо этого хотите добавить его в конец, то вам нужно пройти по списку, чтобы найти конец.
Комментарии:
1. По большей части это работает, но когда я добавляю двух докторов, все их имена связываются вместе. 1 doctor работает нормально, 3 или более doctors тоже работают нормально. например, если я добавлю Bob — doctors: Paul. Затем я добавляю George — doctors: Leo. Отобразится Bob — doctors: Paul, Leo. Джордж — врачи: Пол Лео
2. Теперь функция использует мой старый фрагмент кода, если нет докторов. В противном случае функция использует предоставленный вами код.
3. Ну, одна вещь, которую вам определенно следует сделать, это добавить
break;
в конецif
, который проверяет окончание имени. Без этого вы будете продолжать заглядывать за пределы конца имени с непредсказуемыми результатами. Как только вы увидите конец строки, вы не сможете заглянуть за его пределы.4. Кстати, обычно просто используется
strcmp(str1, str2) == 0
, чтобы увидеть, равны ли две строки, вместо того, чтобы писать встроенный цикл для сравнения. Это делает код намного проще и менее подверженным ошибкам.5. Извините, забыл упомянуть, что я добавил это
break;