Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.08.2012, 00:56   #1
tanya-tanya
Новичок
Джуниор
 
Регистрация: 15.08.2012
Сообщений: 2
По умолчанию Двусвязные списки (С)

Доброй ночи!
Помогите пожалуйста: не могу понять вот эту часть кода у Шилдта: p->prior->next = i;
т.е. не могу представить, как это происходит. может кто-нибудь доходчиво объяснить?

Код:
struct address {
  char name[40];
  char street[40] ;
  char city[20];
  char state[3];
  char zip[11];
  struct address *next;
  struct address *prior;
} info;

struct address *start;  /* указатель на первую запись списка */
struct address *last;  /* указатель на последнюю запись */

/* Создание упорядоченного двусвязного списка. */
void dls_store(
  struct address *i,   /* новый элемент */
  struct address **start, /* первый элемент в списке */
  struct address **last /* последний элемент в списке */
)
{
  struct address *old, *p;

  if(*last==NULL) { /* первый элемент в списке */
    i->next = NULL;
    i->prior = NULL;
    *last = i;
    *start = i;
    return;
   }

  p = *start; /* начать с начала списка */

  old = NULL;
  while(p) {
    if(strcmp(p->name, i->name)<0) {
      old = p;
      p = p->next;
    }
    else {
      if(p->prior) {
        p->prior->next = i;
        i->next = p;
        i->prior = p->prior;
        p->prior = i;
        return;
      }
      i->next = p; /* новый первый элемент */
      i->prior = NULL;
      p->prior = i;
      *start = i;
      return;
    }
  }
  old->next = i; /* вставка в конец */
  i->next = NULL;
  i->prior = old;
  *last = i;
}
tanya-tanya вне форума Ответить с цитированием
Старый 15.08.2012, 07:38   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

p->prior->next по факту указывает на р
Но поскольку как я понимаю мы вставляем перед р другой элемент, нужно чтоб предыдущий знал и указывал на этот элемент.
конструкция p->prior->next = i; дословно звучит как "Задать указателю предыдущего элемента, который указывает на меня другое значение, равное i, дабы он указывал не на меня а на новый вставляемый между нами элемент"
Соответственно i->next = p; "Задать вставленному между нами элементу указатель следующего на меня"
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.08.2012, 07:50   #3
tanya-tanya
Новичок
Джуниор
 
Регистрация: 15.08.2012
Сообщений: 2
По умолчанию

большое спасибо, буду думать над вашими словами ))
а вообще я чуть голову не сломала над этой частью:
if(p->prior) {
p->prior->next = i;
i->next = p;
i->prior = p->prior;
p->prior = i;
return;
}
tanya-tanya вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Двусвязные списки vlados007 Общие вопросы C/C++ 5 13.02.2012 18:12
Двусвязные списки Evacuator C++ Builder 0 29.05.2011 13:12
Двусвязные списки aidar9012 Помощь студентам 6 28.06.2010 02:05
Двусвязные списки Serp Помощь студентам 3 14.04.2009 16:13