Список с заглавным звеном
Чтобы сделать действия, выполняемые при включении элемента в список (исключении элемента из списка), единообразными, обычно применяется следующий прием. В начало каждого списка добавляется заглавное звено (заголовок списка). Оно никогда не исключается из списка и перед ним в список никогда не включаются новые элементы.
Информационная часть заглавного звена или не используется вовсе, или используется для специальных целей. Например, в случае списка целых чисел она может содержать число, равное количеству звеньев в списке. Добавление заглавного звена в список приводит к тому, что теперь у всех элементов, в том числе и у первого, имеется предшественник, и действия по включению новых элементов в список (или исключение элементов из списка) проводятся единым способом.
Приведем алгоритм построения однонаправленного списка с заглавным звеном с сохранением порядка поступления звеньев.
#include
struct node
{
int value; //Информационный элемент звена списка
node *next; // Указатель на следующее звено списка
};
void main()
{
int n=0;
node *first, *curr;
first = new (node);
curr = first;
(*curr).next=NULL;
cout<<"Enter members:"</ Вывод содержимого информационных полей списка
cin>>n;
while(n!=0)
{
(*curr).next=new (node);
curr=(*curr).next;
(*curr).value=n;
(*curr).next=NULL;
cin>>n;
};
for (curr=first; curr!=NULL; curr=(*curr).next)
cout<<(*curr).value << " ";
}
Удаления списка из памяти
Отметим, что одной из распространенных ошибок при составлении программ является неаккуратное обращение с динамически распределяемой памятью, в частности, "забывание" освободить ее после использования, что в конце концов может привести к аварийному завершению программы из-за нехватки оперативной памяти.
Дополним нашу программу алгоритмом удаления созданного списка.
curr=first;
while (curr!=NULL)
{
curr1=(*curr).next;
delete curr;
curr=curr1;
}
delete curr;