* Вмъкването и изтриването на елемент от свързан списък става лесно - променят се стойностите само на няколко връзки (адреси).
Пример: Да се добави нов низ Rudolf, като се запази
азбучния ред на имената.
- създава се нов елемент Rudolf;
- променя се следващия елемент след Larry (от Susan на
Rudolf);
- променя се предишния елемент на Susan (от Larry на
Rudolf);
- добавя се предишен елемент Larrry на новия Rudolf;
- добавя се следващ елемент Susan на новия елемнт Rudolf.
* За разлика от линейната структура вектор, където има пряк
достъп до елементите му (с операция индекс), свързаният списък не
осигурява пряк достъп (не поддържа операция индекс).
* За достъп до елементите на свързания списък е достатъчно да
знаем местоположенето (адреса) на първия елемент на списъка.
* Достъп до k-тия елемнт на свързан списък се реализизира,
като се започне от първия му елемент и се обходят всички елементи
до k-тия, като се броят посетените елементи - сложност O(n).
** Свързан списък в STL
* В стандартната библиотека шаблони (STL) на С++ има реализация
на линейната структура свързан списък - шаблонът list.
* Всички основни операции на класа list се изпълняват за
време O(1).
* Достъп до елементите на свързания списък с n
елемента се осъществява посредством итератор за време O(n).
Пример: Да се построи свързан списък от низове, да се
добави елемент, да се изтрие елемент и да се обходи свързания
списък
// list1.cpp
#include <iostream>
#include <string>
#include <list>
using namespace std;
int main()
{ list<string>
staff; /*
шаблон за списък */
staff.push_back("Cracker, Carl");
staff.push_back("Hacker,
Harry");
staff.push_back("Lam,
Larry");
staff.push_back("Sandman, Susan");
list<string>::iterator pos; /* итератор на списък */
/* добавя елемент на четвърто място
*/
pos = staff.begin();
pos++;
pos++;
pos++;
staff.insert(pos,
"Reindeer, Rudolf");
/* отстранява втория елемент */
pos = staff.begin();
pos++;
staff.erase(pos);
/* добавя елемент на последно място
*/
pos = staff.end();
staff.insert(pos,
"Zeider, Zeev");
/* обхождане на списък */
for (pos =
staff.begin(); pos != staff.end(); pos++)
cout
<< *pos << "\n";
/* извежда съдържание на текущата
позиция */
return 0;
}
Cracker, Carl
Lam, Larry Reindeer, Rudolf Sandman, Susan Zeider, Zeev |
stack<string> s;* Опашка е линейна структура (редица) от данни с добавяне на елементи от единия край и изтриване на елементи от другия край.
s.push("Tom");
s.push("Dick");
s.push("Harry");
while (s.size() > 0)
{ cout << s.top() << "\n";
s.pop()
}
queue<string> q;Пример: Елементите на опашка от низове се събират в стек, който се отпечатва с иваждане на елементите му.
q.push("Tom");
q.push("Dick");
q.push("Harry");
while (q.size() > 0)
{ cout << q.front() << "\n";
q.pop();
}
// fifolifo.cpp
01: #include <iostream> 02: #include <string>
03: #include <queue> 04: #include <stack> 06: using namespace std; 07: 08: int main() 09: { cout << "FIFO order:\n"; 11: 12: queue<string> q; // опашка 13: q.push("Tom"); 14: q.push("Dick"); 15: q.push("Harry"); 16: 17: stack<string> s; // стек 18: while (q.size() > 0) 19: { string name = q.front(); 21: q.pop(); 22: cout << name << "\n"; 23: s.push(name); 24: } 26: cout << "LIFO order:\n"; 28: while (s.size() > 0) 29: { cout << s.top() << "\n"; 31: s.pop(); 32: } 34: return 0; 35: }
FIFO order: Tom Dick Harry LIFO order: Harry Dick Tom |
// set.cpp
#include <iostream> #include <string> #include <set> using namespace std; int main() { set<string> s; s.insert("Tom"); s.insert("Dick"); s.insert("Tom"); // !!! s.insert("Harry"); cout << "set: " << endl; set<string>::iterator p; for (p = s.begin(); p!= s.end(); p++) cout << *p << "\n"; multiset<string> ms; ms.insert("Tom"); ms.insert("Dick"); ms.insert("Tom"); // !!! ms.insert("Harry"); cout << "multiset: " << endl; multiset<string>::iterator mp; for (mp = ms.begin(); mp!= ms.end(); mp++) cout << *mp << "\n"; cout << ms.size() << endl; cout << ms.count("Tom"); return 0; }
set: Dick Harry Tom multiset: Dick Harry Tom Tom 4 2 |
map<string, double> scores;* Multimap е контейнер от двойки елементи (ключ, стойност), като се допускат елементи с еднакви ключове.
scores["Tom"] = 90;
scores["Dick"] = 86;
scores["Harry"] = 100;
multimap<string, double>
mmap;
mmap.insert(pair("Tom", 90));
mmap.insert(pair("Dick", 86));
mmap.insert(pair("Harry", 100));
mmap.insert(pair("Tom", 190));
Пример:// map.cpp
#include <iostream> #include <string> #include <map> using namespace std; int main() { map<string, int> scores; scores["Tom"] = 90; scores["Dick"] = 86; scores["Harry"] = 100; map<string, int>::iterator p; for (p = scores.begin(); p!= scores.end(); p++) cout << p->first << " " << p->second << "\n"; cout << scores.size() << endl; multimap<string, int> mmap; mmap.insert(pair<string, int>("Tom", 90)); mmap.insert(pair<string, int>("Dick", 86)); mmap.insert(pair<string, int>("Harry", 100)); mmap.insert(pair<string, int>("Tom", 190)); multimap<string, int>::iterator q; for (q = mmap.begin(); q!= mmap.end(); q++) cout << q->first << " " << q->second << "\n"; cout << mmap.size() << endl; return 0; }
Dick 86 Harry 100 Tom 90 3 Dick 86 Harry 100 Tom 90 Tom 190 4 |
vector<double> data;* Библиотеката поддържа функции за търсене - find.
/* do something with data */
double vsum = 0;
accumulate(data.begin(), data.end(), vsum);
/* now vsum contains the sum of the elements in the vector */
list<double> salaries;
/* do something with salaries */
double lsum = 0;
accumulate(salaries.begin(), salaries.end(), lsum);
/* now lsum contains the sum of the elements in the list */
#include <algorithm>* Библиотеката поддържа и функции за сортиране: sort, qsort
/* search for a certain name on the staff */
list<string>::iterator it =
find(staff.begin(), staff.end(), name);
cout << *it << endl;