好吧,我有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
的门槛,但这仍然让我遇到同样的问题。
答案 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
个对象,但是否则没有它作为指针会生活
最终你会更容易。