<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ca">
	<id>http://wiki.joanillo.org/index.php?action=history&amp;feed=atom&amp;title=Estructures_de_dades_amb_C%2B%2B</id>
	<title>Estructures de dades amb C++ - Historial de revisió</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.joanillo.org/index.php?action=history&amp;feed=atom&amp;title=Estructures_de_dades_amb_C%2B%2B"/>
	<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=Estructures_de_dades_amb_C%2B%2B&amp;action=history"/>
	<updated>2026-08-30T10:02:45Z</updated>
	<subtitle>Historial de revisió per a aquesta pàgina del wiki</subtitle>
	<generator>MediaWiki 1.34.2</generator>
	<entry>
		<id>http://wiki.joanillo.org/index.php?title=Estructures_de_dades_amb_C%2B%2B&amp;diff=248340&amp;oldid=prev</id>
		<title>Joan: Es crea la pàgina amb «=Introducció= *http://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C%2B%2B/Biblioteca_Est%C3%A1ndar_de_Plantillas La STL (Standard Template Library) de C++ es una colecci...».</title>
		<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=Estructures_de_dades_amb_C%2B%2B&amp;diff=248340&amp;oldid=prev"/>
		<updated>2011-12-15T09:49:55Z</updated>

		<summary type="html">&lt;p&gt;Es crea la pàgina amb «=Introducció= *http://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C%2B%2B/Biblioteca_Est%C3%A1ndar_de_Plantillas La STL (Standard Template Library) de C++ es una colecci...».&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Pàgina nova&lt;/b&gt;&lt;/p&gt;&lt;div&gt;=Introducció=&lt;br /&gt;
