带有优先级队列的c ++链接列表

时间:2014-06-29 11:36:43

标签: c++

我尝试使用优先级队列编写链接列表,但我遇到了一些问题。

我从最多1个到7个最不重要的大约有7个优先级。

这是我当前的插入方法。

void queue::addToQueueList(int newPriority, double newFare, int custID)
{
    node* newnode= new node;
    newnode->priority= newPriority;
    newnode->fare = newFare;
    newnode->cusID = custID;
    newnode->next= NULL;

    if (isempty())
    {
        front = back = newnode;
    }
    else
    {
        node* temp = front;
        if(newnode->priority < temp->priority)
        {
            newnode->next = front;
            front = newnode;
        }
        else
        {
            while(newnode->priority < temp->priority)
            {
                if(temp->next == NULL)
                {
                    break;
                    temp = temp->next;
                }
            }
            if(temp->next == NULL && newnode->priority < temp->priority)
            {
                back->next = newnode;
                back = newnode;
            }
            else
            {
                newnode->next = temp->next;
                temp->next = newnode;
            }
        }
    }
}

调用为:

qList->addToQueueList(2, 488.88, A);
qList->addToQueueList(1, 388.88, B);
qList->addToQueueList(3, 488.88, C);

预期结果应为:

B, A, C

结果显示:

B, C, A

2 个答案:

答案 0 :(得分:2)

你的制作比它需要的要难得多。最终,您需要遍历列表,找到插入点,记住您是如何到达该插入点的,并且适当地连接两个您的前后指针。此外,优先级队列没有理由保留“后退”指针,所以我不确定为什么你有一个。

有很多方法可以做到这一点。首先,为了使代码更清晰,为node提供适当的参数化构造函数既简单又有帮助:

struct node
{
    int priority;
    double fare;
    int cusID;
    node *next;

    node(int p, double f, int id, node *nxt = nullptr)
        : priority(p), fare(f), cusID(id), next(nxt)
    {
    }
};

你有一个,你可以沿着你显然试图导航的道路,使用指针值列表行走方法。要做到这一点,你需要维护一个前一个指针:

void queue::addToQueueList(int newPriority, double newFare, int custID)
{
    node* temp = front, *prev = NULL;
    while (temp && temp->priority < newPriority)
    {
        prev = temp;         // remember how we got here
        temp = temp->next;   // advance to next node
    }

    // create new node, linking to temp
    node *newnode = new node(newPriority, newFair, custID, temp);

    // link to previous node or assign as new head, whichever is needed
    if (prev != nullptr)
        prev->next = newnode;
    else
        head = newnode;

    // though there is no need for a back pointer in a priority queue
    //  you had one none-the-less, so....
    if (!temp)
        back = newnode;
}

值得注意的是,此算法将在列表的该优先级部分的 head 处插入具有相似优先级的新到达。即给定优先级的最新到达始终位于该优先级在队列中的位置的最前沿。如果您希望给定优先级的最旧的到达者“领先于”他们的兄弟,您只需要更改它:

while (temp && temp->priority < newPriority)

到此:

while (temp && temp->priority <= newPriority)  // note < is now <=

祝你好运。

答案 1 :(得分:0)

你的while循环中的比较是错误的。插入C newnode->priority == 3temp(B)->priority == 1时。因此永远不会输入while循环。

此外,while循环内的temp = temp->next应位于if语句之外(之后)。否则这将是一个无限循环。

假设您正在纠正这些:您将始终在 temp之后插入新元素。在你的比较修正中要注意这一点。您也可以添加与temp->next->priority的比较。

我在评论中同意Joachim:使用调试器逐步执行代码。然后,您可以看到变量的值以及哪些比较产生哪些结果。