2014-05-01 116 views
-1

我需要做一个队列链表中的第一个节点总是具有最小的值,因此需要进行排序,我写了这个代码:排序队列链表C++

#include <iostream> 
using namespace std; 

struct Node 
{ 
    int key; 
    Node *link; 
}; 

class qlinkedlist 
{ 
private: 
    Node *head; 
    Node *tail; 
    Node *curr; 
    Node *prev; 
    int count; 

public: 
    void Enqueue(int value) 
    { 
     Node *newnode = new Node; 
     newnode -> key = value; 
     newnode -> link = NULL; 
     if(head==NULL) 
     { 
      head=tail=newnode; 
      count++; 
     } 
     else if(newnode->key < head->key) 
     { 
      newnode -> link = head; 
      head = newnode; 
      count++; 

     } 
     else 
     { 
      prev=head; 
      curr=head->link; 
      while(curr != NULL) 
      { 
       if(newnode->key < curr->key) 
       { 
        prev->link = newnode; 
        newnode->link = curr; 
        count++; 
       } 
       else 
       { 
        prev = curr; 
        curr = curr ->link; 
       } 
      } 
     } 
    } 


    void Dequeue() 
    { 
     if(head==NULL) 
     { 
      cout<< "Queue is empty" << endl; 
     } 
     else 
     { 
      curr = head; 
      head = head -> link; 
      delete curr; 
      count--; 
     } 
    } 

    void print() 
    { 
     curr = head; 
     while (curr!=NULL) 
     { 
      cout << curr -> key << endl; 
      curr = curr -> link; 
     } 
    } 

}; 


void main() 
{ 
    qlinkedlist obj; 
    obj.Enqueue(5); 
    obj.Enqueue(4); 
    obj.Enqueue(3); 
    obj.Enqueue(2); 
    obj.Enqueue(1); 

    obj.print(); 
} 

问题是它只有当我按照上面的顺序添加节点时才起作用,例如,如果我尝试添加3然后2然后5不起作用,那么代码有什么问题? 谢谢

+0

与人们在标点或双方空间周围没有空格是什么? – crashmstr

+0

你想要做什么是一个优先级队列,有更好的方法来使用二叉搜索树来做到这一点。 – Guilherme

回答

1

因为如果您尝试添加比列表中所有内容更大的元素,它永远不会通过您唯一的条件来添加节点:if(newnode->key < curr->key)。试试这个:

while(curr != NULL && newnode->key > curr->key) 
{ 
    prev = curr; 
    curr = curr ->link;   
} 
prev->link = newnode; 
newnode->link = curr; 
count++; 

这样,你通过链表,直到找到正确的位置,然后再添加即使你到最后(CURR == NULL)的新节点。