ЯП_Си++_02_Перегрузка
.pdfElem* 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--------------------- |
|
//…не меняется… !!!