Как и в случае с C, для функции, имеющей право изменять объект, переданный ей через список аргументов, необходимо передать адрес объекта, а не сам объект. ( подробнее об этом здесь )
В этом примере объект head
, если он должен быть изменен каким-либо образом, требует, чтобы его адрес (&head
) должен быть передан функции, а не самому объекту.
Таким образом, утверждение:
delete(head); //passing the object will not allow it to be changed
должно быть изменено на
delete(&head); //The object's address is passed, allowing the object to be changed
И поскольку передаваемый объект был создан как указатель: struct n *head = NULL;
, прототип для функции delete
должен содержать адрес указателя в своем аргументе. Это делается с помощью указателя на указатель:
void delete(struct n **head);//accommodates the address of a pointer object
Затем внутри функции delete
работайте над самим объектом (который теперь *head
), чтобы внести изменения.
void delete(struct n **head)
{
if (*head == NULL) return;
struct n *temp = *head;
*head = temp->next;//point head to next node
free(temp);//free old head
}
И наоборот, в вашей функции void add_item(struct n **ptr, double *data);
data
менять не нужно, только для использования внутри тела. Действительно, способ, которым он был вызван в вашем коде, является правильным способом отправки данных:
add_item(&head, 5); // 2nd argument passes object directly, i.e. not an address
Следовательно, поскольку функции нужны сами данные, а не указатель на данные, измените прототип наразместить:
void add_item(struct n **ptr, double data);
Измените код в теле кода соответственно.