I'm working on a C++ assignment where I'll create a search engine on a linked list of linked lists. As per the requirements, I can't use other libraries nor STL.
Basically it will be like this (I removed the variables from small list since they are irrelevant):

My structs are these:
struct small
{
    int data;
    struct small *next;
};
struct big
{
    int playerID;
    string playerName;
    string playerTeam;
    struct small *goals;
    struct big *next;
};
Here's the relevant code snippet, I think the problem is at addGoals(...) where I'm failing to assign the small element to the 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);
    }
};
Finally, my main code:
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();
}
Debugging throws an exception at:
cout << temp->goals->data << endl;
saying that
Exception thrown: read access violation. temp->goals was nullptr.
I'm 90% sure I messed up something with pointers; but other stuff I've tried gave errors before compiling. I checked out some books / tutorials but couldn't figure it out.
Also if you have a better approach or saw one of the horrible mistakes that I'm making, please don't hold back :)
Thanks.
EDIT I changed my createbig() like this.
Currently it works with following codes:
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;
        }
    }
and added this to small
small getsmall(int i)
    {
        small *temp = head;
        while (temp != NULL)
        {
            if (temp->data == i)
            {
                return *temp;
            }
        }
    }
My final main function is
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();
}
While it ends successfully now, it gives the address of goals and I get this in debug section:

 
     
    