У меня проблемы с выяснением, какая строка кода вызывает ошибку ошибки сегментации (сбрасывается ядро) в моем коде.Я пытаюсь реализовать сортировку с использованием связанных списков (с указателями).то есть решение на месте, где хвостовые указатели изменены, чтобы указывать на что-то новое.
Я попытался использовать gdb для отладки и сказать мне, какая строка вызвала ошибку сегментации, но он только сообщает мне адрес, который я не могуне думаю, что это полезно.
Это функция слияния:
List *mergesort(List *list) {
if (list == NULL || list->tail == NULL) {
return list;
} else {
List *list1;
List *list2;
split(list, &list1, &list2);
list1 = mergesort(list1);
list2 = mergesort(list2);
return merge(list1, list2);
}
}
Ошибка возникает в функции split:
void split(List *list, List **list1, List **list2) {
/* TODO */
printf("split is called\n");
List * pointer_list1;
List * pointer_list2;
List * pointer_traverse1;
List * pointer_traverse2;
printf("start");
pointer_list1 = list;
pointer_list2 = list->tail;
list = list->tail;
int sentinel = 0;
while(list->tail != NULL){
printf("entering while loop");
if(sentinel == 0){
printf("sentinel equals zero");
pointer_traverse1->tail = list->tail;
pointer_traverse1 = pointer_traverse1->tail;
printf("end of if block");
}else{
pointer_traverse2->tail = list->tail;
pointer_traverse2 = pointer_traverse2->tail;
}
list = list->tail;
if(sentinel == 0 ){
sentinel = 1;
}else{
sentinel = 0;
}
}
printf("END");
list1 = &(pointer_list1);
list2 = &(pointer_list2);
return;
}
Обратите внимание, что вызывается только первый оператор printf ("split")") называется.Функция слияния никогда не вызывается до возникновения ошибки.Никакой другой printf в функции split не запускается.Так что мое естественное предположение состоит в том, что создание этих указателей на списки приводило к ошибке сегментации, но это смешно, потому что они просто декларации?Возможно ли, что у меня закончилась какая-то память?
// Это может быть полезно для любого, кто пытается понять разделение.По сути, учитывая список целых чисел, скажем [1,2,3,4,5,6], я пытаюсь создать список1 из [1,3,5] и список2 из [2,4,6].Я делаю это, создавая указатель для list1, другого list2, и перебирая список, перебрасывая числа поочередно в list1 и list2.