c ++ передает пользовательскую структуру через функцию - PullRequest
0 голосов
/ 14 октября 2018

Я некоторое время работал с этой программой на C ++, и я понял, что именно происходит, но я не понял, как это исправить.Вот что я настроил:

struct entry {
    string foo;
    string bar;
    string num;
};
struct node {
    entry input;
    node* left;
    node* right;
};
node* home = new node;

Этот код находится в отдельном заголовочном файле, который включен в основной файл cpp, который имеет следующее:

home->input.foo="John";
home->input.bar="Doe";
home->input.name="1234";
printAll(home);

ThisЭто была ошибка, когда я пытался пройти домой через функцию printAll в заголовочном файле:

void printAll(node* start){
    if(start==NULL) return;
    printAll(start->left);
    cout << start->input.foo;
    printall(start->right);
}

Ошибка, которую дает мне Visual Studio, 0xCDCDCDCD on start.Я понимаю, что проблема не в home, а в start, но я не понимаю, как исправить эту ошибку.Я читаю вокруг и могу предположить, что start было брошено в кучу памяти, но не удалено.Я не думал, что это было возможно.И я также могу догадаться, что C ++ не знает, что такое start и как его использовать, как бы я это исправить?

Ответы [ 2 ]

0 голосов
/ 14 октября 2018

Как отмечено в другом ответе, ошибка, которую вы получаете, может быть из-за того, что вы не инициализировали левый и правый узел как NULL.Однако у вас есть другая ошибка, и вы создали бесконечный цикл в вашем printAll.

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

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

Class LList {
    node * startNode;

    void printAll(){
          if (startNode == NULL) 
                return;

          node * currNode = startNode;

         // print all the nodes moving left to right
         _printAll(currNode);
    }

    void _printAll(currNode){
          // print currNode and recursively go to next by calling 
          // _printAll(currNode->right)
     }
}

Дополнительные примечания

  • Конечно, вы захотите сделать printAll общедоступным, а остальные - приватными.

  • Вам также понадобится функция для добавления узла в список.Просмотрите атрибуты и методы связанных списков, чтобы узнать, что еще вам нужно.

  • Лучше избегать структур и использовать вместо них объекты

0 голосов
/ 14 октября 2018

Вы не инициализировали left или right.В отладочных сборках Visual Studio установит неинициализированную память равной 0xCDCDCDCD.Это явно не равно NULL, поэтому ваше сравнение возвращает false.

...