1.Запустите IDE Borland C++ 5.02. Подготовьте запуск исполнимых файлов в консольном режиме.
2.Откомпилируйте предложенную программу работы с двунаправленным списком. Измените в потоковых операторах вывода текст на русском языке на транслит или на английский язык.
#include<iostream.h>struct node{ int elem; node *sled; node *pred;};class Spisok{ private: node *nsp,*ksp; public: Spisok() {nsp=ksp=NULL;} void Postroenie (); void VyvodForward (); void VyvodBack (); void Ochistka (); void InsAfter (int,node*); void InsBefore (int,node*); void Delete (node*); void DelAfter (node*); node *PoiskForward (int); node *PoiskBack (int);};void main (){ Spisok A; node *Res; int el,el1; A.Postroenie (); A.VyvodForward (); A.VyvodBack (); cout<<"Введите элемент звена, после которого "; cout<<"осуществляется вставка: "; cin>>el; cout<<"Введите элемент вставляемого звена: "; cin>>el1; Res=A.PoiskForward (el); if (Res!=NULL) { A.InsAfter (el1,Res); A.VyvodForward (); A.VyvodBack (); } else cout<<"Звена с заданным элементом в списке нет!\n"; cout<<"Введите элемент звена, перед которым "; cout<<"осуществляется вставка: "; cin>>el; cout<<"Введите элемент вставляемого звена: "; cin>>el1; Res = A.PoiskBack (el); if (Res!=NULL) { A.InsBefore (el1,Res); A.VyvodForward (); A.VyvodBack (); } else cout<<"Звена с заданным элементом в списке нет!\n"; cout<<"Введите элемент звена, после которого "; cout<<"осуществляется удаление: "; cin>>el; Res = A.PoiskForward (el); if (Res!=NULL) { A.DelAfter (Res); A.VyvodForward (); A.VyvodBack (); } else cout<<"Звена с заданным элементом в списке нет!\n"; cout<<"Введите элемент звена, которое "; cout<<"надо удалить: "; cin>>el; Res = A.PoiskForward (el); if (Res!=NULL) { A.Delete (Res); A.VyvodForward (); A.VyvodBack (); } else cout<<"Звена с заданным элементом в списке нет!\n"; A.Ochistka ();} void Spisok::Postroenie ()//Построение двунаправленного списка с заглавным звеном:// nsp - указатель на начало списка,// ksp - указатель на конец списка.{ node *rsp; int el; nsp = new(node); rsp = nsp; (*nsp).pred = NULL; (*nsp).sled = NULL; cout<<"Вводите последовательность:\n"; cin>>el; while (el!=0) { (*rsp).sled = new(node); (*((*rsp).sled)).pred = rsp; rsp = (*rsp).sled; (*rsp).sled = NULL; (*rsp).elem = el; cin>>el; } ksp = rsp;} void Spisok::VyvodForward ()//Вывод содержимого двунаправленного списка от его начала.// nsp - указатель на начало списка, ksp - указатель на конец списка.{ node *rsp; rsp = (*nsp).sled; cout<<"Двунаправленный список содержит: "; while (rsp!=NULL) { cout<<(*rsp).elem<<" "; rsp = (*rsp).sled; } cout<<endl;} void Spisok::VyvodBack ()//Вывод содержимого двунаправленного списка от его конца.// nsp - указатель на начало списка, ksp - указатель на конец списка.{ node *rsp; rsp = ksp; cout<<"Двунаправленный список в обратном порядке: "; while ((*rsp).pred!=NULL) { cout<<(*rsp).elem<<" "; rsp = (*rsp).pred; } cout<<endl;} node *Spisok::PoiskForward (int el)//Функция возвращает указатель на найденный элемент el//двунаправленного списка, заданного указателями nsp// и ksp, или NULL, если элемент в списке не найден.{ node *q; node *Res; Res = NULL; q = (*nsp).sled; while (q!=NULL && Res==NULL) if ((*q).elem==el) Res = q; else q = (*q).sled; return Res;} node *Spisok::PoiskBack (int el)//Функция возвращает указатель на найденный элемент el//двунаправленного списка, заданного указателями nsp// и ksp, или NULL, если элемент в списке не найден.{ node *q; node *Res; Res = NULL; q = ksp; while (q!=NULL && Res==NULL) if ((*q).elem==el) Res = q; else q = (*q).pred; return Res;} void Spisok::InsAfter (int el,node *Res)//Вставка звена с информационным полем el в//в двунаправленный список, заданный указателями// nsp и ksp, после звена, на которое указывает Res.{ node *q; q = new(node); (*q).elem = el; if ((*Res).sled!=NULL) { (*q).sled = (*Res).sled; (*q).pred = (*(*Res).sled).pred; (*(*Res).sled).pred = q; (*Res).sled = q; } else { (*q).sled = NULL; (*q).pred = Res; ksp = q; (*Res).sled = q; }} void Spisok::InsBefore (int el,node *Res)//Вставка звена с информационным полем el в//в двунаправленный список, заданный указателями// nsp и ksp, перед звеном, на которое указывает Res.{ node *q; q = new(node); (*q).elem = el; (*q).sled = (*(*Res).pred).sled; (*q).pred = (*Res).pred; (*(*Res).pred).sled = q; (*Res).pred = q;} void Spisok::Delete (node *Res)//Удаление звена из двунаправленного списка.// nsp - указатель на начало списка,// ksp - указатель на конец списка,// Res - указатель на удаляемое звено.{ if ((*Res).sled!=NULL) { (*(*Res).sled).pred = (*Res).pred; (*(*Res).pred).sled = (*Res).sled; delete Res; } else { (*(*Res).pred).sled = NULL; ksp = (*ksp).pred; delete Res; }} void Spisok::DelAfter (node *Res)//Удаление звена из двунаправленного списка.// nsp - указатель на начало списка,// ksp - указатель на конец списка,// Res - указатель на звено, предыдущее удаляемому.{ node *q; if ((*Res).sled==NULL) cout<<"Указано последнее звено!\n"; else if ((*(*Res).sled).sled!=NULL) { q = (*Res).sled; (*(*(*Res).sled).sled).pred = Res; (*Res).sled = (*(*Res).sled).sled; delete q; } else { q = (*Res).sled; (*Res).sled = NULL; ksp = (*ksp).pred; delete q; }} void Spisok::Ochistka ()//Удаление двунаправленного списка из памяти.// nsp - указатель на заглавное звено списка,// ksp - указатель на последнее звено списка.{ node *q,*q1; q = nsp; q1 = (*q).sled; while (q1!=NULL) { q = q1; q1 = (*q1).sled; delete q; } delete nsp; nsp = ksp = NULL;}
|
|
|
|
3. Откомпилируйте предложенную программу работы с двунаправленным кольцом. Измените в потоковых операторах вывода текст на русском языке на транслит или на английский язык.
#include<iostream.h>struct node{ int elem; node *sled; node *pred;}; class Spisok{ private: node *nsp; public: Spisok() {nsp=NULL;} void BuiltRing (); void VyvodLeftRight (); void VyvodRightLeft (); void InsAfter (node*,int); void InsBefore (node*,int); void Delete (node*); void DelAfter (node*); node *SearchRing (int); void Ochistka();}; void main (){ Spisok A; node *Res; int el,el1; A.BuiltRing (); cout<<"Содержимое кольца 'по часовой стрелке': \n"; A.VyvodLeftRight (); cout<<"Содержимое кольца'против часовой стрелки': \n"; A.VyvodRightLeft (); cout<<"Введите элемент звена, после которого "; cout<<"осуществляется вставка: "; cin>>el; cout<<"Введите элемент вставляемого звена: "; cin>>el1; Res = A.SearchRing (el); if (Res!=NULL) {A.InsAfter (Res,el1); A.VyvodLeftRight ();} else cout<<"Звена с таким элементом в списке нет!\n"; cout<<"Введите элемент звена, перед которым "; cout<<"осуществляется вставка: "; cin>>el; cout<<"Введите элемент вставляемого звена: "; cin>>el1; Res = A.SearchRing (el); if (Res!=NULL) { A.InsBefore (Res,el1); A.VyvodLeftRight (); } else cout<<"Звена с таким элементом в списке нет!\n"; cout<<"Введите элемент звена, который "; cout<<"надо удалить: "; cin>>el; Res = A.SearchRing (el); if (Res!=NULL) { A.Delete (Res); A.VyvodLeftRight (); } else cout<<"Звена с таким элементом в списке нет!\n"; cout<<"Введите элемент звена, после которого "; cout<<"осуществляется удаление: "; cin>>el; Res = A.SearchRing (el); if (Res!=NULL) { A.DelAfter (Res); A.VyvodLeftRight (); } else cout<<"Звена с таким элементом в списке нет!\n"; A.Ochistka();} void Spisok::BuiltRing ()// Построение двунаправленного кольцевого списка nsp// с удаленным заглавным звеном.// nsp - указатель на заглавное звено списка.{ node *r; int el; //Построим заглавное звено кольцевого списка. nsp = new(node); r = nsp; (*nsp).pred = NULL; (*nsp).sled = NULL; cout<<"Вводите элементы списка: \n"; cin>>el; while (el!=0) { (*r).sled = new (node); (*((*r).sled)).pred = r; r = (*r).sled; (*r).sled = NULL; (*r).elem = el; cin>>el; } //А теперь - образуем кольцевой список! if ((*nsp).sled!=NULL) { (*((*nsp).sled)).pred = r; (*r).sled = (*nsp).sled; } else cout<<"Кольцевой список пуст!\n";} void Spisok::VyvodLeftRight ()// Вывод содержимого двунаправленного кольцевого списка// с удаленным заглавным звеном "по часовой стрелке".// nsp - указатель на заглавное звено списка.{ node *r; cout<<"Кольцевой список: "; if ((*nsp).sled!=NULL) { cout<<(*((*nsp).sled)).elem<<" "; r = (*((*nsp).sled)).sled; while (r!=(*nsp).sled) { cout<<(*r).elem<<" "; r = (*r).sled; } cout<<endl; } else cout<<"пуст!";} void Spisok::VyvodRightLeft ()// Вывод содержимого двунаправленного кольцевого списка// с удаленным заглавным звеном "против часовой стрелки".// nsp - указатель на заглавное звено списка.{ node *r; cout<<"Кольцевой список: "; if ((*nsp).sled!=NULL) { cout<<(*((*((*nsp).sled)).pred)).elem<<" "; r = (*((*((*nsp).sled)).pred)).pred; while (r!=(*((*nsp).sled)).pred) { cout<<(*r).elem<<" "; r = (*r).pred; } cout<<endl; } else cout<<"пуст!";} node *Spisok::SearchRing (int el)// Поиск элемента el в кольцевом двунаправленном списке// с удаленным заглавным звеном.// nsp - указатель на заглавное звено списка.{ node *q; node *p; node *Res; Res = NULL; p = nsp; if ((*((*p).sled)).elem==el) Res = (*p).sled; else { q = (*((*p).sled)).sled; while (q!=(*p).sled && Res==NULL) if ((*q).elem==el) Res = q; else q = (*q).sled; } return Res;} void Spisok::InsAfter (node *Res,int el)// Вставление в кольцевой двунаправленный список звена// с информационным полем el после звена, на которое// указывает ссылка Res.{ node *q; q = new(node); (*q).elem = el; (*q).sled = (*Res).sled; (*q).pred = (*(*Res).sled).pred; (*(*Res).sled).pred = q; (*Res).sled = q;} void Spisok::InsBefore (node *Res,int el)// Вставка в кольцевой двунаправленный список звена// с информационным полем el перед звеном, на которое// указывает ссылка Res.// nsp - указатель на заглавное звено списка.{ node *q; q = new(node); (*q).elem = el; (*q).sled = (*(*Res).pred).sled; (*q).pred = (*Res).pred; (*(*Res).pred).sled = q; (*Res).pred = q; if (Res==(*nsp).sled) (*nsp).sled = q;} void Spisok::Delete (node *Res)// Удаление из кольцевого двунаправленного списка// звена, на которое указывает ссылка Res.// nsp - указатель на заглавное звено списка.{ if ((*Res).sled==Res) { (*nsp).sled = NULL; delete Res; } else { (*(*Res).sled).pred = (*Res).pred; (*(*Res).pred).sled = (*Res).sled; if ((*nsp).sled==Res) // Удаляем "первое" звено кольца. (*nsp).sled = (*Res).sled; delete Res; }} void Spisok::DelAfter (node *Res)// Удаление из кольцевого двунаправленного списка звена,// расположенного после звена, на которое указывает// ссылка Res.// nsp - указатель на заглавное звено списка.{ node *q; if ((*Res).sled==Res) { (*nsp).sled = NULL; delete Res;} else { q = (*Res).sled; (*(*(*Res).sled).sled).pred = (*(*Res).sled).pred; (*Res).sled = (*(*Res).sled).sled; if ((*(*nsp).sled).pred==Res) // Удаляем "последнее" звено кольца. (*nsp).sled = (*Res).sled; delete q; }} void Spisok::Ochistka(){ node *q,*q1; q = (*((*nsp).sled)).sled; q1 = (*q).sled; while (q1!=(*((*nsp).sled)).sled) { delete q; q=q1; q1=(*q1).sled; } delete q; delete nsp;}
|
|
4. Формирование дека, просмотр его содержимого, добавление элемента к деку и удаление элемента из дека.
|
|