Я работаю над заданием на C ++, где создам поисковую систему по связанному списку связанных списков.В соответствии с требованиями, я не могу использовать другие библиотеки или STL.
В основном это будет так (я удалил переменные из небольшого списка, так как они не имеют значения): ![enter image description here](https://i.stack.imgur.com/x8grf.png)
Мои структуры таковы:
struct small
{
int data;
struct small *next;
};
struct big
{
int playerID;
string playerName;
string playerTeam;
struct small *goals;
struct big *next;
};
Вот соответствующий фрагмент кода, я думаю, что проблема в addGoals (...), где я не могу назначить маленький элемент дляtemp-> goal.
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-> goal был 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](https://i.stack.imgur.com/KFcxP.png)