2016-11-15 2 views
-1

Функция, которую я использую для добавления нового узла в список, продолжаю получать ошибку «Ошибка сегментации (сбрасывание ядра)», мне кажется, что в какой-то момент я неправильно ссылаюсь на списокПроблемы с получением связанного списка для работы

void add(Huff ** head, Huff * current, char x) 
{ 

int found = 0; 

проверки, чтобы увидеть, если список пуст, устанавливает новый узел в голову

if(current == NULL) 
{ 
    Huff * newItem = malloc(sizeof(Huff)); 
    newItem->c = x; 
    newItem->freq = 1; 

    newItem->next = NULL; 
    *head = newItem; 

} 

проверки, чтобы увидеть, если узлы имеют одинаковое значение

else 
{ while(current != NULL) 
    { 
     if(current->c == x) 
     { 
      current->freq += 1; 
      found = 1; 
      break; 
     } 

    } 

, если они не являются, добавить в список

if(found == 0) 
    { 
     Huff * newItem = malloc(sizeof(Huff)); 
     newItem->c = x; 
     newItem->freq = 1; 
     newItem->next = NULL; 


     current->next = newItem; 
    } 
} 

}

+0

Ну, вы шаг через код в отладчике? Какая линия дает ошибку? Прошу показать определение Хаффа. Мы не читатели. – OldProgrammer

+1

Когда 'x' не будет найден, он выйдет из цикла' while' с 'current == NULL'. Как вы ожидаете оценки 'current-> next = newItem'? «NULL-> next» вызовет ошибку сегментации. – alvits

+0

О, и вы не пересекаете связанный список в цикле 'while'. Но я предполагаю, что это проблема с копией. – alvits

ответ

1

После этого цикла

else 
{ while(current != NULL) 
    { 
     if(current->c == x) 
     { 
      current->freq += 1; 
      found = 1; 
      break; 
     } 

    } 

current может быть равно NULL в случае, если соответствующий узел не найден.

В результате в этом фрагменте кода

if(found == 0) 
{ 
    Huff * newItem = malloc(sizeof(Huff)); 
    newItem->c = x; 
    newItem->freq = 1; 
    newItem->next = NULL; 

    current->next = newItem; 
    ^^^^^^^ 
} 

есть доступ к памяти с помощью NULL указатель current.

Я думаю, что вы могли бы упростить функции интерфейса, объявляя его как

void add(Huff ** current, char x); 
Смежные вопросы