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

C : enQueue : How does create a new pointer to the tail?

好的,所以我有一个 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,但这仍然给我留下了同样的问题。

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

使用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 来确定要查找的元素。当然可以 更改它,您可以检查值或另一个 属性,或 两者的结合。这取决于你(或者很可能是你的任务 工作)。重要的是一旦你离开循环 找到你的元素。

struct queueNode 中,我会将 data_t *data; 更改为 data_t data;。我没看到 拥有指向 data_t 的指针的好处是,您需要分配内存 为此,也必须释放它。会增加代码量 你需要为此写信。指针只有在您打算拥有一个数组时才有用 每个节点 data_t 个对象,但除此之外没有它作为指针将使生命 最后对你来说更容易。