2015-04-05 67 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