Эта строка кода выглядит странно в вашей bplus_Enqueue
функции:
queue->next = bplusTemp;
free(bplusTemp);
в основном вы устанавливаете следующий узел в связанном списке, который вы используете для своей очереди, но затем освобождаете его после назначения указателя next
на предыдущий конец связанного списка. Это будет означать, что ваш предпоследний узел указывает на освобожденную память, а не на действительный узел связанного списка, что вызовет ошибку сегментации при обращении к нему. Память, на которую указывает узел bplusTemp
, после первой строки теперь "принадлежит" списку ... вы не можете вызвать free
для этого указателя или для любого другого указателя, который указывает на эту память ( в этом случае queue->next
) также указывает на свободную память и при попытке доступа к этой памяти произойдет сбой.
Это также имеет смысл в том, почему вы можете напечатать первые два значения узла (корень и одно из его дочерних элементов), а затем получить ошибку сегмента. По сути, вы никогда не вызываете эти строки, когда очередь пуста, и вы добавляете первый узел. Поэтому, когда вы добавляете root
, все в порядке ... вы не звоните free
. Затем вы удаляете его из очереди, и когда вы делаете это, очередь снова пуста. Таким образом, следующий дочерний элемент root
добавляется в очередь, и это снова хорошо, поскольку, поскольку очередь пуста, вы не будете вызывать free
на bplusNew
. Но теперь, когда вы добавляете любые другие дочерние элементы корня, и очередь не пуста, вы в конечном итоге вызываете free
для bplusNew
, в результате чего ваша очередь содержит только одно значение. Другими словами, первый узел, на который указывает queue->next
(т. Е. Второй узел в связанном списке), фактически больше недоступен ... вы вызвали free
в этой памяти.
Во-вторых, в вашей функции bplus_Dequeue
есть утечка памяти ... в частности, здесь:
BPLUS bplusTemp = queue->bplusNode;
queue = queue->next;
Вы переназначаете начало связанного списка, не освобождая узел, который был первоначальным заголовком списка. Теперь у вас больше нет указателя на этот узел, и он считается утечкой памяти.