編集:これがあまりにも曖昧で、何が間違っているのかを理解したり見つけたりすることができないかどうかも気にしません.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;
}
}