gpt4 book ai didi

c - 在 C 中添加到 FIFO 队列尾部时遇到问题,引用最后一个元素

转载 作者:行者123 更新时间:2023-11-30 17:06:20 24 4
gpt4 key购买 nike

我很难理解 C。我正在尝试实现一个 FIFO 链接列表,其中我有一个对列表尾端的引用,以便在添加元素时轻松访问。当头部和尾部是同一个节点时,对空列表进行排队效果很好。但是,当我第二次入队时,后端正确的是新节点,但头部也更新了,应该保持不变。对我可能做错了什么有什么想法吗?如果单行条件语句难以阅读,我提前表示歉意。

typedef struct node {
PCB *pcb;
struct node *next;
}Node;

typedef struct queue {
Node *head, *rear;
int size;
}Queue;

Queue * enqueue (Queue *queue, PCB *pcb) {

// Ready a new node to add to list:
Node node = {pcb, NULL};

// Node becomes head in empty list, otherwise appended to rear.
queue->size == 0 ? (queue->head = queue->rear = &node) : (queue->rear = &node);

// Keep track of list size
queue->size++;

return queue;
}

更新:

Queue * enqueue (Queue *queue, PCB *pcb) {


// Ready a new node to add to list:
Node *node = malloc(sizeof(Node));
node->pcb = pcb;
node->next = NULL;

// Node becomes head in empty list, otherwise appended to rear.
queue->size == 0 ? (queue->head = queue->rear = node) : (queue->rear->next = node);

// New node always becomes the new rear node
queue->rear = node;

// Keep track of list size
queue->size++;

return queue;
}

最佳答案

当第一个节点添加到队列中时,更新的代码不太正确,因为行 queue->head->next = queue->rear; 设置 node-> next = node 而不是将其设置为 NULL。此外,新的 rear 将始终是新节点,并且可以在 if/else 语句之外设置。

Queue * enqueue (Queue *queue, PCB *pcb) {

// Ready a new node to add to list:
Node *node = calloc(1, sizeof(Node));
node->pcb = pcb;
node->next = NULL;

// Node becomes head in empty list, otherwise appended to rear.
if (queue->size == 0) {
queue->head = node;
} else {
queue->rear->next = node;
}
queue->rear = node;

// Keep track of list size
queue->size++;

return queue;
}

关于c - 在 C 中添加到 FIFO 队列尾部时遇到问题,引用最后一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34808810/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com