user2710184
user2710184

Reputation: 347

C++ Doubly Linked List Program

I've been trying to teach myself programming for a few months now, I've bought about three books and watched a tonne of videos on YouTube which has been great so far. But the last week or so I've been stumped thanks to linked lists! I get the whole concept but the syntax is killing me! I've written a few very simple linked lists programs for exercise but now I'm trying to write a program where I load in some information from a file (information of people who have applied for a visa) onto a linked a list then just display the whole lot again(once that is done I plan on expanding it to where I only display certain nodes and remove certain nodes but I wont go into detail). Hopefully the code shown below is not too lengthy and if I could just get some pointers (no pun intended) or some snippets to help me understand this stuff that would be awesome!

p.s some of this code is from a similar example in a book.

here is the main(most of it)with the loop to load the information(it doesn't work)

 List myList;
 visa_application *visa;

 Node * pNode;

 string visa_type;//these are all the variables that i want to load from the file
 int invoice_no;
 string surname;
 string firstname;
 double contact;
 string status;
 string result; 

ifstream in;
in.open("applications.txt",ios::in);



      while (!in.eof()){     
         pNode = new Node;
         visa = new visa_application;    //allocate memory for nodes

         in >> visa-> visa_type >> visa->invoice_no >>  visa-> surname;
         in >> visa-> firstname >> visa-> contact >> visa-> status >>  visa-> result ; 

         pNode->nData = &visa;   //put some data in the node
         myList.appendNode(pNode); //add node to list

         }

Here is my class node header file

 class Node
{
      friend class List;
      private:
              node_data * nData;
              Node *pNext;
              Node *pPrev;
      public:
              Node  (node_data * data){nData = data;
                                    pNext = NULL;
                                   pPrev = NULL;}
             node_data * getData(){return nData;}
};

here is class list header file

class List
{
    private:
        Node *pHead;
        Node *pTail;
        Node  *createNode(node_data * data);
    public:
        List ();
        ~List();
        Node  *getpHead (){ return pHead;}
        Node  *getpTail (){return pTail;}
        Node  *previousNode(Node  *pNode){return pNode->pPrev;}
        Node  *nextNode (Node  *pNode){return pNode->pNext;}
        void appendNode(node_data * value);
        void insertNode(node_data * value, Node  *pAfter);
        void removeNode(Node  *pNode);
        bool isEmpty();
        void printList(); 
};

List ::List() {
    pHead=NULL;
    pTail=NULL;
}

List ::~List(){
    while (!isEmpty())   //keep on removing until the
                               //head points to NULL
        removeNode(pHead);
    cout << "List deleted\n";
}

   Node * List::createNode(node_data * data){
   Node * pNode = new Node (data); //allocate memory for new node and
                                 //intialize value to data
   return pNode;  
}

   bool List ::isEmpty(){
   return pHead == NULL;
}

void List ::appendNode(node_data * value)
{
   Node * pNode = createNode(value);

   if (isEmpty()) {     //if list is empty
        pHead = pNode;        //make head point to pNode
        pNode->pPrev = NULL;
   }
   else {                    //otherwise
        pTail->pNext = pNode;  //make tail point to pNode
        pNode->pPrev = pTail;
   }
   pTail = pNode;        //tail is now pNode
   pNode->pNext = NULL;  //pNode next now points to NULL
}


void List ::insertNode(node_data * value, Node  *pAfter)
{
   Node *pNode =  createNode(value);
   pNode->pNext = pAfter->pNext;
   pNode->pPrev = pAfter;

   if (pAfter->pNext != NULL)
        pAfter->pNext->pPrev = pNode;
   else
        pTail = pNode;
   pAfter->pNext = pNode;
}

void List ::removeNode(Node  *pNode)
{
   if (pNode->pPrev == NULL)  //if removing the head
        pHead = pNode->pNext;

   else
        pNode->pPrev->pNext = pNode->pNext;  //if removing a middle node

   if (pNode->pNext == NULL)  //if removing the tail
        pTail = pNode->pPrev;

   else
        pNode->pNext->pPrev = pNode->pPrev;
   pNode = NULL;
   delete pNode;  //*free the memory
}

void List ::printList()
{
   Node  *pNode=pHead;
   if (isEmpty())
        cout << "The list is empty\n";
   else
        for (pNode = pHead; pNode != NULL; pNode = pNode->pNext)
            pNode->nData->print();
}

My class visa application header file

class visa_application
{
public:
    // class constructor
    visa_application();
    // class destructor
    ~visa_application();



private:
     string visa_type;
     int invoice_no;
     string surname;
     string firstname;
     double contact;
     string status;
     string result;     
};

and finally the visa application.cpp

     visa_application::visa_application()
{
     string visa_type = none;
         int invoice_no = 0;
         string surname = none;
         string firstname = none;
         double contact = 00;
         string status = none;
         string result = none; 
 }

 class destructor
 visa_application::~visa_application()
{
// insert your code here
}  

I'm getting the error "no matching function for call to `List::appendNode(Node*&)'" among a few other things.Anyway I know this is long but it would be great if i could get some help, I do not have a tutor or teacher or someone like that to help me so any feedback would be much appreciated! Thanks!

**EDIT the error messages are:

 no matching function for call to `Node::Node()' 
 candidates are: Node::Node(const Node&) 
 Node::Node(node_data*)     
 no matching function for call to `List::appendNode(Node*&)' 
 candidates are: void List::appendNode(node_data*)   

Upvotes: 1

Views: 11118

Answers (6)

Lulu Kay
Lulu Kay

Reputation: 1

I try to define the zero parameter Node constructor in the Node class and set pNext = this and pPrev = this. I haven't run your code but that error could be because you are calling a zero parameter Node constructor but you haven't defined one.

Upvotes: 0

Lalith Rallabhandi
Lalith Rallabhandi

Reputation: 1

Doubly Linked List are very majorly used in computer applications . I found a very good and efficient program for Doubly Linked list in a site

Only difference bertween single linkedlist and doubly linked list is the extra pointer which helps to traverse the Linked list from left to right or right->left .

Program for Doubly Linked list C++ : http://www.techfinite.net/2013/11/double-linked-list-program-and-algorithm.html

Upvotes: 0

N A
N A

Reputation: 656

Assuming node_data* is some kind of typedef of void* in other words void pointer, you are passing Node as your data instead of your visa_application. To solve this simply change

myList.appendNode(pNode); //add node to list

to

myList.appendNode((node_data*)visa); //add node to list

and you should be fine. You can also get rid of allocation of memory for node in your main function as that is what your List::createNode is doing AFAIK.

OT: the program is full of leaks, read my comments on your question

Upvotes: 0

Ross Wang
Ross Wang

Reputation: 27

You declared and defined appendNode as void appendNode(node_data * value); but you tried to calling it using myList.appendNode(pNode); //add node to list, pNode here is an object of Node type, so you got your error.

Upvotes: 0

πάντα ῥεῖ
πάντα ῥεῖ

Reputation: 1

According to your own declaration of the function you can't call

myList.appendNode(pNode); //add node to list

with a pointer to Node, you'll need to pass a pointer of type node_data* there.

As others mentioned in comments, there are a lot of other flaws and errors in your code.

Upvotes: 1

Martin Schlott
Martin Schlott

Reputation: 4547

As far as I see it, your List has only the method:

void List::appendNode(node_data * value)

but in your main, you call the methode with a object of class Node. Try

void List ::appendNode(Node * pNode)
{

instead of:

void List ::appendNode(node_data * value)
{
   Node * pNode = createNode(value);

Also, as already suggested in the comments. Write always the whole errocode in your question, including the position. Best practice is to include the compiler and os too.

Upvotes: 1

Related Questions