У меня есть двусвязный список с *head
и **ptail
. Я написал код для добавления в список и удаления из списка, но моя проблема заключается в освобождении информации.
Это объявление моего узла и моего связанного списка:
struct tcb_t { //Node
int thread_id;
int thread_priority;
ucontext_t *thread_context;
struct tcb_t *next;
}; typedef struct tcb_t tcb_t;
struct queue_t { //Linked List
tcb_t *head, **ptail;
}; typedef struct queue_t queue_t;
Это мой код для инициализации двусвязного списка:
struct queue_t* queue_create() { //Good
struct queue_t *q = (queue_t *) calloc(1,sizeof(queue_t));
q->head = NULL;
q->ptail = &q->head; // problem
return q;
}
Моя проблема связана со следующей функцией. Эта функция предназначена для освобождения всех узлов в списке, но цикл while бесконечен. Я думаю, что это связано с тем, что хвост при создании связанного списка указывает на голову, но я не уверен, есть ли способ исправить это без переписывания queue_create()
.
void t_shutdown() { //Fix
if(ready != NULL){
tcb_t *helper = ready->head;
while(helper->next != NULL){
tcb_t *temp = helper;
helper = helper->next;
if(temp->thread_id > 0){
free(temp->thread_context->uc_stack.ss_sp);
}
free(temp->thread_context);
free(temp);
}
free(ready);
}
ready = NULL;
}
Я хотел бы пройтись по списку и освободить все данные, но helper->next
всегда NULL
.
Любая помощь будет принята с благодарностью.
Редактировать 1
Эти функции показывают, как данные добавляются и удаляются из списков:
void queue_add(struct queue_t *q, tcb_t *ptr) { //Good
*q->ptail = ptr;
q->ptail = &ptr->next;
}
tcb_t *queue_remove(struct queue_t *q) { //Good
struct tcb_t *ptr = q->head;
if (ptr) {
q->head = ptr->next;
if (q->ptail == &ptr->next) {
q->head == NULL;
q->ptail = &q->head; // problem
}
}
return ptr;
}