Интерфейс обработки списков.
Для распределения памяти под узлы списка и ее освобождения объявляются собственные функции. Функция construct применена для удобства реализации.
// list.h typedef int Item; struct node { Item item; node * next; }; typedef node *link; typedef link *Node; void construct(int); link newNode(int); void deleteNode(Node); void insert(link, link); link remove(link); Node next(Node); Item item(Node);
Реализация интерфейса обработки списков
Эта программа создает свободный список, который инициализируется в соответствии с максимальным количеством узлов, используемых программой. Все узлы взаимосвязаны. Когда клиентская программа удаляет узел, он привязывается к свободному списку.
#include <iostream> #include <stdlib.h> #include "list.h" using namespace std; link freelist; void construct(int N) { freelist = new node[N+1]; for (int i = 0; i < N; i++) { freelist[i].next = &freelist[i+1]; } freelist[N].next = 0; } link newNode(int i) { link x = remove(freelist); x->item = i; x->next = x; return x; } void deleteNode(link x) { insert(freelist, x); } void insert(link x, link t) { t->next = x->next; x->next = t; } link remove(link x) { link t = x->next; x->next = t->next; return t; } link next(link x) { return x->next; } Item item(link x) { return x->item; } void print_list(link x) { link head = x, t = x; cout << "---list---" << endl; do { cout << t->item << endl; t = t->next; } while(t != head); cout << "---end-list---" << endl; } link reverse(link x) { link t, y = x, r = 0; while (y != 0) { t = y->next; y->next = r; r = y; y = t; } return r; } int main(int argc, char *argv[]) { int N = 10; link x, t; construct(N); x = newNode(1); for (int i = 2; i <= N; i++ ) { t = newNode(i); insert(x, t); } print_list(x); print_list(reverse(x)); return 0; }
Преимущество связных списков перед массивами состоит в том, что связные списки эффективно изменяют размеры на протяжении времени жизни. В частности, необязательно заранее знать максимальный размер списка. Одно из важных практических следствий этого свойства состоит в возможности иметь несколько структур данных, обладающих общим пространством, не уделяя особого внимания их относительному размеру в любой момент времени.