flazzo
flazzo

Reputation: 253

Comparing pointers within a doubly linked list?

I am trying to build a simple text adventure for finals week. It's pretty standard stuff. Use 'n', 'e', 's', and 'w' to traverse the house, and try to get to the end of the maze. All was going well for a while, but I'm running into a problem when I try to retrieve a list of available doors.

Here's my basic setup

class Node
{
public:
    //...
    Node* getNLink() {return northLink;}
    Node* getELink() {return eastLink;}
    Node* getSLink() {return southLink;}
    Node* getWLink() {return westLink;}
    //...
    void printAllPossibleMoves();
    //checks all four links and tells the user which ones are not set to NULL
private:
    //...
    Node* northLink;
    Node* eastLink;
    Node* southLink;
    Node* westLink;
    const string dirNodeToStr(Node* dirNode);
    //Takes a node pointer and returns whether that link is n/e/s/w, no spaces
};

I have snipped out all of the superfluous members. My problem comes from the two member functions in the Node class. First, printAllPossibleMoves() gets a list of all pointers that are not set to NULL and feeds those pointers to dirNodeToStr() one-by-one

void Node::printAllPossibleMoves()
{
    Node* allDoors[4] = {getNLink(), getELink(), getSLink(), getWLink()};
    //gets a list of all four pointers
    Node* availableDoors[4];
    int allDoorsLen(4), availableDoorsLen(0);

    for(int i=0; i<allDoorsLen; i++)
    {
        if(allDoors[i] != NULL)
        {
        //filters out any NULL pointers and keeps track of the # of non-NULL pointers
            availableDoors[i] = allDoors[i];
            availableDoorsLen++;
        }
    }

    if(availableDoorsLen == 0)
        cout << "You don't see any doors in this room. Odd" << endl;
    else if(availableDoorsLen == 1)
        cout << "You see a door to the " << dirNodeToStr(availableDoors[0]) << endl; //CALL 1
    else if(availableDoorsLen > 1 )
    {
        cout << "You see doors to the ";
        for(int j=0; j<availableDoorsLen; j++)
        {//make sure to put an 'and' in there before the last direction is printed
            if(j == (availableDoorsLen-1))
                cout << " and " << dirNodeToStr(availableDoors[j]) << endl; //CALL 2
            else
                cout << " " << dirNodeToStr(availableDoors[j]); //CALL 3
        }
    }
}

On the three marked lines, printAllPossibleMoves() passes one of the Node pointers to dirNodeToStr(), which is where the error manifests itself.

const string Node::dirNodeToStr(Node* dirNode)
{
    if(dirNode == dirNode->getNLink())
        return "north";
    else if(dirNode == dirNode->getELink())
        return "east";
    else if(dirNode == dirNode->getSLink())
        return "south";
    else if(dirNode == dirNode->getWLink())
        return "west";
    else
    {
        cout << "Error at Node::dirNodeToStr: Function was fed an invalid parameter" << endl;
        //whenever this function is called, it falls through to this case
        system("PAUSE");
        exit(0);
    }
}

And the output:

This is the guest bedroom.
n
WEST HALL
This is a hallway.
You see doors to the Error at Node::dirNodeToStr: Function was fed an invalid pa
rameter
Press any key to continue . . .

And in case it matters, here's the original function call

void Node::movePlayer(Node*& pos, string direction)
{
    if(direction == "north")
    {
        if(northLink == NULL)
            cout << "You can't go north.\n";
        else
        {
            pos = getNLink();
            cout << pos->getRoomName() << endl << pos->getRoomInfo() << endl;
            pos->printAllPossibleMoves();
        }
    }
//...
}

So what do you think? Why do the pointers not match up? I collected all of the pointers, fed them into another function, and then compared one of them to a list of all of the same pointers. Shouldn't this one be a no-brainer?

Upvotes: 0

Views: 379

Answers (1)

John Bandela
John Bandela

Reputation: 2436

This code

for(int i=0; i<allDoorsLen; i++)
{
    if(allDoors[i] != NULL)
    {
    //filters out any NULL pointers and keeps track of the # of non-NULL pointers
        availableDoors[i] = allDoors[i];
        availableDoorsLen++;
    }
}

Is causing NULLs to be placed in your availableDoors, I think you can fix this by changing the line

availableDoors[i] = allDoors[i]

To

availableDoors[availableDoorsLen] = allDoors[i]

Upvotes: 1

Related Questions