если
pbeg == nullptr или
*pbeg == nullptr, то
(*pbeg)->t будет попыткой разыменования нулевого указателя, а то и двойной. Покажи ещё стек-трейс (команда bt в gdb), но вангую, что он приведёт к строчке:
two = del(q);
а в листе был всего 1 элемент.
Ванговал не правильно, но близко:
Если вы опубликовали правильный код, тот который реально у вас. У вас проблемы. Причём не только с указателями:
1. createList не возвращает созданный t - на выходе будете иметь мусор
2. не могу чётко уловить логику, но createThree тоже может в определённых условиях вернуть мусор. Судя по всему внутри должен быть не просто рекурсивный вызов:
createThree(&tmpQ);
а:
return createThree(&tmpQ);
3. касательно указателей, просмотрел, но вот этот код никогда не закончится:
while(q) {
потому как q ни когда не станет null, а вот *q может и становится и собственно в таком виде и передаётся в del() в строчке tmp = del(q); в результате и получаешь фейл.
дальше у тебя там ещё, походу, баг в логике. Но это уже без меня.
PS если не поможет - приведите минимально-работающий код, на котором воспроизводится проблема.
PPS у вас C++, уйдите от указателей на указатели, используйте ссылки, например:
Three* del(Node &*pbeg)
{
assert(pbeg != 0); // для гарантий
Three *temp = pbeg->t; //ПОМЕЧЕННАЯ СТРОКА
Node *pv = pbeg;
pbeg = pbeg->p;
delete pv;
return temp;
}
И вообще, в C++: попытайтесь заменить указатели на ссылки везде где это только можно. Много нервов сбережёте.