0

私は、再帰を使用して単一リンク リスト (スタック) のデータを出力する出力関数の作成を任されました。これまでの私のコードは次のとおりです:

IntStack.h

#include <iostream>

struct NodeType
{
    int data;
    NodeType *next;
};

class IntStack
{
private:
    NodeType root;
    int count;
public:
    IntStack(void);
    ~IntStack(void);

    void push(int);
    int pop(void);
    bool isEmpty(void);
    void print(NodeType&);
    int getSize() const;
    NodeType* getRoot();
};

IntStack.cpp

#include "IntStack.h"

IntStack::IntStack()
{
    count = 0;
}

IntStack::~IntStack()
{

}

void IntStack::push(int num)
{
    NodeType newNode;
    newNode.data = num;

    newNode.next = &root;
    root = newNode;

    ++count;
}

int IntStack::pop(void)
{
    // get root data
    // set root equal to root.next
    int num = root.data;
    root = *root.next;
    --count;
    return num;
}

bool IntStack::isEmpty(void)
{
    return (count == 0);
}

void print(NodeType *node)
{
    if (node->next != NULL) {
        std::cout << node->data << " " << std::endl;
        print(node->next);
    }
}

NodeType* IntStack::getRoot()
{
    return &root;
}

int IntStack::getSize() const
{
    return count;
}

main.cpp

#include <iostream>
#include "IntStack.h"

int main()
{
    IntStack stack;
    stack.push(7);
    stack.push(10);
    stack.push(13);
    stack.push(43);
    stack.push(23);
    stack.push(5);
    stack.push(32);
    stack.push(8);

    std::cout << stack.getSize() << " item(s) in the stack." << std::endl;
    std::cout << "Pop item off stack: " << stack.pop() << std::endl;
    std::cout << stack.getSize() << " item(s) in the stack." << std::endl;

    stack.print(stack.getRoot());

    return 0;
}

main.cpp の stack.print(stack.getRoot()) 関数でエラーが発生しました。

main.cpp:28:17: タイプ 'NodeType' への非定数左辺値参照は、タイプ 'NodeType *' の一時にバインドできません

明らかに、私は関数へのポインターを送信していませんが、ルートノードを送信するためにさまざまな方法を試しましたが、うまくいきませんでした。私がどのように進めるべきかについての情報は大歓迎です。ありがとう

4

3 に答える 3

2

まず、スタックではなくヒープにノードを割り当てる必要があります。つまり、スタック割り当てではなくヒープ割り当てを行うには、「new」キーワードを使用する必要があります。

// node1 is stack allocated
NodeType node1;

// node2 is heap allocated
NodeType *node2 = new NodeType;

理由は、スタックに割り当てられたものはすべて、関数が戻るときに期限切れ (削除) になるためです。あなたの場合、関数の終わりを超えてノードを維持する必要があります。

そのため、コンストラクターで root を NULL に変更NodeType root;して設定します。NodeType *root;

プログラムをすぐに機能させるには、特にプッシュ関数を変更する必要があります。

void IntStack::push(int num)
{
    NodeType *newNode = new NodeType; // heap allocated now
    newNode->data = num; // use appropriate dereferencing operator "->"

    newNode->next = root; // root is now a pointer

    root = newNode;

    ++count;
}

ノードを削除するには、逆の操作を行います

int IntStack::pop(void)
{
    int num = root->data;

    NodeType *tmp = root; // don't lose the pointer
    root = root->next;
    delete tmp; // heap allocated memory must be freed if it is allocated

    --count;

    return num;
}

NodeType にコンストラクターを追加して、次の変数を NULL に設定することも良い考えです。これは、ノードを再帰的に出力する場合、最後のノードに到達したことを知る必要があるためです。 " ポインターが NULL です。

編集: 上の行を取り消しました。ルートを NULL に初期化し、next常にルートの値に設定されるためNodeType、コンストラクターは必要ありません。ただし、印刷機能の条件はのif (node != NULL)代わりにする必要がありif (node->next != NULL)ます。ノードが 0 または 1 の場合を考えてみましょう。

于 2012-08-29T02:29:23.437 に答える
1

void print(NodeType&);.cpp ファイルのようにポインター バージョンを使用する代わりに、ヘッダー ファイルに書き込みました。&を aに変更する*と機能します。

(ちなみにかなり変なパターン)

于 2012-08-29T02:00:59.640 に答える
0

プロトタイプが関数の使用と一致しません。

void print(NodeType&)

実装ファイルには次のものがあります

void print(NodeType *node)

NodeType* を使用したいと考えているので、それを反映するようにヘッダーファイルを変更してください。

わかりにくいと思ったもう 1 つの行は、print 関数内の print 行です。

std::cout << node->data << " " << std::endl;

各印刷の後に改行を印刷するのはなぜですか? 印刷を削除するように変更することをお勧めしendlます。

于 2012-08-29T02:05:14.813 に答える