我正在嘗試構建一個簡單的隊列,但我被卡住了。我將用數據結構來解釋它指針不會顯示到隊列中的下一個條目
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("\n\n");
}
這是一個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;
}
這是什麼問題?當我在隊列中放入一個新條目時,指向下一個元素的指針將指向節點本身。下面是一個例子輸出:
-------- -------- ENQUEUE 位置(x = 1 | Y = 0)==下==>
--- ----- ENQUEUE -------- 位置(x = 2 | y = 0)== next ==>位置(x = 2 | y = 0)== next ==>
-------- ENQUEUE -------- 位置(x = 3 | y = 0)== next ==>位置(x = 3 | y = 0)== next == >位置(x = 3 | y = 0)== next ==>
我不明白這種行爲。我猜這是錯的newEntry.next = q->begin);
? 也許你可以幫助我。謝謝。
有時......好的。那個小提醒幫了我很多。我手動分配內存併爲其指定一個指針。問題解決了。謝謝。 –