我尝试在C中编写一个双链表。现在我写了一个getLast
元素函数:
Dlist* getLast(Dlist **list)
{
if (list != NULL)
{
while((*list) != NULL)
(*list) = (*list)->next;
}
return (*list);
}
编程接收信号SIGSEGV,分段故障。 在src / dlist.c:29的getLast(list = 0x804a008)中为0x080485ce 29(* list)=(* list) - > next;
我添加一个元素,它没关系。当我尝试添加第二个元素时,我遇到了分段错误。
我这样称呼这个函数:
Dlist* addItemAtStart(Dlist** list, Pair* value)
{
Dlist* last = NULL;
last = getLast (*list);
...
}
怎么了?
答案 0 :(得分:3)
您的代码返回NULL指针。
while(*list->next != NULL)
答案 1 :(得分:1)
您需要将列表指针存储在临时变量中,这样您就不会破坏列表(或其他内存):
Dlist* getLast(Dlist **list)
{
if (list != NULL)
{
Dlist *ptr = *list;
if (ptr == NULL)
return NULL;
while(ptr->next != NULL)
ptr = ptr->next;
return ptr;
}
return NULL;
}
答案 2 :(得分:1)
你正在破坏所有列表指针。您的许多问题都源于不接受基本列表结构。列表是的第一个元素 - 您不需要将其表示为指向第一个元素的指针。
有些代码可以说明吗?
DIList * myList ; // This is your list, add elements to it
DIList * lastElement = getLast(myList); // Last element in your list, also a list
DIList * getLast(DIList * aList) {
if(aList == NULL) return NULL;
DIList * aNode = aList;
while(aNode->next != NULL) aNode = aNode->next;
return aNode;
}
答案 3 :(得分:0)
在addItemAtStart中,您为什么使用:
last = getLast (*list);
而不是:
last = getLast(list);
此外,在getLast中,您不应该使用:
while((*list)->next != NULL)
而不是:
while((*list) != NULL)
答案 4 :(得分:0)
下次在代码中遇到问题时,请提供所有代码,而不仅仅是一部分!
#include <stdio.h>
#include <stdlib.h>
struct node{
void* value;
struct node *prev, *next;
};
/*This Function is Unnecessary
struct node * createList(){
struct node *newNode=malloc(sizeof(struct node));
newNode->value = NULL;
newNode->next = NULL;
newNode->prev = NULL;
return newNode;
}
*/
/*
*This Function is also Unnecessary
*Get last element from Dlist
struct node* getLast(struct node* node){
while(node){
if (node->next==NULL) break;
node=node->next;
}
return node;
}
*/
/*add element to list at start*/
void addItemAtStart(struct node **head, void *value){
struct node *newNode=malloc(sizeof(struct node));
if (newNode==NULL) return;
newNode->value=value;
newNode->prev=NULL;
newNode->next=*head;
if (*head!=NULL) (*head)->prev=newNode;
*head=newNode;
}
int main(){
struct node *list=NULL;
addItemAtStart(&list, "apple");
addItemAtStart(&list, "lemon");
addItemAtStart(&list, "orange");
addItemAtStart(&list, "peach");
return 0;
}