簡體   English   中英

使用鏈表實現優先級隊列

[英]Implementation of priority queue using linked list

#include<iostream>
using namespace std;

//template<class T>
class Node
{
    public:
//  T data;
    int data;
    Node *next;
    int priority;
};

//template<class T>
class Que
{
        Node *front , *rear;
    public:
        Que(){front = rear = NULL;}

//      void enqueue(T x);
//      T dequeue();
        void enqueue(int *x, int l);
        int dequeue();
        void display();
};

//template<class T>
//void Que<T>::enqueue(T x)
void Que::enqueue(int *x, int l)
{
    Node * pt = front;
    for(int i=0; i<l; i++){
    Node *t = NULL;
    t = new Node;
    if(t==NULL)
        cout<<"Queue is full"<<endl;
    else
    {
        t->next = NULL;
        t->data = x[i];
        t->priority = x[i];
        if(front==NULL)
            front = rear =t;
        else
        {
            if(front->priority <= t->priority)
            {
                t->next = front;
                front = t;
            }
            else
            {
                while(pt->next!= NULL && pt->next->priority <= x[i])
                    pt = pt->next;
                t->next = pt->next;
                pt->next = t;
            }
        }
    }
}
}

//template<class T>
//T Que<T>::dequeue()
int Que::dequeue()
{
//  T x = -1;
    int x = -1;
    Node *t = NULL;
    if(front == NULL)
        cout<<"Queue is empty"<<endl;
    else
    { 
        x = front->data;
        t = front;
        front = front->next;
        delete t;
    }
    return x;
}

//template<class T>
//void Que<T>::display()
void Que::display()
{
    Node *t = front;
    while(t)
    {
        cout<<t->data<<" ";
        t = t->next;
    }
    cout<<endl;
}

int main()
{
//  Que <int> q();
    Que q;
    int a [] = {6, 1, 2, 5, 4, 3};
    q.enqueue(a, sizeof(a)/sizeof(a[0]));
//  q.dequeue();
    q.display();
    return 0;
}

這是C++中使用鏈表的優先級隊列代碼。 入隊成員 function 內的 while 循環顯示分段錯誤。

我認為指向用於指向前面的節點的指針*pt沒有正確指向。 我一直在嘗試解決它,但不知道。 這可能是什么原因?

您在enqueue開始時初始化pt但從未在循環內重置它。 因此,當您將多個元素添加到空列表時, pt將以nullptr開頭,並且在將第一個元素添加到列表后不會更新。 當您嘗試將第二個元素添加到列表中時,您會取消引用pt->next ,這會導致您的分段錯誤,因為pt仍然是nullptr

修復很簡單:移動Node * pt = front; for循環內。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM