2013-09-12 4 views
-4

Может ли кто-нибудь дать мне ссылку или хороший учебник или ссылку на любую книгу, где указаны вставка и удаление двойного связанного списка. Мне нужно создать 2 функции: одну для вставки элемента после позиции и удаление элемента после позиции. Я нахожу много онлайновых программ, но не понимаю алгоритма или логики. Может ли кто-нибудь объяснить мне, что происходит при вставке или удалении после определенного узла? То, что я понял до сих пор узел объявлен во всем мире как:Проблема с вставкой с двойным соединением

struct node{ 
      struct node *prev; 
      struct node *next; 
      int info; 
      }*start; 

Что это значит *start здесь?

+0

Можете ли вы рассказать мне причину голосующих голосов. Я действительно новичок в структурах данных и пытаюсь понять, что не хочу готового кода! – user227666

+1

* (я не занижен, но ...) * вы начинаете с просьбы о рекомендации по учебному курсу (как правило, не подходит для этого сайта), а затем переходите к вопросу о двух функциях (вы не показывали ни одной части любой функции), и, наконец, спросите о синтаксисе структуры в C. ** Задайте один, ясный, сжатый вопрос. ** – abelenky

+0

@abelenky Я просто старался быть конкретным, что мне нужно понять и насколько я понял до сих пор, я хочу скопировать пасту, я хочу понять, что происходит. – user227666

ответ

2

Предположим, вы итерации до N-го элемента (найдены по индексу или по критерию поиска).

INSERTION

Вы хотите вставить узел fooitem между * Nth и Nplus1th = Nth-> следующая

1) Резервное копирование ссылки на Nth-> следующая

node *Nplus1th = Nth->next; //save it for now 

2) Перезаписать Nth-> next

Nth->next = &fooitem; //The next of Nth references fooitem 

3) Установите Следующий из fooitem к резервной копии ведения этом-> следующая

fooitem.next = Nplus1th; 

4) Установить предыдущий из резервной копии рядом с fooitem ссылкой

Nplus1th->prev = &fooitem; 

5) Установите fooitem пред к Nth

fooitem.prev = Nth; 

УДАЛЕНИЕ

Вы хотите d далить fooitem узел между * и N-й Nplus1th = Nth-> следующая

node *fooitem = Nth->next; 
Nth->next= fooitem->next; //"forward bridge" to next->next 
fooitem->next->prev = Nth; //"backward bridge" to prev->prev 

//Delete references for safety 
fooitem->prev=NULL; 
fooitem->next=NULL; 

return fooitem; 

ВНИМАНИЕ: Приведенный выше код предполагает, что (N + 1) -го узла не равен NULL. Для проверки этого предположения при попытке доступа к следующим или предыдущим ссылкам этого узла необходимо включить проверку.

Смежные вопросы