Эта функция
SinglyLinkedListNode* insertNodeAtTail(SinglyLinkedListNode* head, int data) {
SinglyLinkedListNode* temp=head;
while(temp!=NULL){
temp=temp->next;
}
SinglyLinkedListNode* temp1;
temp1->data=data;
temp1->next=NULL;
temp->next=temp1;
return temp;
}
не имеет смысла. После этого l oop
while(temp!=NULL){
temp=temp->next;
}
указатель temp
равен NULL. Таким образом, этот оператор
temp->next=temp1;
вызывает неопределенное поведение.
Указатель temp1
не был инициализирован. Итак, снова эти операторы
temp1->data=data;
temp1->next=NULL;
вызывают неопределенное поведение.
Пользователь функции не знает, является ли возвращаемый указатель указателем заголовка или последним указателем списка. Поэтому неясно, назначать ли возвращаемый указатель указателю на заголовок или просто игнорировать возвращаемое значение.
Функция может выглядеть следующим образом.
void insertNodeAtTail( SinglyLinkedListNode * &head, int data )
{
SinglyLinkedListNode **current = &head;
while ( *current != nullptr ) current = &( *current )->next;
*current = new SinglyLinkedListNode { data, nullptr };
}
Если в main вы определили указатель на головной узел, такой как
SinglyLinkedListNode *head = nullptr;
, тогда вызов функции будет выглядеть как
insertNodeAtTail( head, some_data );
Другое определение функции может выглядеть следующим образом
SinglyLinkedListNode* insertNodeAtTail( SinglyLinkedListNode *head, int data )
{
SinglyLinkedListNode *new_node = new SinglyLinkedListNode { data, nullptr };
if ( head == nullptr )
{
head = new_node;
}
else
{
SinglyLinkedListNode *current = head;
while ( current->next != nullptr ) current = current->next;
current->next = new_node;
}
return head;
}
В этом случае, если в main вы определили указатель на головной узел как
SinglyLinkedListNode *head = nullptr;
, то вызов функции будет выглядеть как
head = insertNodeAtTail( head, some_data );
Между этими двумя определениями функций первое определение функции является предпочтительным, потому что не нужно помнить, чтобы присвоить возвращенный указатель головному узлу.
Имейте в виду, что если у вас есть односвязный список и вы хотите добавить новые узлы в конец списка, то десять Лучше определить двусторонний односвязный список. В этом случае определение списка может выглядеть как
class SinglyLinkedList
{
private:
struct Node
{
int data,
Node *next;
} *head = nullptr, *tail = nullptr;
public:
SinglyLinkedList() = default;
void insertNodeAtHead( int data );
void insertNodeAtTail( int data );
// other member functions;
};