Обработка простых списков.pptx
- Количество слайдов: 17
Обработка простых списков Связный список содержит либо nullссылки, либо ссылки на узлы, которые содержат элемент и ссылку на связный список. for (link t = х; t != 0; t = t->next) visit(t->item) ; for (int i = 0; i < N; i++)
1. Обращение порядка следования элементов списка
link reverse(link x) { link t, у = x, r = 0; while (у != 0) { t = y->next; y->next = r; r = y; y= t; } return r; }
2. СОРТИРОВКА СВЯЗНОГО СПИСКА
х- >next- >item > t- >item (или х- >next = NULL) node heada (0, 0); link а = &heada, t = a; for (int i = 0; i < N; i++) t = (t->next = new node (rand () % 1000, 0)) ; node headb (0, 0); link u, x, b = &headb; for (t = a->next; t != 0; t = u) { u = t->next; for (x = b; x->next != 0; x = x->next) if (x->next->item > t->item) break; t->next = x->next; x->next = t; }
Существуют три возможности: Дублировать цикл for, который обнаруживает наименьший элемент и создает список из одного узла. Перед каждой вставкой узла проверять, не является ли список вывода пустым. Использовать фиктивный ведущий узел, ссылка которого указывает на первый узел списка.
Соглашения о ведущем и завершающем узлах в связных списках Список циклический, никогда не бывает пустым первая вставка: head->next = head; вставка t после х: t->next = x->next; x->next = t; удаление после х: x->next = x->next; цикл обхода: t = head; do {. . . t = t->next; } while (t != head) ; проверка на наличие лишь одного элемента: if (head->next == head)
Ведущий указатель, null-указатель завершающего узла инициализация: head = 0; вставка t после х: if (х = 0) {head = t; head->next = 0; } else { t->next = x->next; x->next = t; } удаление после x: t = x->next; x->next - t>next; цикл обхода: for (t = head; t != 0; t = t>next) проверка на пустоту: if (head = 0)
Фиктивный ведущий узел, nullуказатель завершающего узла инициализация: head = new node; head->next = 0; вставка t после x: t->next = x->next; x>next = t; удаление после x: t = x->next; x->next = t ->next; цикл обхода: for (t = head->next; t != 0; t = t->next) проверка на пустоту: if (head->next = 0)
Фиктивные ведущий и завершающий узлы инициализация: head = new node; z = new node; head->next = z; z->next = z; вставка t после х: t->next = x->next; x>next = t; удаление после x: x->next = x->next; цикл обхода: for (t = head->next; t '= z; t = t ->next) проверка на пустоту: if (head->next == z)
Интерфейс обработки списков typedef int Item; struct node { Item item; node *next; } ; typedef node *link; typedef link Node ; void construct(int) ; Node new. Node(int) ; void de let «Node (Node) ; void insert(Node, Node); Node remove (Node) ; Node next (Node) ; Item item(Node) ;
3. Удаление и вставка в двухсвязном списке(double linked list)
x->next->prev и x->prev->next Основные операции в двухсвязных списках: remove (удалить), insert after (вставить после), insert before (вставить перед).
Для данного t указателю t- >next- >prev присваивается значение t- >prev (средняя диаграмма), а указателю t->prev->next — значение t->next (нижняя диаграмма).
Для вставки узла t после узла х указателю t- >next присваивается значение х- >next, а указателю х- >next- >prev — значение t (средняя диаграмма). Затем указателю x->next присваивается значение t, а указателю t- >prev — значение х (нижняя диаграмма).
4. Мультисписок
Обработка простых списков.pptx