2013-06-27 2 views
0

Это функция, предназначенная для вставки нового узла в конец базового связанного списка.Передача указателя на указатель на голову, функция void insertNode?

node *insert(node *head, int data) 
{ 
    if (head == NULL) 
     return createNode(data); 

    head->next = insert(head->next, data); 

    return head; 
} 

Как я могу изменить его так, что он не имеет возвращаемого значения, а вместо этого передает указатель на голову указатель? Можно ли записать его рекурсивно, как указано выше?

Вот функция подписи:

void insert(node **head, int data) 
+0

'if (* head == NULL) * head = createNode (data);' и т. Д. –

+0

Кроме того, 'insert (& (head) -> next, data);' –

+0

Спасибо, мне не хватало символ '&' в рекурсивном вызове. –

ответ

1

Как это:

void insert(node **head, int data) 
{ 
    if (*head == NULL) 
     *head = createNode(data); 

    insert(&(*head)->next, data); 
} 
-1

нерекурсивна версия:

void insert(node **head, int data) 
{ 
    node *p; 

    if (*head == NULL) { 
     *head = createNode(data); 
     return; 
    } 
    for (p = *head; p->next != NULL; p = p->next) 
     ; 
    p->next = createNode(data); 
} 

предложение Джима Балтер в:

void insert(node **head, int data) 
{ 
    for (; *head != NULL; head = &(*head)->next) 
     ; 
    *head = createNode(data); 
} 
+0

@KeithNicholas Пожалуйста, объясните. – ctn

+0

он не будет перебирать список, чтобы найти пустое место и создать узел –

+0

@KeithNicholas Вот в чем смысл. – ctn