Ну вот.
Насколько я понимаю, твоя ошибка в том, что ты пытаешься, исходя из каких-то смутных представлений "как должно быть" подобрать рабочий ответ.
Чтобы исправить ошибку, нужно в точности знать, что у тебя в программе происходит. Для каждого отдельно взятого случая и всех случаев вместе. Это несложно.
Вот смотри: тебе нужно добавить элемент в конец списка, для чего последнему элементу нужно установить указатель на новый элемент. Для этого нужно отыскать нужный элемент.
И у тебя есть два случая: первый - когда список пустой, и добавлять элемент пока некуда; второй - когда в списке есть элементы.
В первом случае ты уже делаешь всё правильно - просто устанавливаешь START (надеюсь, NEXT у него проинициализирован NULL-ом?)
Во втором случае, тебе нужно найти последний элемент. То есть, тот, у которого getNEXT() равен NULL (при чём тут getNEXT()->getNEXT(), который у тебя?).
Вот ты и пишешь:
if (START == NULL){
START = p;
}
else {
for (cur = START; cur->getNEXT() != NULL; cur = cur->getNEXT());
cur->setNEXT(p);
}
если список не пустой, то cur=START будет нормальным элементом, и мы можем проверить, есть ли у него следующий. Если следующего нет - цикл завершится и мы добавим свой элемент сюда. Если есть - перейдёт к следующему элементу и опять проверит, есть ли следующий. И так далее. Если в уме такие проверки сложновато делать - можешь написать на бумажке порядок выполнения программы пошагово. Или хотя бы пройти в отладчике и поглядеть, как она исполняется. Угадывать ответы не надо - надо понимать