2

編集:これがあまりにも曖昧で、何が間違っているのかを理解したり見つけたりすることができないかどうかも気にしません.1つは、コードに直接関係がないことを知っています。関数を終了するには...実際の「コード」の間ではありません。必要に応じてさらに追加しますが、これで十分だと思います。前もって感謝します!

単純な (一方向) リンク リストを作成しようとしていますが、STL やその他の既に作成された動的コンテナーを使用せずに、自分で作成する必要があります。簡単なものを作成しましたが、頭を包み込むことができないという問題があるようです。

リストに新しいノードを作成するときはいつでも(リストが変更された場合に備えて、リストの最初のノードを常に返します。「センチネル」または「ダミー」ノードは使用しません)、新しいノードは、私が導入した最初のノードに自動的にリセットされるプログラムの特定のポイント。

投稿をできるだけきれいに保つために、挿入するコードを減らして「機能」またはパターンを増やしますが、十分でない場合はさらに追加します。

仕組みは次のとおりです。

マイノードアイテム

struct Node {    // simplified example
    string type;    //can be ignored
    int ap_nr;      // I sort by apartment number
    int sum;        // can also be ignored
    Node *next;
};

メインでは、最初のノードを「偽の」ノードとして初期化します (ap_nr = -1、他の ap_nr を負にすることはできません)。

int main ()
{
   int command = 1;   // used for loop
   Node *begin;    // head of my list
   begin = new Node;
   begin = create_node();   // initialize
   while (command != 0)    // This is for work with a "handler", accesses different mechanics of the program, I don't know exactly how to explain in english
   {
       input_command(command, begin);    // reads command, sends result to handler
   }
return 0;
}

これが私の入力コマンドです:

void input_command (int &command,Node *begin)
{
    cout<<"Option #"; cin>>command;
    input_validation (command, begin);
}

そして、私が atm を使用するハンドラーの唯一の部分:

void input_validation (int command, Node *begin)
{
     if (command == 1 trough 15)    // pseudo code 
         execute (command)    
}

リストにノードを追加した後、デバッグを使用して追跡しました。最初のノードはそのままですが、2番目のノード(最初のノードの前に追加して新しい「開始」を返します)、最初は問題ありません(新しいメモリの場所がありますnew_begin->next = old_beginが、構造を終了するìnput_commandとリセットされます)

*以下は、input_command 構造体とプログラム図です:*

Main: - 「偽の」ノードを初期化する / メニュー ループに入る -> input_command に移動します。

UI: - コマンドの入力 -> コマンドの読み取り -> 検証 -> ハンドラーへの送信。

リスト: - 欲望ノードを「リスト」に追加します (実際にはリスト自体はなく、ノードがリンクされているだけです) -> 最初のノードを返します。最初のノードは正常です (新しいアドレスがあり、古いノードを指しています)

UI に戻ります: -> コマンド (下括弧) を入力してリセットします(つまり、どのノードを追加しても、それが最初に追加したノードになるということです。つまり、アパート 1 から 10 を導入するとします。それは記憶するだけです。 "1")。

何か足りないのですか?デザインに論理エラーがありますか? もっとコードを評価する必要がありますか? 何を追加すればよいか教えてください。これは少しあいまいです。

注:現在、メイン ノードの前にのみノードを追加できます。これが適切に機能するようになるまで、新しいものには焦点を当てません。設計が問題の一部でない限り、それも変更しませんが、それは悪いです私はメモや提案をいただければ幸いです。

これは add_node 関数の唯一の実装部分です:

Node *add_node (Node *begin,string type, int sum, int ap_nr) // Node begin e primul nod din lista, trebuie mereu plimbat cu toate functiile pe lista
{
// if first node is dummy node

if (begin->ap_nr == -1)
    {
        begin->type = type;
        begin->ap_nr = ap_nr;
        begin->sum = sum;
        begin->next = 0;
        return begin;
    }

 // else create new node and insert it in sorted position

 else
 {

     // if node should be inserted before first node (begin)

     if (ap_nr <begin->ap_nr)
     {
         Node *cursor;
         cursor = new Node;
         cursor->ap_nr = ap_nr;
         cursor->type = type;
         cursor->sum = sum;
         cursor->next = begin;
         return cursor;
     }
 }
4

2 に答える 2

3

RStrad が言ったように、あなたが抱えている問題は、関数内のポインターを変更し、それらの変更をその関数の外にも残したいということです。

C/C++ では、すべてが値渡しされます。関数で何かを変更したい場合は、そのsomethingへのポインタを渡す必要があります。したがって、ポインターを変更したい場合は、次のようにポインターをそのポインターに渡す必要があります。

*Node begin;
input_command(command, &begin);
// the pointer itself has an address, which you are sending with &

の定義は次のinput_command()ようになります。

void input_command (int &command, Node **begin)
// observe here the pointer to your pointer

内部input_command()からの呼び出しは次のinput_validationようになります。

input_validation (command, &(*begin));
// the address of the pointer towards which **begin points

の定義は次のinput_validation()ようになります。

void input_validation (int command, Node **begin)

...さらに、たとえば実際にノードを追加する関数などの呼び出しは、引き続きこの形式に従います。つまり、ポインターが*Pあり、関数でそれを変更したい場合は、そのアドレスを送信する必要があります&P。その関数はポインターへのポインターを受け取り、**PP のアドレスを含むそれ以降の呼び出しは で行う必要があります&(*P)

于 2012-04-02T14:56:24.323 に答える
1

リスト コードにノードを追加する方法を実際に確認する必要があります。現在のヘッドの前にノードを追加して説明したことから、問題は begin がローカルスコープでのみ変更されており、input_command から戻されていないことです (つまり、参照渡しまたは値渡し)。

于 2012-04-02T12:44:07.940 に答える