2015-04-05 68 views
1

所以我想建立一个优先队列,需要2个数字(0和2)。优先级为0的值将根据到达时间添加到队列的后面。优先级2将被插入到优先级为0的数据包之前,但不在已经排队的优先级数据包之前。不需要使用std :: priority_queue。这也是一个要求使用链接列表有人可以指出我做错了什么?样本包(黑体为优先级):优先队列不按正确的顺序排序

55555555555555D507E34B17887100A0FF1822198100 100000663727970746fC704DD7B

pQueue100::pQueue100(){ 
    front = NULL; 
} 

void pQueue100::insert(string packet, int priority) 
{ 
    node2 *temp, *q; 
    temp = new node2; 
    temp ->info= packet; 
    temp ->priority = priority; 
    if (front == NULL ||priority <front->priority) 
    { 
     temp->link =front; 
     front = temp; 
    }else 
    { 
     q = front; 
     while (q->link != NULL && q->link->priority<=priority) 
      q=q->link; 
     temp->link = q->link; 
     q->link=temp; 
    } 

    //display(); 
}//insert 

void pQueue100::display() 
{ 
    node2 *ptr; 
    ptr = front; 
    //node2 *temp; 
    //temp = front; 

    if (front ==NULL) 
     cout << "Queue is empty" <<endl; 
    else 
    { 
     while (ptr != NULL) 
     { 
      ptr->priority; 
      //temp->info; 
      cout << ptr->priority << "|" ; 
      cout << ptr->info <<endl; 
      ptr = ptr->link; 

     } 
    } 
} 

如果你们想看到的数据包的来源:

void thr1::selectPQueue(string packet){ //reads in packets from FIFO Queue and sorts it based on VLAN Tag and priority 
    pQueue100 p100; 
// cout <<packet <<endl;//print packets for testing 

    if (packet.substr(45,3) == "100"){ //if the packet matches VLAN 100.... 

     if (packet.substr(44,1) == "0"){ 
      priorityCode = 0; 
     }else if (packet.substr(44,1) == "2"){ 
      notif = "!!!!!!!!!Priority Packet Packet Found: <..." + packet.substr(16,11) + "...> !!!!!!!!!"; 
      priorityCode = 2; 
      packetCopy = packet; 
      //thr2.interupptHandler(packetCopy, notif); 
     }else 
      priorityCode = priorityCode; 

     p100.insert(packet, priorityCode); 


    }//end VLAN 100 

    else if (packet.substr(45,3) =="101") //if the packet matches VLAN 101 
    { 


     if (packet.substr(44,1) == "0"){ 
      priorityCode = 0; 
     }else if (packet.substr(44,1) == "2"){ 
      notif = "!!!!!!!!!Priority Packet Packet Found: <..." + packet.substr(16,11) + "...> !!!!!!!!!"; 
      priorityCode = 2; 
      packetCopy = packet; 
      //thr2.interupptHandler(packetCopy, notif); 

     }else 
      priorityCode = priorityCode; 
     //pQ101().recieveInterrupts(packet, priority,); 

    }//end VLAN 101 

    //p100.display(); 
+3

您是否尝试过通过代码行调试器步进一行,一看就知道它确实是你认为它应该做? – 2015-04-05 13:04:42

+0

我认为它与 有关,而(q-> link!= NULL && q-> link-> priority <= priority) – George 2015-04-05 13:09:05

+1

为什么重新发明轮子?你可以肯定使用'std :: priority_queue'吗? – 2015-04-05 13:12:19

回答

1

这是扭转的一个简单的问题您使用的比较运算符。

void pQueue100::insert(string packet, int priority) 
{ 
    node2 *temp, *q; 
    temp = new node2; 
    temp ->info= packet; 
    temp ->priority = priority; 
    if (front == NULL ||priority > front->priority) 
    { 
     temp->link =front; 
     front = temp; 
    }else 
    { 
     q = front; 
     while (q->link != NULL && q->link->priority >= priority) 
      q=q->link; 
     temp->link = q->link; 
     q->link=temp; 
    } 
} 

驱动程序代码:

int main() 
{ 
    pQueue100 q; 
    q.insert("alpha", 0); 
    q.insert("beta", 2); 
    q.insert("gamma", 0); 
    q.insert("delta", 2); 
    q.insert("epsilon", 0); 
    q.insert("zeta", 2); 
    // correct display sequence should be: 
    // beta, delta, zeta, alpha, gamma, epsilon 
    q.display(); 
} 

输出:

2|beta 
2|delta 
2|zeta 
0|alpha 
0|gamma 
0|epsilon