Как добавить несколько узлов в связанный список на C без указателя head / tail?

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