C:enQueue:如何创建一个指向尾部的新指针?

时间:2018-02-16 23:24:58

标签: c queue doubly-linked-list

好吧,我有queue.h说:

typedef struct {
    int key;
    int value;
} data_t;

typedef struct queueNode {
    struct queueNode *next, *prev;
    data_t *data;
} QueueNode;
h
typedef struct queueType {
    QueueNode *head;
    QueueNode *tail;
} Queue;

我现在的目标是弄清楚如何迭代队列以在所述队列中查找特定节点,以及稍后的特定值。

我看到的问题是,我无法说Queue{?}将我带到特定的queueNode,我不知道如何说:

for queueNode in queue{scan return `queueNode` if valid}. 

我最近越过了确定如何使用全局变量大小确切知道有多少queueNodes的门槛,但这仍然让我遇到同样的问题。

1 个答案:

答案 0 :(得分:1)

对于这样的结构,迭代列表的常用方法是:

使用next

QueueNode *queue_find_forward(Queue *queue, int key)
{
    if(queue == NULL)
        return NULL;

    QueueNode *current = queue->head;

    while(current)
    {
        if(current->data->key == key)
            return current;

        current = current->next;
    }

    // no node has the requested key
    return NULL;
}

使用prev

QueueNode *queue_find_backwards(Queue *queue, int key)
{
    if(queue == NULL)
        return NULL;

    QueueNode *current = queue->tail;

    while(current)
    {
        if(current->data->key == key)
            return current;

        current = current->prev;
    }

    // no node has the requested key
    return NULL;
}

但请注意,队列必须正确初始化,节点必须 正确初始化后,最后一个元素的next指针必须指向 NULL,第一个元素的prev指针必须指向NULL 好。

两个函数都在while循环中进行检查:

        if(current->data->key == key)

我决定使用key来确定要查找的元素。当然可以 改变这一点,你可以检查价值或其他财产,或a 两者的结合。这取决于您(或者很可能是您的任务 工作)。重要的是你一旦离开循环就行了 找到了你的元素。

struct queueNode,我将data_t *data;更改为data_t data;。我不明白 有一个指向data_t的指针的好处,你需要分配内存 对它来说,也必须释放它。它会增加代码量 你需要为此写作。只有在打算使用数组时,指针才有用 每个节点有data_t个对象,但是否则没有它作为指针会生活 最终你会更容易。