1
#include "PersonList.h"
#include <iostream>
#include <string>
using namespace std;

PersonList::PersonList()
{
    head = NULL; //Head is a PersonRec*
}

struct PersonRec
{
    string aName;
    int aBribe;
    PersonRec* link;
};

void PersonList::AddToList()
{
    //string a;
    //int b;
    PersonRec* p;
    PersonRec **currPtr = &head;
    p = new PersonRec;
    cout << "\nEnter the person's name: ";
    cin >> p->aName;
    cout<< "\nEnter the person's contribution: ";
    cin >> p->aBribe;

    if (head == NULL)
    {
        cout<<1<<endl;
        head=p;
    }
    else if(head!=NULL)
    {
         bool x = true;
         while (x != false)
         {
             *currPtr = (*currPtr)->link;
             if (currPtr == NULL)
             {
                 currPtr = &p;
                 x = false;
             }
         }
    }
}

これは、ユーザーが名前と賄賂の金額を入力し、賄賂の額が最も多いリストに追加されるリンク リストであると想定されています。

この特定の段階では、賄賂を考慮に入れることなく、人々をリストに複数回入力する方法を見つけようとしています. 苦手なポインターが入っているので、ここで困っています。

リストの最初のノードが正常に入力された後、2 番目のノードを入力するとプログラムがフリーズするため、"else if(head!=NULL)" のコードに欠陥があります。それが構文なのか、それとも単に概念を完全に理解していないのかはわかりません。

また、PersonRec 構造の一部として前のノードに戻るリンクを使用することは許可されていません。

この問題を解決するにはどうすればよいですか?

4

1 に答える 1

2

近づいていますが、コードは実際には新しい 2 番目の項目をリストに追加していません。問題は、リストの最後と最終的な割り当てに到達することです。

currPtr=&p;

新しいリスト要素のアドレスをローカル変数 currPtr に割り当てるだけです (リストに追加されるわけではありません)。以下は、それを機能させるためのいくつかの提案です (これは宿題のように思えるので、単にコードを提供したくありません)。

  • p->linkオブジェクトを作成した後、NULL に初期化します。それを初期化するコンストラクターがあるようには見えません (この状況では、構造体とクラスの組み合わせは少し奇妙に思えます)。
  • の宣言から 1 レベルの間接参照 (アスタリスク 1 つ) を削除しますcurrPtr
  • 次の (リンク) アドレスを currPtr に割り当てる前の while ループで、null かどうかを確認します。割り当てると、更新が必要なノードのアドレスがなくなります。
于 2013-04-19T22:45:15.980 に答える