我试图构建一个简单的队列,但我被卡住了。我将用的数据结构来解释它
typedef struct location_tag {
int x;
int y;
} Location;
typedef struct QueueNode{
struct QueueNode *next;
Location location;
}QueueNode;
typedef struct Queue{
struct QueueNode *begin;
struct QueueNode *end;
int size;
}Queue;
队列将保存一个指向其中第一个和最后一个元素的指针。每个节点都知道它是下一个。现在我实现了入队/出队操作:
void enqueue(Location l, Queue *q) {
printf("--------ENQUEUE--------n");
QueueNode newEntry = { NULL, l };
if (q->size == 0) {
q->end = &newEntry;
q->begin = &newEntry;
} else {
newEntry.next = q->begin;
q->begin = &newEntry;
}
q->size++;
printQueue(q);
}
QueueNode* dequeue(Queue *q) {
printf("--------DEQUEUE--------n");
QueueNode* node = q->end;
q->size--;
QueueNode *currentNode = q->begin;
for (int z = 1; z < q->size; ++z) {
currentNode = currentNode->next;
}
q->end = currentNode;
printQueue(q);
return node;
}
void printQueue(Queue* q) {
QueueNode *currentNode = q->begin;
for (int z = 0; z < q->size; ++z) {
printf("Location(x=%d|y=%d) ==next==> ", currentNode->location.x,
currentNode->location.y);
currentNode = currentNode->next;
}
printf("nn");
}
这是一个FIFO队列。因此,当调用出队列时,第一个条目将是第一个。这里有一个测试的要点。
int main(void){
Queue queue = { NULL, NULL, 0 };
queuePtr = &queue;
Location l1 = { 1, 0 };
Location l2 = { 2, 0 };
Location l3 = { 3, 0 };
enqueue(l1, queuePtr);
enqueue(l2, queuePtr);
enqueue(l3, queuePtr);
while (queue.size != 0) {
nodePtr = dequeue(queuePtr);
}
return 0;
}
问题是什么?当我在队列中放入一个新条目时,指向下一个元素的指针将指向节点本身。下面是一个输出示例:
--------排队--------位置(x=1|y=0)===下一个===>
--------排队--------位置(x=2|y=0)===next===>位置(x=2*y=0)==next===>
--------排队--------位置(x=3|y=0)===next===位置(x=3]y=0)==next===
我不理解这种行为。我猜这是错误的newEntry.next = q->begin);
?也许你能帮我。谢谢。
主要问题是newEntry
存在于堆栈上:
void enqueue(Location l, Queue *q) {
printf("--------ENQUEUE--------n");
QueueNode newEntry = { NULL, l };
if (q->size == 0) {
q->end = &newEntry;
...
一旦enqueue()
返回,newEntry
就不存在了,当您试图取消引用指向newEntry
的任何指针时,就会出现未定义的行为。