如何在函数中使用链表ADT?

How to use linked list ADT in a function?

我正在尝试从另一个队列复制一个队列,但该函数出现以下编译错误:

'class Node' 没有名为 'isEmpty'

的成员

'class Node' 没有名为 'enqueue'

的成员

'class Node' 没有名为 'getFirst'

的成员

'class Node' 没有名为 'dequeue'

的成员

'无法在return

中将'operations*'转换为'Node*'
#include<iostream>
#include "Queue.h"
using namespace std;

Node* copyQueue(Node* q1)
{
    operations *q2 = new operations();

    while(q1->isEmpty()!= True)
    {
        q2 -> enqueue( q1 -> getFirst() );
        q1 -> dequeue();
    }
    return q2;
}

int main()
{
    operations *q1 = new operations();

    int temp, n;
    cout << "Enter queue size: ";
    cin >> n;
    cout << "Enter data to copy: ";
    for( int i = 0 ; i < n ; i++ )
    {
        cin >> temp;
        q1 -> enqueue(temp);
    }
    copyQueue(q1);
    cout << "Copied Queue = ";
    q2 -> display();
}

queue.h源代码:

#include<iostream>
#include "Node.h"
using namespace std;

class operations
{
public:

    Node *front= NULL;
    Node *newdata= NULL;
    Node *rear= NULL;

    void enqueue(int item)
    {
        newdata = new Node(item);

        if(front==NULL && rear == NULL)
        {
            front = rear = newdata;
        }
        else
        {
            rear->next = newdata;
            rear = newdata;
        }
    }

    void dequeue()
    {
        Node *temp = front;
        front = front->next;
        delete temp;
    }

    bool isEmpty()
    {
        if(front == NULL)
            return true;
        else
            return false;
    }

    int getFirst()
    {
        return front -> item;
    }

    void display()
    {
        Node *temp= front;
        while(temp!= NULL)
        {
            cout<<temp->item<<"->";
            temp= temp->next;
        }
        cout<<endl;
    }
};

您的第一个函数的签名不正确。它应该接受一个队列和 return 一个队列,但是您为两者都指定了 Node

所以改变:

Node* copyQueue(Node* q1)

至:

operations* copyQueue(operations* q1)

其他一些需要更正的地方:

  • main 你还没有声明 q2。此外,它不会从 copyQueue 调用中捕获 return 值,因此更改:

    copyQueue(q1);
    

    至:

    operations *q2 = copyQueue(q1);
    
  • True 应该是 true.

  • 每当队列变空时,
  • dequeue 应将 rear 设置为 NULL。所以改变:

    front = front->next;
    delete temp;
    

    至:

    front = front->next;
    if(front==NULL) 
    {
        rear = NULL;
    }
    delete temp;
    
  • 因为 isEmpty() return 是一个布尔值,你不应该写:

    while(q1->isEmpty()!= true)
    

    ...但只是:

    while(!q1->isEmpty())
    
  • 出于同样的原因,isEmpty 方法不需要 if...else。变化:

    if(front == NULL)
        return true;
    else
        return false;
    

    至:

    return front == NULL;
    
  • frontNULL时,rear也必然如此,所以不需要双重检查:

    if(front==NULL && rear == NULL)
    

    可以是:

    if(front==NULL)