gpt4 book ai didi

c++ - 将 LinkedList 作为元素链接到不同的 LinkedList

转载 作者:行者123 更新时间:2023-11-28 01:26:26 28 4
gpt4 key购买 nike

我正在处理一个 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;

这样说

Exception thrown: read access violation. temp->goals was 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

最佳答案

让我们通过 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 的玩家添加一个目标。但是,这没有任何效果main 函数中的 biglist

关于c++ - 将 LinkedList 作为元素链接到不同的 LinkedList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53563812/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com