我很好奇如何删除存储在列表中的结构。 我尝试了这段代码,但它给了我一个分段错误错误,我看不出错误。
typedef struct double_stack_head_struct
{
struct double_stack_head_struct* tail;
double value;
} double_stack_head;
typedef struct double_stack_struct // the structure containing the state of a stack
{
int size; // size of stack
double_stack_head* head;
} double_stack;
void push_double_stack(double_stack* stack, double value)
{
double_stack_head* new_head = malloc(sizeof(double_stack_head));
if(new_head != NULL) {
new_head->tail = stack->head;
new_head->value = value;
stack->head = new_head;
stack->size += 1;
}
}
int pop_double_stack(double_stack* stack, double* value)
{
if(empty_double_stack(stack)) {
return false;
} else {
*value = stack->head->value;
free(stack->head);
stack->size -= 1;
stack->head = malloc(sizeof(stack->head));
stack->head = stack->head->tail;
return true;
}
}
答案 0 :(得分:1)
请记住,br = mechanize.Browser()
#Change the 2nd tuple entry to your particular user agent, you can check it in http://whatsmyuseragent.com/
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36')]
和malloc
应该相互对称,因为对于在堆上分配内存的给定free
调用,应该有匹配的{{ 1}}调用解除分配它。
如果我们只看一下堆栈逻辑,那么push函数会分配一个新节点。您的pop函数释放一个节点,但它也分配一个新节点。所以我们在这里有一些不对称的东西,这将成为一个问题。
需要注意的另一点是,malloc
与free
不同。当您执行sizeof(struct Node*)
时,您实际上正在检查sizeof(struct Node)
类型的大小,该大小是指针的大小而不是指针。
但是,你真的不想在pop函数中分配新节点,所以你需要纠正它的堆栈逻辑。当你从像这样的单链表中弹出时,你想捕获一个指向头部节点的指针(堆栈的顶部),将头部设置为指向下一个元素(在堆栈顶部的正下方),并解放前任主管。
答案 1 :(得分:0)
don't do this!!
stack->head = malloc(sizeof(stack->head));
使用它:
stack->head = (double_stack_head *)malloc(sizeof(double_stack_head));
还要注意以下功能
void push_double_stack(double_stack* stack, double value)
它在double_stack和double_stack_struct
之间创建一个引用循环