获取C双链表中的最后一个元素错误

时间:2011-08-16 17:42:25

标签: c list pointers linked-list

我尝试在C中编写一个双链表。现在我写了一个getLast元素函数:

Dlist* getLast(Dlist **list)
{
    if (list != NULL)
    {
        while((*list) != NULL)
            (*list) = (*list)->next;
    }
    return (*list);
}

我得到segmentation fault

  

编程接收信号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);
    ...
}

怎么了?

5 个答案:

答案 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;
}