当某个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;