[英]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.