从结构队列中删除所有节点

时间:2012-07-07 09:18:04

标签: c structure free

我正在尝试从结构队列中删除所有节点。

结构:

struct element{

    int id;
    int sign;
    int year;
    int month;
    double amount;

    struct element *next;
};

struct queue{
    struct element *head;  

    int size;
};

我写的功能:

void delete(struct queue *queue) {
    if (queue->size == 0){
        printf("Structure is empty\n");
    }
    else {
        struct element* this;
        struct element* other;      

        for(this=queue->head;this!=NULL;this=other)
        {
            other=this->next;
            free(this);
        }
        free(queue);
    }   
}

它不起作用,我没有想法。有什么建议吗?

4 个答案:

答案 0 :(得分:1)

delete例程中,如果大小为空,则不释放queue,但如果大小为非空,则释放它。对于这两种情况,您可能应该这样做。也就是说,要么两个地方都没有空闲,要么两地都免费。

需要弄清楚正确的事情是很麻烦的,因为delete无法知道queue是如何分配的。鉴于您目前的设计,一个出路可能是将标志传递给delete以指示它应该做什么:

void delete(struct queue *queue, int do_free) {
    if (queue->size == 0){
        printf("Structure is empty\n");
    }
    else {
        struct element* this;
        struct element* other;
        for(this=queue->head;this!=NULL;this=other) {
            other=this->next;
            free(this);
        }
        queue->head = 0;
        queue->size = 0;
    }
    if (do_free) free(queue);
}

struct queue new;
/* ... */
delete(&new, 0);      /* don't free the queue */

struct queue *empty_new = malloc(sizeof(struct queue));
empty_new->size = 0;
delete(empty_new, 1); /* free the empty queue */

答案 1 :(得分:1)

下面

struct queue new;
//...
delete(&new);

new已在堆叠中分配,因此请勿在{{1​​}}中呼叫free(queue)。 相反,设置delete以指示队列现在为空,如@kirill所述。

答案 2 :(得分:0)

如何传递队列的第一个元素。

void delete(element *el ) {
    if(el) {
        delete(el->next );
        free(el);
    }
}

typedef struct _element{

  int id;
  int sign;
  int year;
  int month;
  double amount;

  struct _element *next;

} element;

答案 3 :(得分:0)

您可能忘记在函数末尾更新指针为NULL以及将队列大小更改为0。