Я считаю, что ошибка в том, что вы думаете:
if (listpointer == NULL){
temp->name = newname;
temp->next = listpointer;
listpointer = temp;
}
гарантирует, что listpointer никогда не будет NULL позже. Однако это не так, например:
void addnode(node *&listpointer,string newname){
node *temp;
temp = new node;
if (listpointer == NULL){
temp->name = newname;
temp->next = listpointer;
listpointer = temp;
}else{
node *add;
add = new node;
while (true){
if( (listpointer) == NULL){
std:cout << "oops (listpointer) == NULL)";
}
if(listpointer->name > newname){
add->name = newname;
add->next = listpointer->next;
break;
}
listpointer = listpointer->next;
}
}
}
Распечатает «oops», затем segfault, поскольку lispointer равен NULL, а использование -> для NULL вызовет segfault. Это происходит потому, что список указателей while (true) в конце концов достигает конца и устанавливается в NULL. Затем вы получаете segfault.
Я думаю, что лучшей идеей было бы сделать что-то вроде:
bool has_inserted;
while ( listpointer != NULL){
if(listpointer->name > newname){
add->name = newname;
add->next = listpointer->next;
has_inserted = true;
break;
}
listpointer = listpointer->next;
}
if(has_inserted == false){
//insert at end of list
}
Также этот код теряет память, так как вы не удаляете вещи, созданные вами с помощью new. Возможно, вы захотите запустить этот (и другой код) с valgrind, чтобы понять, что я имею в виду.