Добавил:
Оставь надежду всяк сюда поступивший Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
22
Добавлен:
13.01.2019
Размер:
5.11 Кб
Скачать
/*9.Дан непустой двусвязный список, первый, последний и текущий элементы которого имеют
адреса P1, P2 и P3. Также даны пять чисел. Используя тип TList, описать
процедуру InsertAfter(L, D), которая вставляет новый элемент со значением D после
текущего элемента списка L (L — входной и выходной параметр типа TList, D — входной
параметр целого типа). Вставленный элемент становится текущим. С помощью этой
процедуры вставить пять данных чисел в исходный список.*/

#include <iostream>
#include <locale>


using namespace std;
/// класс List - собственно исходный двусвязный список с которым будем работать дальше --------------------
struct PNode       //Структура являющаяся звеном списка
{
    int x;     //Значение x будет передаваться в список
    PNode *Next,*Prev; //Указатели на адреса следующего и предыдущего элементов списка
};

class List   //Создаем тип данных Список
{
public:
    PNode *Head,*Tail; //Указатели на адреса начала списка и его конца
    List():Head(NULL),Tail(NULL){}; //Инициализируем адреса как пустые
    ~List(); //Деструктор
    void Show(); //Функция отображения списка на экране
    void Add(int x); //Функция добавления элементов в список
};
List::~List() //Деструктор
{
    while (Head) //Пока по адресу на начало списка что-то есть
    {
        Tail=Head->Next; //Резервная копия адреса следующего звена списка
        delete Head; //Очистка памяти от первого звена
        Head=Tail; //Смена адреса начала на адрес следующего элемента
    }
}

void List::Add(int x)
{
    PNode *temp=new PNode; //Выделение памяти под новый элемент структуры
    temp->Next=NULL;  //Указываем, что изначально по следующему адресу пусто
    temp->x=x;//Записываем значение в структуру
    if (Head!=NULL) //Если список не пуст
    {
        temp->Prev=Tail; //Указываем адрес на предыдущий элемент в соотв. поле
        Tail->Next=temp; //Указываем адрес следующего за хвостом элемента
        Tail=temp; //Меняем адрес хвоста
    }
    else //Если список пустой
    {
        temp->Prev=NULL; //Предыдущий элемент указывает в пустоту
        Head=Tail=temp; //Голова=Хвост=тот элемент, что сейчас добавили
    }
}

void List::Show()
{
 //ВЫВОДИМ СПИСОК С НАЧАЛА
    PNode *temp=Head; //Временно указываем на адрес первого элемента
    while (temp!=NULL) //Пока не встретим пустое значение
    {
    cout<<temp->x<<" "; //Выводим каждое считанное значение на экран
    temp=temp->Next; //Смена адреса на адрес следующего элемента
    }
    cout<<"\n";
}
///--------------------------------------------------------------------------------------------------------

//собственно - запись Tlist с полями first last и current и с методом вставки после текущего элемента
typedef struct TList
{
    PNode *first,*last,*current;
    void insertAfter(List &list,int x)
    {

        if(current == list.Tail) //если текущий совпадает с конечным
        {
            list.Add(x); //то добавляем элемент в конец списка
            current = list.Tail; //и перемещаем указатель Текущий на Последний элемент списка
        }
        else //иначе
        {
            PNode *temp = new PNode; //выделяем память для нового элемента
            //перемещаем указатели так, чтобы после текущего был введенный элемент, а после введенного - следующий ранее за текущем
            temp->x = x;
            temp->Next = current->Next;
            temp->Prev = current;
            current->Next->Prev=temp;
            current->Next = temp;
            current=temp;
        }
    }
}TList;

int main()
{
    setlocale(LC_ALL,"RUS");
    cout << "Введите кол-во элементов в списке: " << endl;
    int n; cin>>n;
    List list;
    cout << "Введите элементы списка через пробел: " << endl;
    for(int i=0;i<n;i++)
    {
        int tmp; cin>>tmp; //переменная для ввода
        list.Add(tmp);//добавляем в список
    }
    cout << "Получившийся список: "<< endl;
    list.Show();
    TList tlist;
    tlist.first=list.Head; //указатель на первый элемент = указатель на первый элемент списка
    tlist.last = list.Tail; //указатель на последний элемент
    cout <<"Введите номер элемента, который хотите сделать текущем (после которого будете добавлять следующие элементы)"<<endl;
    int numb; cin>>numb;
    tlist.current=list.Head;
    for(int i=0;i<numb-1;i++) //цикл до нужного элемента numb
    {
        if(tlist.current->Next!=NULL)tlist.current=tlist.current->Next; //передвигаем указатель до тех пор пока он не будет указывать на нужный элемент
    }
    cout <<"адрес первого элемента: " << &tlist.first<<" -> "<<tlist.first->x<<endl;
    cout <<"адрес последнего элемента: " << &tlist.last<<" -> "<<tlist.last->x<<endl;

    cout <<"адрес текущего элемента: " << &tlist.current<<" -> "<<tlist.current->x<<endl;
    cout<<"Введите 5 чисел через пробел"<<endl;
    for(int i=0;i<5;i++)
    {
        int tmp; cin>>tmp; //ввод i-го элемента из 5
        tlist.insertAfter(list,tmp);
    }
    cout << "Получившийся список: "<< endl;
    list.Show();
    return 0;
}
Соседние файлы в папке 6,2
  • #
    13.01.20191.12 Кб22labList_var9.cbp
  • #
    13.01.2019121 б22labList_var9.depend
  • #
    13.01.20195.11 Кб22main.cpp
  • #
    13.01.20195.52 Кб23main.o