我正在处理C ++作业,我将在链接列表的链接列表上创建搜索引擎。根据要求,我不能使用其他库或STL。
基本上是这样的(我从小列表中删除了变量,因为它们是不相关的):
我的结构是这些
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();
}
虽然现在成功结束了,但它给出了目标的地址,我在调试部分得到了它:
答案 0 :(得分:1)
您似乎没有添加任何目标,因此我假设代码以null初始化。 还有nullptr异常。
在测试()之前先将addgoals()的目标传给玩家。
其他建议是
答案 1 :(得分:1)
让我们通过main
函数来看看代码的作用。 (能够像这样遍历代码是一项有用的技能。您还可以使用调试器来逐行完成功能,以提供帮助。)
biglist obj;
默认构造一个biglist
。 head
和tail
为空。 (顺便说一下,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
无效。在主要功能中。