13. Понятие списка, стека и очереди. Особенности работы со стеками.
Список-это последовательность однотипных данных работа с которыми ведётся в оперативной памяти. В процессе работы список может изменять свой размер. Наибольшее распространение получили 2 формы работы со списком это очередь и стек.
Стек-это список с одной точкой входа. Данные добавляются в стек и извлекаются из него только с одной стороны, тем самым реализуется принцип первым вошел, последним вышел.
Очередь-это список с двумя точками входа. Данные добавляются в конец очереди и извлекаются из начала очереди. Реализуется принцип первым вошёл, первым вышел.
Добавление элемента в стек :
tstk *AddStask(tstk *sp, int inf)
{ tstk *spt=new tstk;
spt->inf = inf;
spt->a = sp; return spt; }
Чтение элемента с удалением
tstk *ReadStackD(tstk *sp, int &inf)
{ if (sp == NULL) return NULL;
tstk *spt = sp;
inf= sp->inf;
sp = sp->a;
delete spt;
return sp; }
14.Понятие списка, стека и очереди см. вопр.
13. Особенности работы с однонаправленной очередью.
Добавление элемента в очередь
void AddOch(toch **sp,toch **spk, int inf)
{ toch *spt=new toch;
spt->inf = inf;
spt->a = NULL;
if (*spk == NULL) // Если нет элементов
*sp=*spk=spt;
Else
{ (*spk)->a = spt;
*spk = spt; }
return; }
Чтение элемента с удалением
toch *ReadOchD(toch *sp, int &inf)
{ if (sp == NULL) return NULL;
inf= sp->inf;
toch *spt = sp;
sp = sp->a;
delete spt;
return sp; }
15. Двунаправл. очереди. Объявление. Особенности работы
Очередь в которой у каждого элемента есть указатели на впереди и позади стоящий элементы называется двунаправленной. Следует отметить, что начало и конец двусвязанного списка логически эквивалентен. Так как в таком списке можно передвигаться от элемента к элементу двумя разными путями, то в конце каждого из них в поле соответствующего указателя находится признак пустого указателя 0. Наличие двух указателей в каждом элементе заметно усложняет список и приводит к доп. затратам в памяти, но в то же время обеспечивает более эффективное выполнение операций над списками.
Объявление типа: struct tochd { int inf; tochd *left; tochd *rigth; } *sp;
Создание очереди: void NewOchd(tochd **sl, tochd **sr) { *sl=new tochd; *sr=new tochd; (*sl)->left = NULL; (*sl)->rigth = *sr; (*sr)->left = *sl; (*sr)->rigth = NULL; return; }
Подключение: tochd *sl, *sr; NewOchd(&sl,&sr);
Добавление элемента после(перед) заданного: void AddOchdRigth(tochd *sp, int inf) { tochd *spt=new tochd; spt->inf = inf; spt->left = sp(sp->left); spt->rigth = sp->rigth(sp); sp(spt)->rigth = spt(sp); spt->rigth(left)->left(right) = spt; (sp->left = spt;) return; }
Чтение и удаление элемента с адресом sp: int ReadOchdD(tochd *sp) { int inf= sp->inf; sp->left->rigth = sp->rigth; sp->rigth->left = sp->left; delete sp; return inf; }
16. Циклические списки
Циклические списки позволяет осуществить перемещение по списку в любом направлении.
Объявление:
Struct toch { int int,
Tochd*leff;
Tochd*right; }
*sp;
Создание очереди:
Void new ochd(tochd**sf,tochd**sr)
{ *sr=new tochd;
*sr=new tochd;
(*sl)-> left=nuul;
(*sl)-> right = *sr;
(*sr)-> left = *sl;
(*sr)-> right = nuul;
Return;}
подключение:
toch *sl,*sr; new ochd
Удаление всей очереди:
Void del ochd all(tochd**sl,toch**sr)
{ Tochd *spt =(*sl)->right;
While (spt! = *sr)
{ cout <<read ochd D(spt) <<endl;
Snt =(*sl)-> right; }
Delete *sl,
*sl=null Spt -> right -> leff = spt;}
17. Древовидные структуры данных
Все данные называются узлами: Узел “a” – корень. Узлы, из которых не выходят связи – листы (f,g,r,i) Узлы, находящиеся непоср. ниже – дочерние. Все узлы, наход. выше\ниже след.- предки\потомки. Узлы с одним родителем – сестринские. Узел, не являющиеся листом – внутренний. Степень узла – количество дочерних узлов. Степень дерева – максимальный порядок его узлов. Дерево второй степени называется бинарным. Глубина узла – число предков +1 .Глубина дерева – наибольшая глубина всех узлов.
Для реализации древовидных структур используют следующее: struct ttree { tinf inf; ttree *a1; ttree *a2; …. ttree *an; } *proot *p;