【发布时间】:2016-09-09 13:27:14
【问题描述】:
以下是我的队列实现。我的队列只是一个由两个 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;
}
谢谢
【问题讨论】:
-
malloc(2*sizeof(qnode));? -
因为 Q 本身将是 2 个 qnodes 的数组
-
首先,它不会是2个节点的array,而是链表,你只需要head节点指向第一个节点或
NULL。您的enqueue函数应根据需要分配节点。 Example. -
如果在
makeQueue之后调用enQueue,由于rear.next == -1,(rear.next)->next = &node;是UB -
您将 Q[0] 的值复制到 head 变量中,然后修改该变量的值。这不会反映在 Q[0] 中。您应该使用指针 *head 进入 Q[0] 或者只是将其用作 Q[0].whatever