You missed some initialization stuff. Moreover, your code for node insertion doesn't look quite correct, to me. Try
#ifndef CIRCULARDLL_H
#define CIRCULARDLL_H
#include <string>
class Node
{
friend class CircularDLL;
private:
void print();
int stId;
std::string stName;
std::string stEmail;
int stAge;
Node * next;
Node * prev;
};
typedef Node* NodePtr;
class CircularDLL
{
private:
NodePtr top;
public:
CircularDLL():top(nullptr){}
void print();
void printBackward();
void insertAfterLast(int id, const std::string & name, const std::string & email, int age);
};
#endif // CIRCULARDLL_H
#include "circ.hpp"
#include <iostream>
void Node::print()
{
std::cout << "{" << stId << ", " << stName << ", " << stEmail << ", " << stAge << "}\n";
}
void CircularDLL::insertAfterLast(int id, const std::string & name, const std::string & email, int age)
{
NodePtr newNode = new Node;
newNode->stId = id;
newNode->stName = name;
newNode->stEmail = email;
newNode->stAge = age;
if ( ! top )
{
top = newNode;
top->next = top;
top->prev = top;
}
else
{
NodePtr np = top;
while ( np->next != top)
{
np = np->next;
}
np->next = newNode;
newNode->prev = np;
newNode->next = top;
top->prev = newNode;
}
}
void CircularDLL::print()
{
if ( ! top )
{
std::cout << "(empty)\n";
return;
}
NodePtr np = top;
do
{
np->print();
np = np->next;
} while (np != top);
}
void CircularDLL::printBackward()
{
if ( ! top )
{
std::cout << "(empty)\n";
return;
}
NodePtr np = top->prev;
do
{
np->print();
np = np->next;
} while ( np != top->prev);
}
int main()
{
CircularDLL cd;
cd.insertAfterLast( 1, "foo", "foo@foo.com", 42 );
cd.insertAfterLast( 3, "bar", "bar@bar.com", 24 );
cd.insertAfterLast( 11, "goo", "goo@goo.com", 2448 );
std::cout << "printing with forward iteration\n";
cd.print();
std::cout << "printing with backward iteration\n";
cd.printBackward();
std::cout << std::endl;
}