У меня проблема с сортировкой пузырьков со связанным списком. Я не нашел ошибку в моем простом коде в течение нескольких часов. Не могли бы вы посмотреть на это?Связанный список и (буквенный) сортировка пузырьков
int listSort(node_t ** _list)
{
int size = listSize(_list);
for(int i = 0; i < size; i++)
{
node_t *pointer = *_list;
for(int j = 0 ; j < size - 1; j++)
{
if(strcmp(pointer->title, pointer->next->title) > 0)
listSwapWithNext(_list, j);
pointer = pointer->next;
}
}
return 0;
}
и вот функция подкачки (но это, кажется, работает хорошо, потому что я проверил вручную все граничные случаи):
int listSwapWithNext(node_t **_list, size_t first)
{
node_t *pointer = *_list;
node_t *ptr_b;
node_t *ptr_c;
node_t *ptr_d;
if(!first)
ptr_b = pointer;
for(size_t i = 0; pointer->next->next; i++, pointer = pointer->next)
{
if(i == first - 1 || first == 0)
{
if(first)
ptr_b = pointer->next;
ptr_c = ptr_b->next;
ptr_d = ptr_c->next;
if(first)
pointer->next = ptr_c;
else
*_list = ptr_c;
ptr_c->next = ptr_b;
ptr_b->next = ptr_d;
break;
}
}
return 0;
}
Это вызывает эту аварию (на линии 229):
Когда я модифицировал состояние внутреннего контура в функции сортировки до:
for(int j = 0; j < size - 1 && pointer->next; j++)
, чтобы предотвратить чтение с плохого адреса, я заметил странную вещь. Внутренняя петля разворачивается ровно на один раз меньше, чем должна.
Спасибо!
EDIT: Вот модифицированная версия функции сортировки с условием ПРЕДОТВРАТИТЬ во внутреннем цикле и моих показателей отладки (сделанный с Е()):
int listSort(node_t ** _list)
{
int size = listSize(_list);
int i;
for(i = 0; i < size; i++)
{
node_t *pointer = *_list;
int j;
for(j = 0 ; j < size - 1 && pointer->next; j++)
{
if(strcmp(pointer->title, pointer->next->title) > 0)
listSwapWithNext(_list, j);
printf("# %d %d\n", i, j);
pointer = pointer->next;
}
printf("\n");
}
return 0;
}
Вот результат в консоли. Послушайте, он не делает каждый цикл, чтобы он плохо сортировал сортировку.
EDIT2: Вот essention проблемы. http://pastebin.com/e5K6C1A2
По-прежнему не могу решить эту проблему.
один вопиющий вопрос 'ptr_c' используется неинициализированным в' ptr_d = ptr_c-> следующий; '. Во-первых, можете ли вы успешно перебирать список? Далее, является ли это 'head/tail' или' circle' связанным списком? (из кода он выглядит как «круговой» список). Затем посмотрите на свой внутренний цикл для 'bubble-sort',' j', как правило, выполняется из 'j = i', а не' j = 0' (однако это реализация определена). Отправьте проверяемый пример с образцом ввода, который может быть скомпилирован. Кроме того, убедитесь, что вы компилируете с ** предупреждениями ** (например, минимум с помощью '-Wall -Wextra'). Наконец, нет необходимости в скриншотах - мы знаем, что такое авария. –
ptr_c инициализируется в строке выше. Да, я мог бы перебирать список (с правильным количеством узлов) в любой момент. Я реализовал простой случай создания пузырьков с постоянными границами, он должен работать. На данный момент я отредактировал сообщение и добавил небольшой пример кода с результатом консоли. Теперь я готовлю для вас компилируемый необходимый код. – Madras
Я не знаю, какой тип связанного списка. Это реализация моей собственной идеи. Наверное, это круговой. – Madras