2

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

结构:

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

4 回答 4

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 */
于 2012-07-07T09:28:23.203 回答
1

这里

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

new分配在堆栈上,所以不要调用free(queue). delete相反,queue->head = NULL; queue->size = 0;如@kirill 所述,设置为指示队列现在为空。

于 2012-07-07T09:33:55.317 回答
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;
于 2012-07-07T09:31:12.383 回答
0

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

于 2012-07-07T09:37:37.887 回答