2013-12-10 5 views
1

enter image description here Хотя после написания кода и изучения его столько раз я получаю ошибку утверждения. Я не знаю почему. надеюсь, что вы, друзья, можете мне помочь. Это функцияПолучить nth Значение связанного списка в C

int GetNth(struct node* head, int index) { 
    Node* current = head; 
    int count = 0; // the index of the node we're currently looking at 
    while (current != NULL) { 
     if (count == index) 
      return(current->data); 
     count++; 
     current = current->next; 
    } 
    assert(0); 
    // if we get to this line, the caller was asking 
    // for a non-existent element so we assert fail. 
} 

это ошибка, которую я получаю.

GetNth: Assertion `0' failed.Aborted (core dumped) 
  1. Мои сомнения в том, что если удар с позиции, значение которого, как ожидается, почему бы из утверждения теста происходит? Поскольку уже существует оператор возврата цикла while, который выходит из функции.

  2. Если я комментировать этот тест утверждения и, если есть попадание/промах с позицией, значение которого, как ожидается, она возвращает меня 0 каждый раз, когда вместо значения/нулем

Спасибо заранее!

+0

Как вы называете эту функцию? Каковы значения аргументов? Сколько узлов в списке? –

+0

Отправьте реальный код. Ваши фигурные скобки не совпадают в приведенном выше примере. – RedX

+0

Функция сама по себе выглядит нормально, проверьте параметры, которые вы передаете. – starrify

ответ

2

Я отладки кода, как это с хорошей старой моды PRINTF в

int GetNth(struct node* head, int index) { 
Node* current = head; 
int count = 0; // the index of the node we're currently looking at 
if (index < 0) { 
    printf("invalid -ve index passes\n"); 
    assert(0); 
} 
printf("starting ptr %p\n", current); 
while (current != NULL) { 
    printf("checking value %d against %d for ptr %p", count, index, current); 
    if (count == index) { 
     printf("found\n"); 
     return(current->data); 
    } 
    count++; 
    current = current->next; 
} 
printf("not found\n"); 
assert(0); 
// if we get to this line, the caller was asking 
// for a non-existent element so we assert fail. 
} 

запустить его и посмотреть, что получится из. При необходимости измените printf для fprintf (stderr.

+0

Ошибка была, указатель, который мой GetNth получил как параметр, указывал на Null. Который был Мой плохой. И спасибо за время и силы, чтобы сделать мой код правильным. Ваша отладка облегчила мою работу. Спасибо :) – bks4line

1

Помимо некоторых проблем ввода/вывода ваш код выглядит правильно, я думаю, проблема в том, что список, который вы проходите, является либо NULL, либо ему не хватает и поэтому вы нажимаете на ошибку утверждения.

Выходная проблема - assert (0) не является хорошим способом вернуть ошибку вызывающему абоненту функции. Язык C не предоставляет функции вызывающего абонента для обнаружения утверждения так что ваш процесс будет аварийно завершен.

Также вполне вероятно, что причина, по которой кто-то вызывает ваш API, - они не знают, находится ли элемент в списке или нет, поэтому сбой процесса не является хорошим дизайном от что POV.

Ошибка ввода - вы не проверяете входной аргумент положительным. Или ограничьте его неподписанным.

+0

Как вы сказали, я использую указатель указателя на голову вместо указателя на голову. поэтому произошло то, что я использовал указатель ссылки для перехода от головы до последнего узла в списке, так как мне пришлось распечатать все значения в списке. то я использовал тот же указатель (который следующий указывал на NULL) как параметр в функции GetNth. И поэтому ошибка сегментации. К сожалению, это была самая глупая ошибка! – bks4line

Смежные вопросы