Связывание LinkedList как элемента с другим LinkedList - PullRequest
0 голосов
/ 30 ноября 2018

Я работаю над заданием на 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-> 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

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Давайте посмотрим, что делает ваш код, пройдя через функцию main.(Возможность проходить по коду, подобному этому, является полезным навыком. Вы также можете использовать отладчик, чтобы помочь, шаг за шагом выполняя функции.)

biglist obj;

Конструкция по умолчанию a biglist,head и tail равны нулю.(Кстати, nullptr является заменой C ++ для C * NULL.)

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

Добавить записи в obj для игроков с идентификаторами 1 и 2. Их цели нулевые.

obj.displaybig();

Предположительно, вывод obj?

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

Эти строки что-то делают с smalllist, но не ссылаются на obj, поэтому они не имеют отношения к этой проблеме.

obj.displaybig();

Предположительно, вывод obj?Вид избыточности, поскольку ничто не повлияло на obj с момента последнего отображения.

obj.test();

Вызовите тестовый код, который находит элемент для идентификатора игрока 1 и выводит данные о первой цели этого игрока.Тем не менее, если вы посмотрите, где был добавлен этот игрок, цель равна нулю, и вы получите сбой.


Отдельно от вышесказанного, возможно, в createsmall есть некоторая путаница.Внутри этой функции создается новый biglist (не obj), и в этом списке указывается добавить цель к игроку с идентификатором 1. Однако это не влияет на biglist в основной функции.

0 голосов
/ 30 ноября 2018

Вы, кажется, не добавили никаких целей, поэтому я предполагаю, что код инициализируется с нулем.и поэтому исключение nullptr.

вызовите addgoals () с целями, которые игрок должен выполнить перед тестом ().

другие предложения будут

  1. для добавления нуляпроверьте перед печатью целей
  2. Временные указатели не нужно инициализировать новыми большими или маленькими, достаточно лишь заголовка списка
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...