Для начала это объявление
node work;
не имеет смысла. Вы уже объявили указатель на головной узел.
node *head =NULL;
В функции addnode
в этом фрагменте кода
else
{
node *p =head;
while(p!=NULL)
{
p=p->next;
}
p->next =temp;
temp =NULL;
}
l oop
while(p!=NULL)
{
p=p->next;
}
выполняется до тех пор, пока p не станет равным NULL. Поэтому использование нулевого указателя в следующем операторе
p->next =temp;
приводит к неопределенному поведению.
Этот фрагмент кода должен выглядеть следующим образом:
else
{
node *p = head;
while( p->next != NULL )
{
p = p->next;
}
p->next = temp;
}
Дисплей функции имеет утечка памяти, потому что сначала выделяется память, а ее адрес назначается указателю temp, а затем указатель переназначается. Таким образом, выделенная память не будет удалена.
node *temp=new node;
temp = head;
Функция может выглядеть как
void display(node *head)
{
for( node *temp = head; temp !=NULL; temp = temp->next )
{
cout<<temp->data<<" , ";
}
cout<<endl;
}
Или даже как
void display( const node *head )
{
for( const node *temp = head; temp !=NULL; temp = temp->next )
{
cout<<temp->data<<" , ";
}
cout<<endl;
}
В любом случае интерфейс списка противоречиво Функция addnode
имеет дело с глобальной переменной head
, а функция display
получает параметр. Это плохая идея использовать глобальную переменную, особенно когда функции зависят от такой переменной.