我只是坚持了几个小时的问题,试图找到我的代码中断的地方。我知道如何删除链表但有些东西不起作用。
首先,它是一个非常简单的结构,其dataype为int,2 struct * 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;
}
任何帮助都会很棒,谢谢。
P.S。检查了所有链表问题,没有人帮忙。
答案 0 :(得分:0)
你们从哪里获得这个功课? API sux。在这里,其他人确实有几乎相同的作业(链接指向我的答案,其中还有很多问题):Pointer Dequeue - pointer training
反正:
你想返回int还是float?元素数据是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:这也会因删除最后一个元素而崩溃,所以你还剩下两个练习;)