Как вы можете скопировать значение узла из одной структуры данных в другую

#c

#c

Вопрос:

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

 // Setting up the data structures:
struct node // node for the binary tree:
{
    int data; // variable to store each integer value in the tree
    node * left; // pointer for each right node
    node * right; // pointer for each left node
};
struct list_node // node for the linked list
{
    int list_data;
    list_node* next;
};

// Function for linked list insertion:
list_node * appendList(list_node *current, int newData)
{
    list_node *newNode = new list_node();
    newNode->list_data = newData;
    newNode->next = NULL; // now end of list
    current->next = newNode;
    return newNode;
}

void traverse(node* root)
{
    if (root == NULL)
    {
        return;
    }
    traverse(root->left); // first recursive
    // then send these values to the linked list
    //cout << root->data << " ";
    appendList(root, root->data);
    traverse(root->right); // second recusive
}
  

Ошибка:

 argument of type node is incompatible with parameter of type list_node
  

Ответ №1:

Этот вызов:

 appendList(root, root->data);
  

Принимает list_node указатель, но вы даете ему node единицу.

Другими словами, вы пытаетесь использовать узел двоичного дерева в качестве узла списка, что на самом деле не то, что вы хотели сделать. Попробуйте использовать корень структуры списка, а не двоичный.

Комментарии:

1. Хорошо, это показывает мне, в каком направлении двигаться. Также означает ли это, что я не могу указать на ячейку памяти, на которую уже указано. Например: если узел указывает куда-то, node_list не может указывать на него?

2. Это правильно. Если у вас нет корневого узла для списка, вам придется выделить его. Думайте о них как о полностью независимых объектах.

Ответ №2:

 In below function call:
 appendList(root, root->data);

You are passing the incorrect first parameter i.e. root which is node of binary tree i.e. 'struct node' not 'struct list_node'.

**Solution:**
You have to pass the root of the list i.e. object 'struct list_node' as first parameter in function appendList.

**CHANGES**

struct list_node // node for the linked list
{
    int list_data;
    list_node* next;
};

// Function for linked list insertion:
list_node * appendList(list_node *root, int newData)
{
    list_node *newNode = new list_node();
    newNode->list_data = newData;
    newNode->next = NULL; // now end of list
    current->next = newNode;
    return newNode;
}

void traverse(node* root, list_node* rootList)
{
    if (root == NULL)
    {
        return;
    }
    traverse(root->left, rootList); // first recursive
    // then send these values to the linked list
    //cout << root->data << " ";
    rootList = appendList(rootList, root->data);
    traverse(root->right, rootList); // second recusive
}