Если вы не выполняете низкоуровневые операции с памятью (и вы не делаете это в опубликованной программе), ошибка сегментации является признаком повреждения памяти, т.е. вы испортили некоторыекодирование.Обратите внимание, что повреждение памяти обычно происходит до возникновения ошибки.В исключительных случаях первоначальное повреждение памяти и фактическая ошибка сегментации могут занимать часы и модули друг от друга.
Ваш первый шаг должен состоять в том, чтобы запустить программу в valgrind или gdb, чтобы выяснить подробности ошибки сегментации.Кроме того, всегда компилируйте как минимум с gcc -Wall
и принимайте к сведению каждое предупреждение - если вы не изменяете компилятор, изменения - это каждое предупреждение указывает на ошибку.
В вашем случае ошибка почти навернякареализация llist
.У этой реализации есть ряд проблем:
- Реализации не принадлежат файлам .h, они должны быть в файлах .cpp.
entry.towardsback
и entry.towardsfront
обычно называются prev
(ious) и next
- эти имена короче и их легче различить. hold
, вероятно, следует называть head
, в соответствии с общими соглашениями об именах связанных списков. - В списке длиной 0 не должно быть записей, т.е. он должен быть инициализирован с помощью
hold == NULL
. - Из строки 61 (в
add
):
hold->towardsback = node;
hold->towardsback->towardshead = node; // node->towardshead = node;
Вторая строка почти наверняка неверна.Вы, вероятно, хотите сначала настроить node
, а затем просто установить hold->towardsback = node;
.