作为练习,我试图创建一个基本队列。我的deQueue
方法出了问题。
#include<stdio.h>
typedef int Task;
typedef struct QueueNode_ QueueNode;
typedef struct TQueue_ TQueue;
struct QueueNode_ {
QueueNode* next;
Task task;
};
struct TQueue_ {
QueueNode* first;
QueueNode* last;
};
TQueue* initializeQueue(){
TQueue* queue = NULL;
queue = malloc(sizeof(TQueue));
queue->first = NULL;
queue->last = NULL;
return queue;
}
void enQueue(TQueue* q, Task t){
if(q->first == NULL){
q->first = malloc(sizeof(QueueNode));
q->first->task = t;
q->first->next = NULL;
q->last = q->first;
} else {
QueueNode* node = malloc(sizeof(QueueNode));
node->next = q->last;
node->task = t;
q->last = node;
}
}
void printQueue(TQueue* q){
QueueNode* node = q->last;
printf("LAST->");
while(node != NULL){
printf("%d->", node->task);
node = node->next;
}
printf("FIRST\n");
}
QueueNode* deQueue(TQueue* q){
QueueNode* temp = q->first;
QueueNode* newFirst = q->last;
q->first = NULL;
while(newFirst != NULL){
newFirst = newFirst->next;
}
q->first = newFirst;
return temp;
}
int main(){
TQueue* queue = initializeQueue();
enQueue(queue, 1);
enQueue(queue, 2);
printQueue(queue);
QueueNode* node = deQueue(queue);
printf("%d\n", node->task);
printQueue(queue);
return 0;
}
我希望我的deQueue
方法删除队列的头部。但事实并非如此。
这是输出:
LAST->2->1->FIRST
1
LAST->2->1->FIRST
我怀疑我的deQueue
方法没有用第二个元素替换队列的头部,但是我用q->first = newFirst;
做了这个,所以我有点卡住了。
如果不清楚我会期望它打印出来:
LAST->2->1->FIRST
1
LAST->2->FIRST
答案 0 :(得分:1)
你可以这样做:
QueueNode* deQueue(TQueue* q){
QueueNode *tmp = q->last;
while(tmp->next != q->first) {
tmp = tmp->next;
}
// new first is now the old second element
q->first = tmp;
// new firsts' next still points at
// old first so we free that memory here
free(q->first->next);
q->first->next = NULL;
return tmp;
}
不要忘记释放你的记忆。
您可以在此处进行测试:http://www.compileonline.com/compile_c_online.php