void insertAtBack(string inputName, Node **headref) {
Node **currentNodeRef;
currentNodeRef = headref;
...
Node **currentNodeRef = headref;
- ошибка.Помните, что вы передаете адрес указателя.Вы хотите написать:
Node *currentNodeRef = *headref;
И изменить функцию следующим образом:
void insertAtBack(string inputName, Node **head)
{
Node *tail = *head;
while(tail->next != NULL)
tail = tail->next;
tail->next = new Node();
tail->next->name = inputName;
tail->next->next = NULL;
}
Также не забудьте инициализировать head->next = nullptr;
if (head == NULL) {
head = new Node();
head->name = testName;
head->next = nullptr; <--- add
}
Однако лучше, если insertAtBack
готов обработать head
, когда head
равен NULL
.Причина, по которой вы передаете Node **head
, заключается в том, что вам нужна ссылка на указатель, чтобы вы могли ее инициализировать.Таким образом, вы можете изменить код как:
void insertAtBack(string inputName, Node **head)
{
Node *new_node = new Node();
new_node->name = inputName;
new_node->next = nullptr;
if(*head)
{
Node *tail = *head;
while(tail->next)
tail = tail->next;
tail->next = new_node;
}
else
{
*head = new_node;
}
}
void printList(Node *head)
{
Node *node = head;
while(node)
{
cout << node->name << endl;
node = node->next;
}
}
int main()
{
cout << "This implements a linked list" << endl;
Node *head = NULL;
string testName;
while(true)
{
printOptions();
int option;
std::cin >> option;
switch(option)
{
case 1:
cout << "Enter student name" << endl;
std::cin >> testName;
insertAtBack(testName, &head);
break;
case 2: printList(head); break;
case 3: exit(1); break;
default: exit(1); break;
}
}
return 0;
}