На этом шаге мы приведем пример программы, реализующей основные операции над ортогональными списками.
Приведем реализацию на языке C++ простейших операций над ортогональными списками ("гирляндо-висюлечной" структурой).
Сначала опишем типы данных:
// Описание типа звена гирлянды. struct nodeGir { int elem; // Информационное поле звена гирлянды. nodeVis *vniz; // Указатель на звено висюльки. nodeGir *sled; // Указатель на звено гирлянды. }; // Описание типа звена висюльки. struct nodeVis { int elem; // Информационное поле звена висюльки. nodeVis *vniz; // Указатель на звено висюльки. };
#include<iostream.h> struct nodeVis { int elem; //Информационное поле звена висюльки. nodeVis *vniz;//Указатель на звено висюльки. }; struct nodeGir { int elem;//Информационное поле звена гирлянды. nodeVis *vniz;//Указатель на звено висюльки. nodeGir *sled;//Указатель на звено гирлянды. }; class GirVis { private: nodeGir *phead;//Голова гирлянды. nodeVis *pheadVis;//Голова висюльки. void VisVyvod (); public: GirVis() {phead = new (nodeGir); } ~GirVis() {delete phead;} nodeVis *VisPostr (); nodeVis* VisPoisk (int); void SetpheadVis (nodeVis *r) {pheadVis=r;} //Определение головы висюльки. void VisVstav (nodeVis *,int); void Vis1Vstav (nodeVis *,int); void VisUdale (nodeVis *); void Vis1Udale (nodeVis *); void GirPostr (); void GirVyvod (); nodeGir *GirPoisk (int); void OCHISTKA(); void OCHISTKA1(); }; void main () { GirVis A; int el,elGir,elVis; nodeGir *Res; //Рабочий указатель. nodeVis *ResVis; //Указатель на звено висюльки. A.GirPostr (); A.GirVyvod (); cout<<"\nВведите элемент звена гирлянды, "; cout<<"чьи висюльки будем изменять:\n"; cin>>elGir; cout<<"\nВведите элемент звена висюльки, после которого "; cout<<"осуществляется вставка:\n"; cin>>elVis; cout<<"\nВведите вставляемый элемент:\n"; cin>>el; //Поиск элемента elGir в гирлянде. Res=A.GirPoisk (elGir); if (Res!=NULL) { //Поиск элемента elVis в висюльке. A.SetpheadVis((*Res).vniz); ResVis=A.VisPoisk (elVis); if (ResVis!=NULL) A.VisVstav (ResVis,el); else cout<<"Элемента в висюльке нет!\n"; } else cout<<"Элемента в гирлянде нет\n"; A.GirVyvod (); cout<<"\nВведите элемент гирлянды, чью висюльку будем изменять:\n"; cin>>elGir; cout<<"Введите элемент висюльки, перед которым "; cout<<"осуществляется вставка:\n"; cin>>elVis; cout<<"Введите вставляемый элемент:\n"; cin>>el; //Поиск элемента elGir в гирлянде. Res=A.GirPoisk (elGir); if (Res!=NULL) { //Поиск элемента elVis в висюльке. A.SetpheadVis((*Res).vniz); ResVis=A.VisPoisk (elVis); if (ResVis!=NULL) A.Vis1Vstav (ResVis,el); else cout<<"Элемента в висюльке нет!\n"; } else cout<<"Элемента в гирлянде нет!\n"; A.GirVyvod (); cout<<"\nВведите элемент гирлянды, чью висюльку будем изменять:\n"; cin>>elGir; cout<<"Введите элемент висюльки, после которого нужно удалить:\n"; cin>>elVis; //Поиск элемента elGir в гирлянде. Res=A.GirPoisk (elGir); if (Res!=NULL) { //Поиск элемента elVis в висюльке. A.SetpheadVis((*Res).vniz); ResVis=A.VisPoisk (elVis); if ((ResVis!=NULL) && ((*ResVis).vniz!=NULL)) A.VisUdale (ResVis); else cout<<"Элемента в висюльке нет!\n"; } else cout<<"Элемента в гирлянде нет!\n"; A.GirVyvod (); cout<<"\nВведите элемент гирлянды, чью висюльку будем изменять:\n"; cin>>elGir; cout<<"Введите элемент висюльки, который удаляется:\n"; cin>>elVis; //Поиск элемента elGir в гирлянде. Res=A.GirPoisk (elGir); if (Res!=NULL) { //Поиск элемента elVis в висюльке. A.SetpheadVis((*Res).vniz); ResVis=A.VisPoisk (elVis); if ((ResVis!=NULL) && ((*ResVis).vniz!=NULL)) A.Vis1Udale (ResVis); else cout<<"Элемента в висюльке нет или он последний!\n"; } else cout<<"Элемента в гирлянде нет!\n"; A.GirVyvod (); A.OCHISTKA(); } void GirVis::OCHISTKA() { nodeGir *q,*q1;//Рабочие указатели. q = phead; q1 = (*q).sled; //Указатель q1 "опережает" указатель q. while (q1!=NULL) { q = q1; q1 = (*q1).sled; pheadVis=(*q).vniz; OCHISTKA1(); //Очистка висюльки. delete q;} } void GirVis::OCHISTKA1() { nodeVis *q,*q1; q=pheadVis; q1 = (*q).vniz; while (q1!=NULL) { q = q1; q1 = (*q1).vniz; delete q;} } void GirVis::GirPostr () //Построение однонаправленного списка с заглавным звеном, //заданного указателем phead (построение гирлянды). { nodeGir *t; int el; t = phead; (*t).sled = NULL; cout<<"Вводите элемент гирлянды: \n"; cin>>el; while (el!=0) { (*t).sled = new (nodeGir); t = (*t).sled; (*t).elem = el; (*t).sled = NULL; (*t).vniz=VisPostr(); cout<<" Вводите элемент гирлянды: \n"; cin>>el; } } nodeVis *GirVis::VisPostr () //Построение однонаправленного списка с заглавным звеном //(построение висюльки). pheadVis - указатель на висюльку. { nodeVis *t; int el; //Создадим заглавное звено списка. pheadVis = new (nodeVis); t = pheadVis; (*t).vniz = NULL; cout<<"Вводите элементы звеньев висюльки: \n"; cin>>el; while (el!=0) { (*t).vniz = new (nodeVis); t = (*t).vniz; (*t).elem = el; (*t).vniz = NULL; cin>>el; } return pheadVis; } void GirVis::GirVyvod () //Вывод содержимого однонаправленного списка, заданного //указателем phead (вывод содержимого гирлянды). { nodeGir *t; t = phead; t = (*t).sled; cout<<"Гирлянда: "; while (t!=NULL) { cout<<(*t).elem<<" "; pheadVis=(*t).vniz; VisVyvod (); t = (*t).sled; } } nodeGir *GirVis::GirPoisk (int el) //Поиск элемента el в списке, заданном указателем phead. //В случае успешного поиска возвращается адрес звена списка, //содержащего элемент el. В противном случае - NULL. { nodeGir *t,*r; r = NULL; t = phead; t = (*t).sled; while (t!=NULL && r==NULL) if ((*t).elem==el) r = t; else t = (*t).sled; return r; } void GirVis::VisVyvod () //Вывод содержимого однонаправленного списка с заглавным звеном, //заданного указателем pheadVis (вывод содержимого висюльки). { nodeVis *t; t = pheadVis; t = (*t).vniz; cout<<"("; while (t!=NULL) { cout<<(*t).elem<<" "; t = (*t).vniz; } cout<<")"; } nodeVis *GirVis::VisPoisk (int el) //Поиск элемента el в списке, заданном указателем pheadVis. //В случае успешного поиска возвращается адрес звена списка, //содержащего элемент el. В противном случае - NULL. { nodeVis *t,*r; r = NULL; t = pheadVis; t = (*t).vniz; while (t!=NULL && r==NULL) if ((*t).elem==el) r = t; else t = (*t).vniz; return r; } void GirVis::VisVstav (nodeVis *r,int el) //Включение звена с информационным полем el //после звена, на которое указывает r //(включение звена в висюльку). { nodeVis *q; q = new (nodeVis); (*q).elem = el; (*q).vniz = (*r).vniz; (*r).vniz = q; } void GirVis::Vis1Vstav (nodeVis *r,int el) //Включение звена с информационным полем el //перед звеном, на которое указывает r //(включение звена в висюльку). { nodeVis *q; q = new (nodeVis); (*q).elem = (*r).elem; (*q).vniz = (*r).vniz; (*r).elem = el; (*r).vniz = q; } void GirVis::VisUdale (nodeVis *r) //Удаление звена, расположенного после звена, //на которое указывает ссылка r //(удаление звена висюльки). { nodeVis *q; q = (*r).vniz; if ((*r).vniz!=NULL) { (*r).vniz = (*(*r).vniz).vniz; delete q; } else cout<<"Звено с заданным элементом - последнее!\n"; } void GirVis::Vis1Udale (nodeVis *r) //Удаление звена, на которое указывает ссылка r //(удаление звена висюльки). { nodeVis *g; if ((*r).vniz!=NULL) { g = (*r).vniz; (*r).elem = (*(*r).vniz).elem; (*r).vniz = (*(*r).vniz).vniz; delete g; } else cout<<"Не умею удалять последнее звено!\n"; }
Со следующего шага мы начнем знакомиться с кольцами.