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;
             }
         }
    }
}

这应该是一个链表,用户在其中输入姓名和贿赂金额,然后将其添加到贿赂金额最高的列表中。

在这个特定阶段,我只是想弄清楚如何将人员多次输入到列表中,甚至没有贿赂进入等式。由于包含了我不太擅长的指针,我在这里遇到了麻烦。

成功输入列表中的第一个节点后,程序在我输入第二个节点后冻结,因此我在“else if(head!=NULL)”处的代码存在缺陷。我不确定这是语法还是我根本没有完全理解这个概念。

此外,我不允许使用返回前一个节点的链接作为 PersonRec 结构的一部分,这可能对我有所帮助。

我该如何解决这个问题?

4

1 回答 1

2

您正在接近,但代码实际上并未将新的第二项添加到列表中。它的一个问题是它到达列表的末尾和最终的分配:

currPtr=&p;

只需将新列表元素的地址分配给局部变量 currPtr(这不会导致它被添加到列表中)。以下是一些让它工作的建议(这种看起来像是家庭作业,所以我不想只给出代码):

  • 创建对象后初始化p->link为NULL。似乎没有可以初始化它的构造函数(在这种情况下,结构和类的混合似乎有点奇怪)。
  • currPtr.
  • 在将下一个(链接)地址分配给 currPtr 之前的 while 循环中,检查它是否为空。一旦分配它,您就不再拥有需要更新的节点的地址。
于 2013-04-19T22:45:15.980 回答