Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ЯП_Си++_02_Перегрузка

.pdf
Скачиваний:
14
Добавлен:
12.02.2015
Размер:
292.88 Кб
Скачать

Elem* ph = new Elem; //выделение памяти для нового

ph->key = d;

//заполнение информатвного поля

if(first){

//если список не пуст

if(current == first){

//если текущий элемент - первый

ph->next = current;

//новый цепляем перед первым

first = ph;

 

//теперь первым будет новый

current = ph;

 

//теперь текущим будет новый

}else{

//если текущий - не первый

Elem* pk = first; //поиск предшествующего текущему while (pk->next != current)

pk = pk->next;

//новый цепляем между

pk->next = ph;

ph->next = current;

//предшествующим

и текущим

current = ph;

//теперь текущим

будет новый

}

}else{ //если список пуст - добавление в пустой список

ph->next = 0;

//теперь

первым будет новый

first =

ph;

current

= ph;

//теперь

текущим будет новый

}

}

//-------удалить текщий элемент-------

void List::operator - (){

if (first){ //если список не пуст

Elem*

ph = first;

//если текущий

-

это первый

if(ph

== current){

first =

ph->next; //первым станет следующий

current

= first;

//текущим станет

он же

delete ph;

//освобождение

памяти

}else{ //если текущий - не первый while (ph->next != current) //поиск предшествующего текущему

ph = ph->next; ph->next = current->next;

//к предшествующему цепляем следующий за текущим

delete current;

//освобождение памяти

current = ph;

//теперь текущий - предшествующий

}

}

}

//-------переместиться на один элемент вправо-------

void List::operator ++ (){ if((current)&&(current->next))

//если список не пуст и текущий не является последним current = current->next;

}

//-------переместиться в начало-------

void List::operator -- (){

current = first; //текущий стал первым

}

//-------печать -------

void List::print(const char* str){ Elem* ph = first;

printf("\n%s: ",str); while(ph){

if(ph == current) printf(">%i<",ph->key);

else

printf(" %i ",ph->key); ph = ph->next;

}

printf("\n\n");

}

//----------------main.cpp---------------------

#include "list.h" #include <stdio.h> void instructions(){

printf("************СПИСОК************\n"); printf("1 – добавить перед текущим\n"); printf("2 – удалить текущий\n");

printf("3 – переместиться вправо\n"); printf("4 – переместиться в начало\n"); printf("*****************************\n");

}

void main(){ List st; int d, key; do{

instructions(); key = 0; scanf("%i",&key);

switch(key){ case 1:

printf("Элемент: "); scanf("%i",&d);

st + d; st.print("Список"); break;

case 2: -st;

st.print("Список"); break;

case 3: ++st;

st.print("Список"); break;

case 4: --st;

st.print("Список"); break;

}

}while ((key > 0)&&(key < 5));}

===Конструктор копирования===

class List{// динамический однонаправленный список private:

struct Elem{//представление одного элемента списка int key; //информативное поле

Elem* next; //указатель на следующий элемент

};

//указатель

на

первый элемент списка

Elem* first;

Elem* current;

//указатель

на

текущий элемент списка

public:

List(const List&);//конструктор копирования

};

List::List(const List& l){

if (l.first == 0){first = 0; current = 0; } else{

Elem *ptr, *ptrnew, *ptrnew1; ptr = l.first;

ptrnew = new Elem; ptrnew->key = ptr->key; ptrnew->next = 0;

first = ptrnew;

if (ptr == l.current) current = ptrnew; ptr = ptr->next;

while (ptr != 0){ ptrnew1 = new Elem;

ptrnew1->key = ptr->key; ptrnew1->next = 0; ptrnew->next = ptrnew1; ptrnew = ptrnew1;

if (ptr == l.current) current = ptrnew; ptr = ptr->next;

}

}}

//-----------------

list.h-------------------

 

class List{ // однонаправленный список на основе массива

private:

//массив информативных полей

int* m_key;

int* m_next;

//массив индексов следующих элементов

int first;

//индекс первого элемента списка

int current;

//индекс текущего элемента списка

int size;

//максимальное число элементов в списке

int ind;

//индекс свободного элемента в массиве

public:

 

 

List(int = 10); //конструктор

void operator + (int);

//добавить перед текущим

void operator - ();

//удалить текщий

void operator ++ ();

//переместиться на один вправо

void operator -- ();

//переместиться в начало

void print(const char*);

};

 

 

//----------------

main.cpp---------------------

 

//…не меняется… !!!