Элемент prepend с двойным связным списком по ссылке в C - PullRequest
0 голосов
/ 14 августа 2011

Я пытаюсь написать двойной связанный список на C.

Это моя реализация:

   typedef struct
    {
        void* value;
        struct Dlist* prev;
        struct Dlist* next;
    } Dlist;

    Dlist* createDlist()
    {
      Dlist* newList = (Dlist*)malloc (sizeof(Dlist));
      newList->value = NULL;
      newList->next = NULL;
      newList->prev = NULL;
      return newList;
    }

    /*
     * Get last element from Dlist
     */
    Dlist* getLast(Dlist* list)
    {
      if (list)
      {
          while(list->next)
            list = (Dlist*)list->next;
      }
      return list;
    }

    /*
     * add element to list at start
     */
    Dlist* addItemAtStart(Dlist* list, Pair* value)
    {
      Dlist* newList = NULL;
      Dlist* last = NULL;

      newList = createDlist ();
      newList->value = value;

      if (list)
      {
         last = getLast(list);
         last->next = newList;
         newList->prev = last;

         return list;
      }
      else
        return newList;
    }

Теперь, когда я пытаюсь добавить элемент в свой список, мне нужно каждый раз назначать новое значение:

list = addItemAtStart(list, "Hello");

Но я хочу только

addItemAtStart(list, "Hello");

Без list = Как сделать так, чтобы список изменялся без присваивания?

стр. С. Я получаю segfaut с Dlist* addItemAtStart(Dlist **list, void* value)

пытаюсь вставить так:

  Dlist **list = NULL;
  addItemAtStart(&list, "Hello");

Спасибо.

Ответы [ 5 ]

2 голосов
/ 14 августа 2011

Дать ссылку на головной узел для вставки узла при запуске.

Dlist* addItemAtStart(Dlist** list, Pair* value)
    {
      Dlist* newList = NULL;
      Dlist* last = NULL;

      newList = createDlist();
      newList->value = value;

      if (list)
  {
     last = getLast(*list);
     last->next = newList;
     newList->prev = last;


  }
  else
    *list = newList
2 голосов
/ 14 августа 2011

Вы можете написать свою функцию, чтобы принимать указатель на указатель на список:

 Dlist* addItemAtStart(Dlist** list, Pair* value)

Просто убедитесь, что вы добавили еще один уровень косвенности внутри addItemAtStart при использовании list.

Функция может быть вызвана с помощью

addItemAtStart(&list, "Hello");
2 голосов
/ 14 августа 2011

Если вы обрабатываете список, указывая на его первый элемент, возможно, вам следует использовать двойное косвенное обращение:

void addItemAtStart(Dlist** plist, Pair* value)
{
    // replace all list with *plist
}

addItemAtStart(&list, "Hello");
0 голосов
/ 15 августа 2011

Использование глобального списка решит вашу проблему.В функции присвойте значение объекту списка.Я попробовал это.

0 голосов
/ 14 августа 2011

для этого вам нужно создать статический указатель узла связанного списка.убедитесь, что метод atitematstart обновляет этот узел.

...