2013-06-29 24 views
0

我正在嘗試構建一個簡單的隊列,但我被卡住了。我將用數據結構來解釋它指針不會顯示到隊列中的下一個條目

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);? 也許你可以幫助我。謝謝。

回答

1

的主要問題是,newEntry生活在棧上:

void enqueue(Location l, Queue *q) { 
    printf("--------ENQUEUE--------\n"); 
    QueueNode newEntry = { NULL, l }; 

    if (q->size == 0) { 
     q->end = &newEntry; 
     ... 

一旦enqueue()回報,newEntry不復存在,你就會有undefined behaviour您嘗試取消引用任何指針到newEntry的時刻。

+0

有時......好的。那個小提醒幫了我很多。我手動分配內存併爲其指定一個指針。問題解決了。謝謝。 –