С помощью указателей можно создать набор, элементы в который можно добавлять по мере необходимости в отличие от массивов С. Простейшим вариантом такого набора является односвязный список.
[Визуализатор операций с односвязным списком](/viz/list1.html)
Список не обеспечивает прямого доступа к элементам набора по номеру. Для перемещения по списку и получения значения используется итератор списка (указатель на текущий элемент).
```cpp
// Тип для узла списка
typedef struct Node {
int value;
struct Node *next;
} Node;
Если в итераторе хранить указатели на текущий и предыдущий элементы, то не нужно будет разделять функции по удалению или добавлению значений в начало и середину списка:
[Визуализатор операций с другим итератором](/viz/list2.html)
```cpp
// Тип для узла списка
typedef struct Node {
int value;
struct Node *next;
} Node;
// Тип для итератора списка
typedef struct {
Node* curr=nullptr;
Node* prev=nullptr;
bool isDone() { return !curr; }
void GotoNext() { if(curr) {
prev=curr;
curr=curr->next; }}
int& Item() {
if(curr)
return curr->value;
else {
printf("Конец списка\n");
exit(1);
}
}
} ListIterator;
// Тип для всего списка
typedef struct {
Node* root=nullptr;
void AddFront(int v) {
Node* p=malloc(sizeof(Node));
p->value=v;
p->next=root;
root=p;
}
void InsertBefore(ListIterator& li, int v) {
if(li.curr) {
Node* p=malloc(sizeof(Node));
p->value=v;
if(li.prev) {
p->next=li.prev;
li.prev=p;
}
else {
p->next=root;
root=li.prev=p;
}
}
}
void InsertAfter(ListIterator& li, int v) {
if(li.curr) {
Node* p=malloc(sizeof(Node));
p->value=v;
p->next=li.curr->next;
li.curr->next=p;
}
}
void DelNode(ListIterator& li) {
if(li.curr) {
Node* p=li.curr->next;
free(li.curr);
li.curr=p;
if(li.prev)
li.prev->next=p;
else
root=p;
}
}
void GotoFirst(ListIteraror& li) {
li.prev=nullptr;
li.curr=root;
}
void DelAll() {
ListIterator li;
GotoFirst(li);
while(li.isDone()) DelNode(li);
}
} List;
```
Также упрощаются действия, если хранить указатель не только на следующий, но и на предыдущий элемент списка:
[Визуализатор операций с двусвязным списком](/viz/list3.html)
```cpp
// Тип для узла списка
typedef struct Node {
int value;
struct Node *next;
struct Node *prev;
} Node;