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

1. Вставка элемента.

PNode2 p;

p = new Node2; //p – переменная типа PNode2

p -> next = q -> next;

p -> prev = q;

q -> next -> prev = p; //новый порядок у q^.next

q -> next = p;

q = p;

Опишем функцию вставки элемента в двусвязный список после заданного q.

void Ins_q2(PNode2 &q, int a )

{PNode2 p;

p = new Node2;

p -> inf = a;

p -> next = q -> next;

p -> prev = q;

q -> next -> prev = p //новый порядок у q^.next

q -> next =p;

q = p; //q – заданный элемент}

2. Удаление элемента.

p = q -> prev;

p -> next = q -> next;

q -> next -> prev = p;

delete q;

q = p; //предшествующий элемент станет текущим

Опишем функцию удаления текущего элемента двусвязного списка:

Void Del_q2(PNode2 &q, int a )

{PNode2 p;

p = q -> prev;

a = q -> inf;

p -> next = q ->next;

q -> next -> prev = p;

delete q;

q = p; //предшествующий элемент станет текущим}}

int Del_q2(Pnode2 &q) //функция вернет символ

{int a;

PNode2 p;

p = q -> prev;

a = q -> inf;

p -> next = q -> next;

q -> next -> prev = p;

delete q;

q = p; //предшествующий элемент станет текущим

return a;}

3. Последовательный поиск в списке.

PNode2 q;

bool fsearch;

q = first;

do

{fsearch = q -> inf > p ->inf; //проверка порядка информационного поля

if (!fsearch) //поиск не увенчался успехом

if (q -> next != NULL) //не последний элемент

q = q -> next;

else fsearch = true;//последний элемент, выход из цикла

else q = q -> prev;//поиск успешен, новое состояние q

} while (!fsearch);

Опишем функцию поиска места для вставляемого элемента двусвязного списка:

void Search_in_list2( PNode2 &q, PNode2 first, int a )

{bool fsearch;

q = first;

do

{fsearch = q -> inf > p ->inf;//проверка порядка информационного поля

if (!fsearch) //поиск не увенчался успехом

if (q -> next != NULL) //не последний элемент

q = q -> next;

else fsearch = true;//последний элемент, выход из цикла

else q = q -> prev;//поиск успешен, новое состояние q

return value; //доступ разрешен}

void main(void) {

TPrivateClass cl; //создание объекта

} while (!fsearch);

Ins_q2(q, a);//вставка нового элемента после q

int i = cl.value; //ошибка! Нет доступа

i = cl.GetValue();//ошибка! Нет доступа}

2 Защищенные члены класса

Члены и функции объявленные в защищенном (protected) разделе класса доступны только для функций производных классов. Обычно в этом возникает необходимость тогда, когда разрабатываемый класс является базовым классом для других классов. В этом случае он ограничивает доступ к данным внешним пользователям и разрешает доступ для классов наследников. Рассмотрим пример иерархии объектов.

class A { protected: int val; };

class B: public A {//наследуется от A public: void fb();};

void B::fb() { val = 0; } //доступ разрешен

class C:public B { //наследуется от B public: void fc();};

void C::fc() {val = 10;} //доступ разрешен

В данном примере приведена иерархия классов A->B->C. Свойство защищенности распространяется вниз по иерархии до тех пор пока производный класс объявляет свой базовый общедоступным (public). При этом любые функции-члены в классах C и B имеют доступ к члену данных val базового класса. Если функция-член производного класса в качестве входного параметра имеет указатель или ссылку на объект базового класса, то правила становятся другими. Модифицируем класс C следующим образом.

class C:public B { public:

void fc(A&); //Входной параметр ссылка на базовый класс};

void C::fc(A& a) {

val = 10; //доступ разрешен

a.val = 10; //ошибка! нарушение прав доступа }

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]