链接列表中的C ++队列

时间:2015-04-22 03:10:45

标签: c++ linked-list queue

晚上好。我一直在尝试用C ++实现一个Queue类,以先前创建的Linked List类为基础。 链接链表:

#include <cstddef>
#include <iostream>
#include <cstdio>

using namespace std;

template <class T>
class LinkedList {

public:
    LinkedList() {
        head = NULL;
    }
    ~LinkedList() {
        MakeEmpty();
    }

    struct Node {
        T value;
        Node *next;
    };

    Node* getHead() {
        return head;
    }

    void Print();
    void Insert();
    void MakeEmpty();

private:
    Node *head;     // Head of the linked list.
};

队列类:

#include "LinkedList.h"

template <class T>
class Queue {

public:
    Queue() {
        LinkedList<T>::Node *tnode = Q.getHead();
    }

    ~Queue() {
        Q.MakeEmpty();
    }

    void Enqueue( T x ) {
        LinkedList<T>::Node *cnode = Q.getHead();

        //Find the last element of Q
        while( cnode -> next != NULL ) {
            cnode = cnode -> next;
        }
        //Add x to the end of the queue
        Q.Insert( x );
    }

    void Dequeue() {
        LinkedList<T>::Node *hnode = Q.getHead();
        //Rest of function
    }

    void Print() {
        Q.PrintList();
    }

private:
    LinkedList<T> Q;
};

正如您可能已经注意到的那样,我正在制作模板类。编译时,我被告知tnode(在Queue类的构造函数中找到)尚未在范围中声明。有关如何解决此问题的任何建议吗?

编辑1:我收到的错误消息是:

  

RCQueue.h:在构造函数'Queue :: Queue()'中:
  RCQueue.h:8:28:错误:在此范围内未声明'tnode'          LinkedList :: Node * tnode = Q.getHead();

我的构造函数的主要目的是将LinkedList类中的“head”指针初始化为NULL。我也很好奇如何宣布在另一个模板类中声明的结构变量。

2 个答案:

答案 0 :(得分:2)

Enqueue Algorithm :
1. Create a newNode with data and address.
2. if queue i.e front is empty   
i.  front = newnode;   
ii. rear  = newnode;
3. Else 
i.rear->next = newnode;    
ii.rear = newnode;

Dequeue Algorithm :
1. if queue is i.e front is NULL      printf("\nQueue is Empty \n");
2. Else next element turn into front        
i.  struct node *temp = front ;  
ii. front = front->next;   
iii.free(temp);  

C ++实现:

     #include <bits/stdc++.h>
      using namespace std;

      struct node
      {
        int data;
        node *next;
      };

      node *front = NULL;
      node *rear =NULL;


     void Enque(int data)
     {
           node *newnode = new node;
           newnode->data = data;
           newnode ->next = NULL;


           if(front==NULL) 
           {
               front=newnode;
               rear=newnode;
           }

           else
           {
              rear->next = newnode;
              rear = newnode;
           }
      }





    void Deque()
    {
       struct node *temp;

       if (front == NULL)
       {
         printf("\nQueue is Empty \n");
         return;
       }

       else
       {
           temp = front;
           front = front->next;
           if(front == NULL)  rear = NULL;
           free(temp);
       }
     }


    void display()
    {
        node *temp=front;
        if(front==NULL)
        {
          printf("\nQueue is Empty \n");
        }

        else
        {
            while(temp != NULL)
            {
                cout<<temp->data<<" ";
                temp = temp->next;
            }
        }
        cout<<endl;
    }

答案 1 :(得分:1)

您在typename Node中使用的LinkedList类型的每次使用前都需要Queue,因为它取决于模板参数T 。具体而言,

template <class T>
class Queue {

public:
    Queue() {
        typename LinkedList<T>::Node *tnode = Q.getHead();
    }

    ~Queue() {
        Q.MakeEmpty();
    }

    void Enqueue( T x ) {
        typename LinkedList<T>::Node *cnode = Q.getHead();

        //Find the last element of Q
        while( cnode -> next != NULL ) {
            cnode = cnode -> next;
        }
        //Add x to the end of the queue
        Q.Insert( x );
    }

    void Dequeue() {
        typename LinkedList<T>::Node *hnode = Q.getHead();
        //Rest of function
    }

    void Print() {
        Q.PrintList();
    }

private:
    LinkedList<T> Q;
};

请注意在使用typename之前添加LinkedList<T>::Node

当然,您还会听到有关MakeEmpty()类中LinkedListQueue缺少定义的投诉,因此只需为其添加定义。

有关为何需要typename的详细信息,this post非常清楚地解释了这一点。

相关问题