我只是在这个问题上坚持了几个小时,试图找到我的代码中断的地方。我知道如何删除链表,但有些东西不工作。
首先,它是一个非常简单的结构体,数据类型为int和2结构体*next和*prev。
struct _list_{
struct _list_ *next;
struct _list_ *prev;
float distance;
}
现在我正在做一个push_front函数,它工作得很好。我得到了我想要的结果。但是现在我正在制作pop_front函数,缺少了一些东西。
函数应该返回距离,然后从链表中删除该列表,但我不能让它这样做。
这是我写的代码
int pop_front(list** header)
{
float number = (*header)->data;
list *head = *header;
list *remove = head;
// This should check if the pointer is pointing at the first element
while (head->prev != NULL) {
head = head->prev;
}
if (head) {
head = head->next;
free(remove);
remove = head;
remove->prev = NULL;
//if i remove the code below then i get this error
//*** Error in `./double_ended_queue.out': double free or
//corruption (fasttop): 0x0000000001d5a050 ***
//Pop up: 3 pointer: 3 Aborted (core dumped)
*header = *remove;
//And with this code i get a Segmentation fault (core dumped
return number;
}
return 0;
}
任何帮助将是伟大的,谢谢你。
注:检查了这里所有的链表问题,没有一个帮助。
你们的作业都是从哪来的?API sux。在这里,其他人确实有几乎相同的作业(链接指向我的答案,还有很多问题):指针Dequeue -指针训练
无论如何:
你想返回int还是float?元素data是float类型,变量number也是,但是函数返回int。
int pop_front(list** header)
{
float number = (*header)->data;
那么,这里你得到的是你想要删除的元素的值,但是。
list *head = *header;
list *remove = head;
// This should check if the pointer is pointing at the first element
while (head->prev != NULL) {
head = head->prev;
}
…你实际上是搜索要删除的元素。
显然,你必须反过来做:
int pop_front(list** header)
{
list * head = *header;
while (head->prev) head = head->prev;
现在,你应该检查,你是否需要调整*头指针(并立即做):
if (*header == head) {
*header = head->next;
}
现在唯一要做的就是从列表中删除对象,获取它的值,并在返回之前释放它的内存。
head->next->prev = NULL;
float retval = head->data;
free(head);
return retval;
}
作为留给你的练习:确保空列表不会崩溃;)
/edit:这也会因为删除最后一个元素而崩溃,所以您还剩下两个练习;)