Возврат указателя из функции с использованием шаблона в c

#c #function #pointers #linked-list #main

#c #функция #указатели #связанный список #программа-точка входа

Вопрос:

Строка внутри main Node<int> *head = takeInput() выдает ошибку нет соответствующей функции для вызова ‘takeInput()’. Не могли бы вы помочь мне и сказать, в чем ошибка, которую я здесь совершаю, чтобы я не делал этого в будущем? Спасибо!

 #include<iostream>
using namespace std;

template<class T>
class Node{

public: 
    T data;
    Node *next;
    Node(T x){
        data = x;
        next = NULL;
        }
    
};

template<typename T>
Node<T> * takeInput(){
    T data;
    cin>>data;
    Node<T> *head = NULL;
    Node<T> *tail = NULL;
    
    while(data != -1){
        Node<T> *newNode = new Node(data);
        
        if(head == NULL){
            head = newNode;
            tail = newNode;
        }else{
            tail->next = newNode;
            tail = tail->next;
            }
        cin>>data;
        }
    return head;
    }
    
int main(){
    Node<int> *head = takeInput();
    cout<<head->data;
    }
  

Ответ №1:

В вашем коде есть недостатки;

Ваше сравнение head == NULL всегда равно нулю при каждом запуске функции, потому что вы присваиваете NULL Node<T> *head = NULL ; при запуске функции.

И использование NULL не рекомендуется в c , используйте nullptr ;

Взял на себя смелость и изменил вашу функцию. есть много способов, которыми вы можете реализовать нижеприведенную функцию, на данный момент я выбрал нижеприведенный способ, я не говорю, что это лучший способ.

 template<typename T>
void takeInput( Node<T>*amp; head, T val ){

    Node<T>* newNode = new Node<T>( val );

    if ( head == nullptr )
    {
        head = newNode;
    }
    else
    {
        Node<T>* tmp = head;

        while ( tmp->next != nullptr ) tmp = tmp->next;

        tmp->next = newNode;

    }
}
    
int main()
{
    Node<int> *head;
    
    takeInput( head, 10 );
    takeInput( head, 20 );
    takeInput( head, 30 );

    std::cout<< head->data << std::endl;
    std::cout<< head->next->data << std::endl;
    std::cout<< head->next->next->data << std::endl;

}