ошибка ошибки сегментации в функции связанного списка в C - PullRequest
0 голосов
/ 07 марта 2020

Я пытаюсь создать связанный список узлов, внутри которых есть указатель структуры сотрудников. Я получаю ошибку сегментации, когда пытаюсь добавить новый узел в конец. Ниже приведена моя функция добавления узла в конец списка.

    void addToEnd(node_t **head, employee_t *employee){
        node_t *current_node = *head;
        while(current_node->next != NULL){
            current_node = current_node->next;
        }
        current_node->next = (node_t*)malloc(sizeof(node_t));
        current_node->next->empInfo = employee;
        current_node->next->next = NULL;
    }

Вот код, который я передаю в функцию:

     int main (void) {

        setvbuf(stdout, NULL, _IONBF, 0);
        setvbuf(stderr, NULL, _IONBF, 0);

         employee_t *empPtr1, emp1,*empPtr2, emp2;
         empPtr1 = &emp1;
         empPtr2 = &emp2;

         node_t head;
         head.next = NULL:
         node_t *headPtr;
         node_t **headPtr2;
         headPtr2 = &headPtr;
         headPtr = &head;

         emp1.firstName = (char *) malloc(sizeof(char)*10);
         emp1.lastName = (char *) malloc(sizeof(char)*10);

         emp2.firstName = (char *) malloc(sizeof(char)*10);
         emp2.lastName = (char *) malloc(sizeof(char)*10);

             printf("Please enter the first name of the first employee you'd like to add:");
             scanf("%s", empPtr1->firstName);
             printf("Please enter the last name of the first employee you'd like to add:");
             scanf("%s", empPtr1->lastName);


             printf("Please enter the first name of the second employee you'd like to add:");
             scanf("%s", empPtr2->firstName);
             printf("Please enter the last name of the second employee you'd like to add:");
             scanf("%s", empPtr2->lastName);

             addToEnd(headPtr2, empPtr1);
             addToEnd(headPtr2, empPtr2);
    ...

Если у кого-то есть идеи, почему эта функция дает мне ошибку в сегменте, это было бы очень ценно, так как я просмотрел здесь множество тем и не нашел ничего подобного.

Ответы [ 2 ]

1 голос
/ 07 марта 2020

Когда вы создаете head, вам нужно инициализировать указатель next на NULL:

node_t head;
head.next = NULL;

В противном случае, l oop в addToEnd() не будет знать, когда он достиг конца списка.

0 голосов
/ 07 марта 2020

Внутри main, убедитесь, что headPtr указывает на NULL, прежде чем 2 функции вызовут addToEnd:

 node_t * headPtr=NULL; //just keep this pointer for head, no other needed.
 ...
 // Few lines later ..
 addToEnd(&headPtr, empPtr1);
 addToEnd(&headPtr, empPtr2);

При использовании указателя инициализируйте его с NULL. Итак, теперь вам нужно позаботиться о двух ситуациях в вашей функции addToEnd: когда headPtr равно NULL, а не NULL. Кроме того, вам необходимо проверять каждый раз, когда вы разыменовываете любой указатель, независимо от того, является ли он NULL или нет.

Измените свою функцию addToEnd на эту:

void addToEnd(node_t **head, employee_t *employee){
        node_t current_node = *head;

        node_t *temp = (node_t*)malloc(sizeof(node_t));
        temp->empInfo = employee;
        temp->next = NULL;

        if (*head == NULL){  //For the first case when the list will be empty 
            *head = temp;
            return;
        }     

        while (current_node->next != NULL){       
               current_node=current_node->next;
        }
        current_node->next = temp;
        return;
    }
...