我正在尝试从结构队列中删除所有节点。
结构:
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);
}
}
它不起作用,我没有想法。有什么建议吗?
答案 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。