Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Полный+текст.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
245.76 Кб
Скачать

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