这个队列实现有什么问题?

时间:2016-09-09 13:27:14

标签: c pointers queue

以下是我的队列实现。我的队列只是一个由两个qnode组成的数组:头部和后部。 enqueue和dequeue应该处理内部队列实现。

在用不同的整数调用enqueue后,Q[0].next == Q[1].next的输出为1。我无法弄清楚错误。

struct Qnode{
int index;
struct Qnode *next;
};
typedef struct Qnode qnode;

qnode* makeQueue(){
     qnode *Q;
     Q = (qnode *) malloc(2*sizeof(qnode));
     qnode head,tail;
     head.next = NULL;
     tail.next = NULL;
     head.index = 0;
     tail.index = -1;
     Q[0] = head;
     Q[1] = tail;
     return Q;
}

void enQueue(qnode *Q, int index){
    qnode node,head = Q[0], rear = Q[1];
    node.index = index;
    node.next = NULL;
    if(head.next == NULL && rear.next == NULL){
        head.next = &node;
        rear.next = &node;
    }
    else{
        (rear.next)->next = &node;
        rear.next = &node;
    }
    Q[0].index = head.index + 1;
}

由于

1 个答案:

答案 0 :(得分:0)

您在enQueue功能

中遇到问题
qnode node,head = Q[0], rear = Q[1];
node.index = index;
node.next = NULL;
if(head.next == NULL && rear.next == NULL){
    head.next = &node;
    rear.next = &node;
}

上面的代码片段为head.nextrear.next分配了本地范围变量的地址:即堆栈分配变量。

node变量只有在函数结束时才会存在。因此,指向这些指针的地址在函数外部无效:在函数外访问它是非法的Undefined Behavior

此外,对该函数所做的所有修改都不会反映到Q数组中:您正在修改数组元素的本地范围副本。