C语言 将头节点从第一个链表移动到第二个链表的后面



当某个if语句被传递时,我必须从我的第一个链表"new_queue"并将此添加到我的第二个链接列表"ready_queue"后面。

当我尝试这个头部从"new_queue"但是它不会被添加到"ready_queue"的后面,而是总是替换"ready_queue"中的第二个节点。

我认为这是因为ready_queue_prev -> next = NULL;行,但是如果我删除这一行,整个链表将被放在"ready_queue"的后面。而不仅仅是节点。

有人知道怎么解决这个问题吗?

typedef struct ST_PCB {
int arrival_time;
char name[9];
int duration;
struct ST_PCB * next;
} T_PCB;

int main(void){
// serial list of newly arrived tasks
T_PCB * new_queue = NULL;
// circular list of active tasks
T_PCB * ready_queue = NULL;
// extra state needed to switch tasks 
// from new_queue to ready_queue when they're started
T_PCB * ready_queue_prev = NULL;
//this constructs the linked-list and sorts it by arrival time
new_queue = read_tasks();
new_queue = sort_tasks_on_arrival(new_queue);

if(something happends...){
if(ready_queue != NULL){
ready_queue_prev = new_queue;
new_queue = new_queue->next;      
ready_queue -> next = ready_queue_prev;
ready_queue_prev -> next = NULL;
}
else{
ready_queue = new_queue;
new_queue = new_queue->next;
ready_queue->next = NULL;     
}
}
}

当传递某个if语句时,我必须删除头节点从我的第一个链接列表"new_queue"把这个加到我的第二个链表"ready_queue"

要在链表的尾部添加一个节点,必须找到尾部。

首先,实际上你需要检查new_queue是否不等于NULL。如果它等于NULL,则不需要追加任何内容。if语句(不需要任何其他语句,因为它不是必需的)可以如下所示

if ( new_queue != NULL)
{
T_PCB *tmp = new_queue;
new_queue = new_queue->next;
tmp->next = NULL;
T_PCB **current = &ready_queue;
while ( *current != NULL ) current = &( *current )->next;
*current = tmp;     
}

这个语句确实使该节点成为列表中的第二个节点:

ready_queue -> next = ready_queue_prev;

ready_queue是队列的头部,而不是尾部。你需要先找出尾部在哪里,然后在这里赋值:

T_PCB * tail = ready_queue;
while (tail->next != NULL) {
tail = tail->next;
}
// We found the tail. Now make the assignment to `next`:
tail->next = ready_queue_prev;
// And now continue with what you had:
ready_queue_prev->next = NULL;

相关内容

  • 没有找到相关文章

最新更新