Получить последнюю ошибку элемента в двойном связанном списке C - PullRequest
0 голосов
/ 16 августа 2011

Я пытаюсь написать двойной связанный список на C. И теперь я пишу функцию элемента getLast:

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

Я получаю ошибку сегментации :

Программа получила сигнал SIGSEGV, Ошибка сегментации.0x080485ce в getLast (list = 0x804a008) в src / dlist.c: 29 29 (* list) = (* list) -> next;

Я добавляю один элемент, и это нормально.Когда я пытаюсь добавить второй элемент, я получаю ошибку сегментации.

Я вызываю эту функцию так:

Dlist* addItemAtStart(Dlist** list, Pair* value)
{
    Dlist* last = NULL;
    last = getLast (*list);
    ...
}

Что не так?

Ответы [ 4 ]

3 голосов
/ 16 августа 2011

Ваш код возвращает нулевой указатель.

while(*list->next != NULL)
1 голос
/ 16 августа 2011

Вы забиваете все свои указатели списка. Многие из ваших проблем коренятся в том, что вы не принимаете основную структуру списка. Список является его первым элементом - вам не нужно представлять его как указатель на этот первый элемент.

Какой-нибудь код для иллюстрации?

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;
}
1 голос
/ 16 августа 2011

Вам необходимо сохранить указатель списка во временной переменной, чтобы не загромождать ваш список (или другую память):

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;
}
0 голосов
/ 16 августа 2011

В addItemAtStart почему вы используете:

    last = getLast (*list);

вместо:

    last = getLast(list);

Кроме того, в getLast не следует использовать:

    while((*list)->next != NULL)

вместо:

    while((*list) != NULL)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...