将LinkedList作为元素链接到另一个LinkedList

时间:2018-11-30 19:35:28

标签: c++ pointers linked-list

我正在处理C ++作业,我将在链接列表的链接列表上创建搜索引擎。根据要求,我不能使用其他库或STL。

基本上是这样的(我从小列表中删除了变量,因为它们是不相关的): enter image description here

我的结构是这些

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


struct big
{
    int playerID;
    string playerName;
    string playerTeam;
    struct small *goals;
    struct big *next;
};

这是相关的代码段,我认为问题出在addGoals(...)上,我无法将小元素分配给temp-> goals。

class biglist
{
private:
    big *head, *tail;

public:
    biglist()
    {
        head = NULL;
        tail = NULL;
    }

. . .

void createbig(int ID, string name, string team)
    {
        big *temp = new big;
        temp->playerID = ID;
        temp->playerName = name;
        temp->playerTeam = team;
        temp->goals = NULL;
        temp->next = NULL;

        if (head == NULL)
        {
            head = temp;
            tail = temp;
            temp = NULL;
        }
        else
        {
            tail->next = temp;
            tail = temp;
        }
    }

void addGoals(int id, small *s)
    {
        big *temp = head;
        while (temp != NULL)
        {
            if (temp->playerID == id)
            {
                temp->goals = s;
                break;
            }
            temp = temp->next;
        }
    }

    void test()
{
    big *temp = head;
    while (temp != NULL)
    {
        if (temp->playerID == 1)
        {
            if (temp->goals !=NULL)
            {
                cout << temp->goals->data << endl;
            }
            else
            {
                cout << "goals null" << endl;
            }
        }
        temp = temp->next;
    }
}
}
. . .

class smalllist
{
private:
    small *head, *tail;

public:
    smalllist()
    {
        head = NULL;
        tail = NULL;
    }

    void createsmall(int ID, biglist b)
    {
        small *temp = new small;
        temp->data = ID;
        temp->next = NULL;

        if (head == NULL)
        {
            head = temp;
            tail = temp;
            temp = NULL;
        }
        else
        {
            tail->next = temp;
            tail = temp;
        }


        b.addGoals(1, temp);
    }
};

最后,我的主要代码:

int main()
{
    biglist obj;
    obj.createbig(1, "Player1", "Team1");
    obj.createbig(2, "Player2", "Team2");
    obj.displaybig();

    smalllist sml;
    sml.createsmall(9, obj);
    sml.displaysmall();

    obj.displaybig();
    obj.test();
}

调试在以下位置引发异常:

cout << temp->goals->data << endl;

  

抛出异常:读取访问冲突。 temp->目标为nullptr。

我有90%的把握确定是用指针弄乱了东西;但是我尝试过的其他东西在编译前却给出了错误。我签出了一些书/教程,但找不到。

如果您有更好的方法或者看到我犯下的可怕错误之一,请不要退缩:)

谢谢。


编辑,我这样更改了createbig()。 目前,它可以使用以下代码:

void createbig(int ID, string name, string team, small *s)
    {
        big *temp = new big;
        temp->playerID = ID;
        temp->playerName = name;
        temp->playerTeam = team;
        temp->goals = s;
        temp->next = NULL;

        if (head == NULL)
        {
            head = temp;
            tail = temp;
            temp = NULL;
        }
        else
        {
            tail->next = temp;
            tail = temp;
        }
    }

并将其添加到小

small getsmall(int i)
    {
        small *temp = head;
        while (temp != NULL)
        {
            if (temp->data == i)
            {
                return *temp;
            }
        }
    }

我最后的主要功能是

int main()
{
    smalllist sml;
    sml.createsmall(9);
    sml.displaysmall();

    biglist obj;
    small s = sml.getsmall(9);
    obj.createbig(1, "Player1", "Team1", &s);
    //obj.createbig(2, "Player2", "Team2");
    obj.displaybig();

    obj.test();

}

虽然现在成功结束了,但它给出了目标的地址,我在调试部分得到了它:

enter image description here

2 个答案:

答案 0 :(得分:1)

您似乎没有添加任何目标,因此我假设代码以null初始化。 还有nullptr异常。

在测试()之前先将addgoals()的目标传给玩家。

其他建议是

  1. 在打印目标之前添加空检查
  2. 临时指针不必用新的大或小初始化,只要列表的开头就足够了

答案 1 :(得分:1)

让我们通过main函数来看看代码的作用。 (能够像这样遍历代码是一项有用的技能。您还可以使用调试器来逐行完成功能,以提供帮助。)

biglist obj;

默认构造一个biglistheadtail为空。 (顺便说一下,nullptr是C ++替代C的NULL。)

obj.createbig(1, "Player1", "Team1");
obj.createbig(2, "Player2", "Team2");

obj中为ID为1和2的玩家添加条目。他们的目标为空。

obj.displaybig();

大概是obj的输出?

smalllist sml;
sml.createsmall(9);
sml.displaysmall();

这些行用smalllist做某事,但是不引用obj,因此它们与此问题无关。

obj.displaybig();

大概是obj的输出?自从上次显示以来,obj都没有受到影响。

obj.test();

调用测试代码,该代码找到玩家ID 1的元素并输出该玩家的第一个进球的数据。但是,如果您查找添加该玩家的位置,则目标为空,因此会崩溃。


与以上所述分开的话,createsmall中可能会有一些混乱。在该函数内部,创建了一个新的biglist(不是obj),并告知该列表向ID为1的玩家添加一个目标。但是,biglist无效。在主要功能中。