指针不会显示在队列中的下一个条目中

时间:2013-06-29 19:23:37

标签: c data-structures

我正在尝试建立一个简单的队列,但我被困住了。我将用数据结构解释它

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;

队列将保存指向其中第一个和最后一个元素的指针。每个节点都知道它是下一个。现在我实现了enqueue- / dequeue-operations:

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队列。所以第一个条目将是第一个调用dequeue的条目。这是测试的主要内容。

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;
}

问题是什么?当我在队列中放入一个新条目时,指向下一个元素的指针将指向节点itselft。这是一个示例输出:

-------- -------- ENQUEUE 位置(x = 1 | y = 0)== next ==&gt;

-------- -------- ENQUEUE 位置(x = 2 | y = 0)== next ==&gt;位置(x = 2 | y = 0)== next ==&gt;

-------- -------- ENQUEUE 位置(x = 3 | y = 0)== next ==&gt;位置(x = 3 | y = 0)== next ==&gt;位置(x = 3 | y = 0)== next ==&gt;

我不明白这种行为。我想这是错误的newEntry.next = q->begin);? 也许你可以帮助我。谢谢。

1 个答案:

答案 0 :(得分:1)

主要问题是newEntry存在于堆栈中:

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

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

enqueue()返回后,newEntry不再存在,当您尝试取消引用newEntry的任何指针时,您将undefined behaviour