
- •О.Б.Пащенко, н.Ю.Рязанова, м.В.Филиппов
- •О.Б.Пащенко, н.Ю.Рязанова, м.В.Филиппов
- •Указатели , динамические переменные.
- •2 .Связанные динамические переменные
- •2.1 Виды динамических структур
- •2.2. Построение двунаправленного списка
- •2.3 Включение и исключение узлов из списка .
- •2.3.1 Функции включения узловов .
- •2.3.2. Функции исключения элементов .
- •2.4 Односвязные списки
- •3. Двоичные деревья.
- •Список рекомендуемой литературы
- •Оглавление
2.3.2. Функции исключения элементов .
Алгоритм процедуры delete_first (удаление первого узла списка) строится из трех основных действий: первое- это установка вспомогательного локальною указателя posr на начало списка, второе- это перемещение указателя начала списка *begin на второй узел и третье-удаление первого узла («головы») списка: delete_first(&begin,number); // вызов функции
void delete_first(record **begin, int number)
{ record *posr;
posr=*begin; // первое действие
cout<<"DELETE HEAD";
*begin=posr->next; // второе действие
posr->next=NULL; // обрываем связь между 1-вым и 2-рым узлом по
//указателю "next"
delete posr; // третье действие
(*begin)->prev=NULL; //обрываем связь между 2-рым и l-вым узлом по указателю
//"prev"
number—; }
Алгоритм функции (dе1е1е_after_number(удаление узла после заданного) состоит из четырех основных действий: первое-это перемещение и установка трех вспомогательных локальных указателей pred, temp и posl на узел предшествующий удаляемый и следующий за ним, второе-это установление связей (соединение списка в месте разрыва) по указателям prev и next между узлом предшествующим удаляемому и узлом следующим за ним, третье - обрыв связей удаляемого узла с соседними узлами списка и наконец четвертое - удаление узла.
void delete_after_number(record **begin, int number); // вызов функции
void delete_ after_number(record **cur, int number)
{ record *pred, *posl, *temp;
int i,key;
cout<< "введите номер узла после которого выполняется удаление ";
cin>>key;
cout<<ndl;
pred=: *cur; //устанавливаем указатель pred на начало списка
for(i=l;i<key;i++) // перемещаем указатель pred на узел после которого происходит
//удаление
{if(pred->next->next==NULL) return; //если конец списка pred=pred->next;}
temp=pred->next; // (1) устанавливаем вспомогательный указатель па удаляемый узел posl=pred->next->next; // (2) устанавливаем вспомогательный указатель posl на
// узел следующий за удаляемым
pred->next=posl; // (3) устанавливаем связь по указателю next между узлом
// предшествующим удаляемому и узлом, следующим за ним
posl->prev=pred; // (4) устанавливаем связь по указателю prev между узлом
// следующим за удаляемым и узлом предшествующим ему
temp->next=NULL; // (5) "обрываем " связи удаляемого узла с последующим узлом по
// по указателю next
temp->prev=NULL; // и с предыдущим, по указателю prev
delete temp; //удаляем узел
number—;
}
На рис.4 графически интерпретированы действия пронумерованных операторов
функции.
pred
(1) temp
(2) post
(4)
info
prev
info
prev = NULL
info
prev = pred
info
prev
next = post
(5)
next = NULL
next
(5)
(3)
Р
удаляемый узел