
- •О.Б.Пащенко, н.Ю.Рязанова, м.В.Филиппов
- •О.Б.Пащенко, н.Ю.Рязанова, м.В.Филиппов
- •Указатели , динамические переменные.
- •2 .Связанные динамические переменные
- •2.1 Виды динамических структур
- •2.2. Построение двунаправленного списка
- •2.3 Включение и исключение узлов из списка .
- •2.3.1 Функции включения узловов .
- •2.3.2. Функции исключения элементов .
- •2.4 Односвязные списки
- •3. Двоичные деревья.
- •Список рекомендуемой литературы
- •Оглавление
2.3 Включение и исключение узлов из списка .
2.3.1 Функции включения узловов .
Содержательной частью функции add_to_head (добавление узла в начало списка) являются операторы создания(открытия) узла и операторы присоединения (привязки) узла к «голове» списка. При этом инициализируются поля указателей *prev и *next. Передача в функцию значения указателя начала списка * begin осуществляется по его адресу (&). Внутри функции этот адрес передается локальному указателю-посреднику posr. Локальный указатель temp используется для создания нового головного узла списка.
add_to_head(&begin,number); // вызов функции void add_to_head(record **begin, int number)
{ record *temp, *posr;
posr=*begin; // передача адреса указателю posr
cout< < "ADD IN HEAD "< <endl;
lemp=new (record);
cout<<"\NAME BOOK: "; gels(lemp->book);
cout<<"\NAMEA VTOR:"; gets(temp->avtor);
coul<<"\YEAR: ";
cin>>temp->year;
temp->next=posr; //привязка нового узла к началу списка по полю указателя next
posr->prev-temp; //привязка бывшего первого к новому узлу по полю указателя prev
temp- >prev =NULL;
*begin=temp; // устанавливаем указатель начала списка *begin на новый узел
number + + ;
}
Алгоритм функции add_after_number (добавление узла после заданного)
состоит из трех основных действий: первое - это создание узла, второе - это поиск местоположения нового узла в цепочки узлов списка и третье - это его включение (привязка) в заданное (найденное) место цепочки линейного списка. При этом используются теже поля указателей prev и next.
add_after_number(&begin, number); // вызов функции
void add_after_number (record **cur, int number)
{ record *pred, *posl, *temp; // вспомогательные указатели на предыдущий,
// последующий и новый вставляемый узел
int i, key;
cout<< "введите номер узла после которого добавляется новый ";
cin>>key;
cout<<endl;
pred= *cur; //устанавливаем указатель на начало списка
//организуем цикл по перемещению указателя pred от начала списка к узлу, после
// которого добавляется новый
for(i=l; i<key; i++)
if (pred->next- > next= =NULL) return;
pred=pred->next;
}
posl=pred->next; // (1) установим указатель posl на узел перед которым будет
//добавлен новый
temp=new (record);
cout«"\NAME BOOK: ";
gets(temp->book);
cout«"\NAME A VTOR: "; gets(temp->avtor);
cout«"\YEAR: "; cin»temp->year;
temp->next=posl; // (2) связываем новый узел со следующим за ним узлом
temp->prev=pred; // (3) связываем новый узел с предшествующим ему узлом
pred->next=temp; // (4) связываем предыдущий узел с новым
posl->prev=temp; // (5) связываем следующий узел с новым
number++; }
На рис.3 графически интерпретированы действия операторов функции.
prev = temp
pred
(1)
post
info
info
prev
next = temp
next
(3)
temp
(5)
info
prev
= pred
next = post
(4)
(2)
Рис.3