2017-02-20 13 views
0

У меня есть следующий связанный список в C++-программе. Я думаю, что он построен правильно.С ++ связанный список аргументов типа «Node *» несовместим

struct Node 
{ 
    int data; 
    Node* next = NULL; 
}; 
void addNode(Node *head, int data); 

int main() 
{ 
    struct Node 
    { 
     int data; 
     Node* next = NULL; 
    }; 

    Node *head = new Node; 
    head->data = 3; 
    addNode(head, 5); 

    system("pause"); 
    return 0; 
} 


void addNode(Node *head, int data) 
{ 
    Node *curr = head; 
    while (curr->next != NULL) 
    { 
     curr = curr->next; 
    } 
    Node *newnode = new Node; 
    curr->next = newnode; 
} 

Сначала я создаю-структуру узла, а затем создать head и установить его на new Node. я просто установить head->data = 3. Затем я вызываю свою функцию addNode, которая принимает Node * head и по существу добавляет узел в конец связанного списка. Однако, когда я прохожу в голову, в заявлении addNode(head, 5), я получаю сообщение об ошибке 'void addNode(Node *,int)': cannot convert argument 1 from 'main::Node *' to 'Node *'

Почему это? Это не имеет смысла для меня.

+3

Почему вы снова определяете 'Node' внутри' main() '? Это не имеет значения, не имеет ничего общего с оригинальным. – songyuanyao

+0

Когда я инициализирую прототип, он не знает, когда Node так, я должен снова создать структуру. –

+1

Что значит «инициализировать прототип»? Какой прототип? Для кода, который вы показали, просто удалить определение внутри 'main()' будет хорошо. – songyuanyao

ответ

1

Это просто общий вопрос. В вашей функции addNode используется struct Node, объявленный до вашего main(). Тем не менее, код внутри вашей функции main использует переопределенную struct Node в рамках main ... следовательно, ошибка cannot convert main::Node* to Node*.

Извлечь определение struct Node изнутри вашего main, и оно должно работать.

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

0

Просто удалите следующее:

struct Node 
{ 
    int data; 
    Node* next = NULL; 
}; 

Ваша проблема заключается в том, что вы определяете отдельный тип с другой области. Ваш компилятор думает о первом определении как о чем-то аналогичном global::Node, а второе определение - main::Node.

Итак, в действительности, когда вы назначаете значение голове, вы назначаете несовместимые типы (global::Node* = main::Node*), поэтому ваш компилятор выдает ошибку.

+0

Спасибо. Также у меня есть quetsion. В чем разница между 'Node * head = new Node;' и 'Node * head = new Node();'? Они оба работают –

+0

В скобках вызывается функция инициализации типа данных или «конструктор». http://en.cppreference.com/w/cpp/language/initialization Вы всегда должны инициализировать переменные, когда это возможно. В противном случае может возникнуть неопределенное поведение. Для более подробного объяснения, проверьте: https://en.wikipedia.org/wiki/Resource_acquisition_is_initialization –

+0

Я собираюсь добавить к этому комментарию пример. Скажите, что у вас есть 'struct Foo {int bar;};', и он имеет инициализатор, который устанавливает 'foo.bar'' '' ', когда вы его объявляете. Вызов 'x = new Foo' установит значение' x-> bar' на что-то неопределенное, а вызов 'x = new Foo()' будет устанавливать 'x-> bar'' '' 'каждый раз. –

Смежные вопросы