*http://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C%2B%2B/Biblioteca_Est%C3%A1ndar_de_Plantillas&lt;br /&gt;
La STL (Standard Template Library) de C++ es una colección genérica de plantillas de clases y algoritmos que permite a los programadores implementar fácilmente estructuras estándar de datos como colas (queues), listas (lists), y pilas (stacks).&lt;br /&gt;
&lt;br /&gt;
La STL de C++ provee a los programadores con lo constructores siguientes, agrupados en tres categorias:&lt;br /&gt;
&lt;br /&gt;
'''Secuencias (sequences)'''&lt;br /&gt;
#C++ Vectors&lt;br /&gt;
#C++ Lists&lt;br /&gt;
#C++ Double-Ended Queues&lt;br /&gt;
&lt;br /&gt;
'''Adaptadores de contenedor (Container Adapters)'''&lt;br /&gt;
#C++ Stacks&lt;br /&gt;
#C++ Queues&lt;br /&gt;
#C++ Priority Queues&lt;br /&gt;
&lt;br /&gt;
'''Contenedores asociativos (Associative Containers)'''&lt;br /&gt;
#C++ Bitsets&lt;br /&gt;
#C++ Maps&lt;br /&gt;
#C++ Multimaps&lt;br /&gt;
#C++ Sets&lt;br /&gt;
#C++ Multisets&lt;br /&gt;
&lt;br /&gt;
La idea detras de la STL de C++ es que la parte dificil en el uso de estructuras complejas de datos ya ha sido previamente completada. Por ejemplo, si un programador desea usar un stack de enteros, todo lo que tiene que hacer es escribir el código:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
stack&amp;lt;int&amp;gt; myStack;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Con un minimo de esfuerzo, él o ella puede usar la función push() para ingresar enteros al stack; y la función pop() para retirar enteros del stack. A travez de la magia de las plantillas de C++, se puede especificar cualquier tipo de dato, no sólo enteros. La clase Stack de la STL provee la funcionalidad genérica de un stack, sin importar el tipo de dato en el stack.&lt;br /&gt;
&lt;br /&gt;
En general tots aquests containers en diem ''Standard Library Container'': SLC. És a dir, tenim unes llibreries estàndard (recordar que utilitzem ''namespace std'') que ens proporcionen aquestes estructures de dades ja implementades: llistes, cues, piles, vectors,...&lt;br /&gt;
=Cues=&lt;br /&gt;
*http://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C%2B%2B/Librer%C3%ADa_Est%C3%A1ndar_de_Plantillas/Colas&lt;br /&gt;
he utilitzat '''cues''' al projecte jjoanillorouter i jplayfine (v101). Després he vist que el que necessito són llistes i no cues, doncs vull accedir a elements de dins. Té pocs mètodes, doncs se'n necessiten pocs (només es pot accedir al primer element).&lt;br /&gt;
&lt;br /&gt;
A jjoanillorouter he utilitzat cues que emmagatzemen objectes.&lt;br /&gt;
=Piles=&lt;br /&gt;
*http://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C%2B%2B/Librer%C3%ADa_Est%C3%A1ndar_de_Plantillas/Pilas&lt;br /&gt;
=Vectors=&lt;br /&gt;
*http://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C%2B%2B/Librer%C3%ADa_Est%C3%A1ndar_de_Plantillas/Vectores&lt;br /&gt;
&lt;br /&gt;
=Llistes=&lt;br /&gt;
==Llibreria estàndard #include &amp;lt;list&amp;gt;==&lt;br /&gt;
*http://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C%2B%2B/Librer%C3%ADa_Est%C3%A1ndar_de_Plantillas/Listas&lt;br /&gt;
Com que es pot accedir a dins els elements de la llista disposo de molts mètodes (sort, inserir al principi, inserir al final,...)&lt;br /&gt;
&lt;br /&gt;
Utilitzo llistes en el projecte jPlayfine. Concretament, les llistes que m'interessen són les llistes que emmagatzemen objectes. La info la he trobat a&lt;br /&gt;
*http://www.java2s.com/Code/Cpp/List/Storeclassobjectsinalist.htm&lt;br /&gt;
&lt;br /&gt;
==Llista no estàndard==&lt;br /&gt;
Ho he trobat a:&lt;br /&gt;
*http://ubuntuforums.org/archive/index.php/t-1088320.html&lt;br /&gt;
Per compilar:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ g++ -o Exercise  Exercise.cpp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''List.h'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifndef NONSTD_LIST_H&lt;br /&gt;
#define NONSTD_LIST_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;cassert&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
namespace nonstd&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
template &amp;lt;class T&amp;gt;&lt;br /&gt;
class List&lt;br /&gt;
{&lt;br /&gt;
private:&lt;br /&gt;
class ListIterator;&lt;br /&gt;
&lt;br /&gt;
public:&lt;br /&gt;
typedef ListIterator iterator;&lt;br /&gt;
typedef const ListIterator const_iterator;&lt;br /&gt;
typedef T value_type;&lt;br /&gt;
&lt;br /&gt;
// constructor&lt;br /&gt;
List()&lt;br /&gt;
: m_head(0),&lt;br /&gt;
m_tail(0),&lt;br /&gt;
m_size(0)&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
List(const List&amp;lt;T&amp;gt;&amp;amp; other)&lt;br /&gt;
: m_head(0),&lt;br /&gt;
m_tail(0),&lt;br /&gt;
m_size(0)&lt;br /&gt;
{&lt;br /&gt;
for (iterator it = other.begin(); it != other.end(); ++it)&lt;br /&gt;
{&lt;br /&gt;
push_back(*it);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// destructor&lt;br /&gt;
~List()&lt;br /&gt;
{&lt;br /&gt;
clear();&lt;br /&gt;
m_head = m_tail = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// push_front()&lt;br /&gt;
void push_front(T elem) // inserts at the beginning&lt;br /&gt;
{&lt;br /&gt;
if (m_head == 0)&lt;br /&gt;
{&lt;br /&gt;
m_head = new Node(elem, 0, 0);&lt;br /&gt;
m_tail = m_head;&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
m_head = new Node(elem, 0, m_head);&lt;br /&gt;
}&lt;br /&gt;
++m_size;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// pop_front()&lt;br /&gt;
void pop_front() // deletes the first element&lt;br /&gt;
{&lt;br /&gt;
Node* tmp = m_head-&amp;gt;m_next;&lt;br /&gt;
delete m_head;&lt;br /&gt;
m_head = tmp;&lt;br /&gt;
m_head-&amp;gt;m_prev = 0;&lt;br /&gt;
--m_size;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void push_back(T elem) // inserts at the end&lt;br /&gt;
{&lt;br /&gt;
if (m_head == 0)&lt;br /&gt;
{&lt;br /&gt;
m_head = new Node(elem, 0, 0);&lt;br /&gt;
m_tail = m_head;&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
m_tail-&amp;gt;m_next = new Node(elem, m_tail, 0);&lt;br /&gt;
m_tail = m_tail-&amp;gt;m_next;&lt;br /&gt;
}&lt;br /&gt;
++m_size;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void pop_back() // deletes the last element&lt;br /&gt;
{&lt;br /&gt;
Node* tmp = m_tail;&lt;br /&gt;
m_tail = tmp-&amp;gt;m_prev;&lt;br /&gt;
delete tmp;&lt;br /&gt;
--m_size;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
iterator insert(iterator&amp;amp; position, const T&amp;amp; elem)&lt;br /&gt;
{&lt;br /&gt;
iterator it = begin();&lt;br /&gt;
&lt;br /&gt;
for (; it != position; ++it);&lt;br /&gt;
&lt;br /&gt;
it.m_node-&amp;gt;m_prev-&amp;gt;m_next = new Node(elem, it.m_node-&amp;gt;m_prev, it.m_node);&lt;br /&gt;
++m_size;&lt;br /&gt;
&lt;br /&gt;
return it.m_node-&amp;gt;m_prev-&amp;gt;m_next;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
iterator erase(iterator position)&lt;br /&gt;
{&lt;br /&gt;
iterator it = begin();&lt;br /&gt;
&lt;br /&gt;
for (; it != position; ++it);&lt;br /&gt;
&lt;br /&gt;
it.m_node-&amp;gt;m_prev-&amp;gt;m_next = it.m_node-&amp;gt;m_next;&lt;br /&gt;
it.m_node-&amp;gt;m_next-&amp;gt;m_prev = it.m_node-&amp;gt;m_prev;&lt;br /&gt;
&lt;br /&gt;
iterator next = it.m_node-&amp;gt;m_next;&lt;br /&gt;
&lt;br /&gt;
delete it.m_node;&lt;br /&gt;
&lt;br /&gt;
--m_size;&lt;br /&gt;
&lt;br /&gt;
return next;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void clear()&lt;br /&gt;
{&lt;br /&gt;
iterator it = begin();&lt;br /&gt;
&lt;br /&gt;
while (it != 0)&lt;br /&gt;
{&lt;br /&gt;
Node* node = it.m_node;&lt;br /&gt;
++it;&lt;br /&gt;
delete node;&lt;br /&gt;
}&lt;br /&gt;
m_size = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
size_t size() const&lt;br /&gt;
{&lt;br /&gt;
return m_size;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
iterator begin()&lt;br /&gt;
{&lt;br /&gt;
return m_head;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
const_iterator begin() const&lt;br /&gt;
{&lt;br /&gt;
return m_head;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
iterator end()&lt;br /&gt;
{&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
const_iterator end() const&lt;br /&gt;
{&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
iterator last()&lt;br /&gt;
{&lt;br /&gt;
return m_tail;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
const_iterator last() const&lt;br /&gt;
{&lt;br /&gt;
return m_tail;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void sort()&lt;br /&gt;
{&lt;br /&gt;
// we always number elements in linked list as 1, 2, ..., n&lt;br /&gt;
// instead of 0, 1, ..., n-1; hence start index is 1.&lt;br /&gt;
m_head = quicksort(m_head, 1, m_size);&lt;br /&gt;
&lt;br /&gt;
// restore previous-element pointers&lt;br /&gt;
Node* node = m_head;&lt;br /&gt;
Node* pnode = 0;&lt;br /&gt;
&lt;br /&gt;
while (node != 0)&lt;br /&gt;
{&lt;br /&gt;
node-&amp;gt;m_prev = pnode;&lt;br /&gt;
pnode = node;&lt;br /&gt;
node = node-&amp;gt;m_next;&lt;br /&gt;
}&lt;br /&gt;
m_tail = pnode;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
typedef bool (*Sorter)(const T&amp;amp; first, const T&amp;amp; second);&lt;br /&gt;
&lt;br /&gt;
void sort(Sorter s)&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
private:&lt;br /&gt;
struct Node&lt;br /&gt;
{&lt;br /&gt;
Node(T elem, Node* prev, Node* next) : m_elem(elem), m_prev(prev), m_next(next) {}&lt;br /&gt;
bool operator&amp;gt;(const Node&amp;amp; other) { return m_elem &amp;gt; other.m_elem; }&lt;br /&gt;
bool operator&amp;lt;(const Node&amp;amp; other) { return m_elem &amp;lt; other.m_elem; }&lt;br /&gt;
bool operator==(const Node&amp;amp; other) { return m_elem == other.m_elem; }&lt;br /&gt;
&lt;br /&gt;
T m_elem;&lt;br /&gt;
Node* m_prev;&lt;br /&gt;
Node* m_next;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class ListIterator&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
typedef T iterator_category;&lt;br /&gt;
&lt;br /&gt;
ListIterator(Node* head) : m_node(head) {}&lt;br /&gt;
&lt;br /&gt;
ListIterator(const ListIterator&amp;amp; it) : m_node(it.m_node) {}&lt;br /&gt;
&lt;br /&gt;
bool operator==(const ListIterator&amp;amp; other) const { return m_node == other.m_node; }&lt;br /&gt;
bool operator!=(const ListIterator&amp;amp; other) const { return m_node != other.m_node; }&lt;br /&gt;
&lt;br /&gt;
void operator++() // goto the next element&lt;br /&gt;
{&lt;br /&gt;
assert(m_node != 0);&lt;br /&gt;
m_node = m_node-&amp;gt;m_next;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void operator--() // goto the previous element&lt;br /&gt;
{&lt;br /&gt;
assert(m_node != 0);&lt;br /&gt;
m_node = m_node-&amp;gt;m_prev;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
T&amp;amp; operator*() // access the current element&lt;br /&gt;
{&lt;br /&gt;
assert(m_node != 0);&lt;br /&gt;
return m_node-&amp;gt;m_elem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
private:&lt;br /&gt;
friend class List&amp;lt;T&amp;gt;;&lt;br /&gt;
Node* m_node;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// quicksort()&lt;br /&gt;
//&lt;br /&gt;
Node* quicksort(Node* list, unsigned int listStart, unsigned int listEnd)&lt;br /&gt;
{&lt;br /&gt;
if (listStart &amp;gt;= listEnd)&lt;br /&gt;
return list;&lt;br /&gt;
&lt;br /&gt;
unsigned int i = listStart;&lt;br /&gt;
unsigned int j = listEnd - 1;&lt;br /&gt;
&lt;br /&gt;
Node* right = getNthNode(list, listEnd);&lt;br /&gt;
Node* left = getNthNode(list, listStart);&lt;br /&gt;
Node* pivot = selectPivot(left, right);&lt;br /&gt;
right = findPrev(left, pivot);&lt;br /&gt;
&lt;br /&gt;
for (;;)&lt;br /&gt;
{&lt;br /&gt;
// now start partitioning the list&lt;br /&gt;
for (; left-&amp;gt;m_elem &amp;lt; pivot-&amp;gt;m_elem; ++i)&lt;br /&gt;
{&lt;br /&gt;
left = left-&amp;gt;m_next;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
for (; (right-&amp;gt;m_elem &amp;gt; pivot-&amp;gt;m_elem) &amp;amp;&amp;amp; (j &amp;gt; 1); --j)&lt;br /&gt;
{&lt;br /&gt;
right = findPrev(list, right);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if (i &amp;lt; j)&lt;br /&gt;
{&lt;br /&gt;
list = swapNodes(list, left, right);&lt;br /&gt;
&lt;br /&gt;
// left, right ptrs got swapped, to continue traversing we need them&lt;br /&gt;
// back at the same positions.&lt;br /&gt;
Node* tmp = left;&lt;br /&gt;
left = right;&lt;br /&gt;
right = tmp;&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
break;&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// restore pivot&lt;br /&gt;
list = swapNodes(list, left, pivot);&lt;br /&gt;
&lt;br /&gt;
// now sort on smaller linked lists&lt;br /&gt;
list = quicksort(list, listStart, i-1);&lt;br /&gt;
list = quicksort(list, i+1, listEnd);&lt;br /&gt;
&lt;br /&gt;
return list;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// getNthNode()&lt;br /&gt;
//&lt;br /&gt;
Node* getNthNode(Node* list, unsigned int n)&lt;br /&gt;
{&lt;br /&gt;
for (unsigned int i = 1; list != 0 &amp;amp;&amp;amp; i &amp;lt; n; ++i)&lt;br /&gt;
{&lt;br /&gt;
list = list-&amp;gt;m_next;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
return list;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// selectPivot()&lt;br /&gt;
//&lt;br /&gt;
Node* selectPivot(Node* list, Node* end)&lt;br /&gt;
{&lt;br /&gt;
unsigned int n = numNodes(list, end);&lt;br /&gt;
Node* noden = getNthNode(list, (unsigned int)((float)n/2 + 0.5));&lt;br /&gt;
Node* right = findPrev(list, end);&lt;br /&gt;
&lt;br /&gt;
if (noden != right)&lt;br /&gt;
{&lt;br /&gt;
// swap the pivot and right most element in the list&lt;br /&gt;
// later pivot will be restored.&lt;br /&gt;
swapNodes(list, noden, right-&amp;gt;m_next);&lt;br /&gt;
return noden;&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
return noden-&amp;gt;m_next;&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// numNodes()&lt;br /&gt;
//&lt;br /&gt;
unsigned int numNodes(Node* list, Node* end)&lt;br /&gt;
{&lt;br /&gt;
unsigned int i = 1;&lt;br /&gt;
&lt;br /&gt;
for (; list &amp;amp;&amp;amp; (list != end); ++i, list = list-&amp;gt;m_next);&lt;br /&gt;
&lt;br /&gt;
return (list == end ? i : 0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// findPrev()&lt;br /&gt;
//&lt;br /&gt;
Node* findPrev(Node* list, Node* curr)&lt;br /&gt;
{&lt;br /&gt;
for (; list &amp;amp;&amp;amp; list-&amp;gt;m_next; list = list-&amp;gt;m_next)&lt;br /&gt;
{&lt;br /&gt;
if (list-&amp;gt;m_next == curr)&lt;br /&gt;
break;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if (list-&amp;gt;m_next != curr)&lt;br /&gt;
{&lt;br /&gt;
// we did not find any element; probably indicates what&lt;br /&gt;
// we are searching for is the beginning node.&lt;br /&gt;
return curr;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
return list;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// swapNodes()&lt;br /&gt;
//&lt;br /&gt;
// A complete swap algorithm which cares of several scenarios while swapping&lt;br /&gt;
// two nodes in a linked list which doesn't have any special nodes.&lt;br /&gt;
// Scenarios considered while swapping:&lt;br /&gt;
// 1) two nodes which are far away&lt;br /&gt;
// 2) two nodes which are far away, one is node at the beginning of the list&lt;br /&gt;
// 3) two nodes which are neighbors&lt;br /&gt;
// 4) two nodes which are neighbors, one node is at the beginning of the list&lt;br /&gt;
Node* swapNodes(Node* list, Node* node1, Node* node2)&lt;br /&gt;
{&lt;br /&gt;
Node* node1prev = findPrev(list, node1);&lt;br /&gt;
Node* node2prev = findPrev(list, node2);&lt;br /&gt;
Node* tmp = node2-&amp;gt;m_next;&lt;br /&gt;
&lt;br /&gt;
// check whether node to be swapped is in beginning (i.e. header node)&lt;br /&gt;
if (node1 != list)&lt;br /&gt;
{&lt;br /&gt;
node1prev-&amp;gt;m_next = node2;&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
// as we do not have special header node, if the first node and some&lt;br /&gt;
// other node, need to be swapped, then update the list (makes new min&lt;br /&gt;
// node as logical header)&lt;br /&gt;
list = node2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// are nodes to be swapped neighboring nodes?&lt;br /&gt;
if (node1-&amp;gt;m_next == node2)&lt;br /&gt;
{&lt;br /&gt;
node2-&amp;gt;m_next = node1;&lt;br /&gt;
node1-&amp;gt;m_next = tmp;&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
// nodes to be swapped are not neighbor nodes, they are apart;&lt;br /&gt;
// so condiser all scenarios&lt;br /&gt;
node2-&amp;gt;m_next = node1-&amp;gt;m_next;&lt;br /&gt;
node1-&amp;gt;m_next = tmp;&lt;br /&gt;
node2prev-&amp;gt;m_next = node1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
return list;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Data Members&lt;br /&gt;
Node* m_head;&lt;br /&gt;
Node* m_tail;&lt;br /&gt;
size_t m_size;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
} // end namespace nonstd&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Exercise.cpp''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//http://ubuntuforums.org/archive/index.php/t-1088320.html&lt;br /&gt;
//$ g++ -o Exercise  Exercise.cpp&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;List.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;algorithm&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;cassert&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
template &amp;lt;typename T&amp;gt; void displayValue(T&amp;amp; value);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char** argv)&lt;br /&gt;
{&lt;br /&gt;
nonstd::List&amp;lt;int&amp;gt; list1;&lt;br /&gt;
&lt;br /&gt;
list1.push_back(2);&lt;br /&gt;
list1.push_back(5);&lt;br /&gt;
list1.push_back(3);&lt;br /&gt;
list1.push_back(0);&lt;br /&gt;
list1.push_back(4);&lt;br /&gt;
list1.push_back(8);&lt;br /&gt;
list1.push_back(9);&lt;br /&gt;
list1.push_back(7);&lt;br /&gt;
list1.push_back(6);&lt;br /&gt;
list1.push_back(1);&lt;br /&gt;
&lt;br /&gt;
std::cout &amp;lt;&amp;lt; &amp;quot;Before sorting:\n&amp;quot;;&lt;br /&gt;
std::for_each(list1.begin(), list1.end(), displayValue&amp;lt;int&amp;gt;);&lt;br /&gt;
std::cout &amp;lt;&amp;lt; &amp;quot;nil&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
list1.sort();&lt;br /&gt;
std::cout &amp;lt;&amp;lt; &amp;quot;After sorting:\n&amp;quot;;&lt;br /&gt;
std::for_each(list1.begin(), list1.end(), displayValue&amp;lt;int&amp;gt;);&lt;br /&gt;
std::cout &amp;lt;&amp;lt; &amp;quot;nil&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
list1.push_front(13);&lt;br /&gt;
list1.push_front(14);&lt;br /&gt;
list1.push_back(11);&lt;br /&gt;
list1.push_back(10);&lt;br /&gt;
list1.push_back(12);&lt;br /&gt;
std::cout &amp;lt;&amp;lt; &amp;quot;After inserting 13, 14, 11, 10, 12:\n&amp;quot;;&lt;br /&gt;
std::for_each(list1.begin(), list1.end(), displayValue&amp;lt;int&amp;gt;);&lt;br /&gt;
std::cout &amp;lt;&amp;lt; &amp;quot;nil&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
list1.sort();&lt;br /&gt;
std::cout &amp;lt;&amp;lt; &amp;quot;After sorting:\n&amp;quot;;&lt;br /&gt;
std::for_each(list1.begin(), list1.end(), displayValue&amp;lt;int&amp;gt;);&lt;br /&gt;
std::cout &amp;lt;&amp;lt; &amp;quot;nil&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
std::cout &amp;lt;&amp;lt; &amp;quot;Iterating backwards:\nnil&amp;quot;;&lt;br /&gt;
for (nonstd::List&amp;lt;int&amp;gt;::iterator it = list1.last(); it != 0; --it)&lt;br /&gt;
{&lt;br /&gt;
std::cout &amp;lt;&amp;lt; &amp;quot; &amp;lt;- &amp;quot; &amp;lt;&amp;lt; *it;&lt;br /&gt;
}&lt;br /&gt;
std::cout &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
template &amp;lt;typename T&amp;gt; void displayValue(T&amp;amp; node)&lt;br /&gt;
{&lt;br /&gt;
std::cout &amp;lt;&amp;lt; node &amp;lt;&amp;lt; &amp;quot; -&amp;gt; &amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Piles=&lt;br /&gt;
&lt;br /&gt;
{{Autor}}, desembre 2011&lt;/div&gt;</summary>
		<author><name>Joan</name></author>
		
	</entry>
</feed>