2015-05-31 2 views
0
typedef struct node { int data; struct node *next; } NODE; 

NODE* add_head(NODE **phead, int data) { 
    NODE *new = (NODE *)malloc(sizeof(NODE)); 
    new->data = data; 
    new->next = *phead; 
    *phead = new; 
    return new; 
} 

NODE* add_tail(NODE **phead, int data) { 
    NODE *p, *new = (NODE *)malloc(sizeof(NODE)); 
    new->data = data; 
    new->next = 0; 
    if (*phead == 0) *phead = new; 
    else 
    { 
    for (p = *phead; p->next; p = p->next); 
    p->next = new; 
    } 
    return new; 
} 

У нас есть отдельный список, как показано выше в функциях. Узел состоит из типа данных int и указателя на следующий узел в списке. Мы определили две функции. Первый изменяет головной узел или добавляет новый головной узел перед предыдущим головным узлом. Вторая функция добавляет хвостовой узел (последний в списке). В основном, мы называем их, как:C - Одиночный список - передача указателя по значению vs по ссылке

NODE *head = 0; 
NODE *c1 = add_head(&head, 1); 
NODE *c2 = add_tail(&head, 3); 

Теперь посмотрим на эту функцию:

NODE* add_after(NODE *node, int data) { 
    NODE *new = (NODE *)malloc(sizeof(NODE)); 
    new->data = data; 

    new->next = node->next; 
    node->next = new; 

    return new; 
} 

Эта функция добавляет узел после узла аргумента. И, в основном, если мы хотим, чтобы добавить узел после c1 ранее определенного, мы называем функцию, как:

*c3 = add_after(c1, 4); 

Мой вопрос: В чем разница между первыми двумя и третьей функции с точки зрения аргументов , В первых двух функциях мы имеем аргумент ** phead и в третьей функции, * node. Действительно ли нам нужно ** phead, почему мы не можем просто положить * phead и в основном называют это нравится:

NODE *c1 = add_head(head, 1); 

Я надеюсь, вы поняли, что я имел в виду, я считаю, это трудно объяснить.

ответ

1
  • адрес первого элемента (типа NODE) содержится в указатель (типа) NODE *

  • в add_head() функций модифицирует этот указатель. Поскольку вы программируете на C, явно не имея передачи параметров по ссылке, ваш единственный вариант - передать его адрес.

Таким образом, параметр типа NODE** (адрес указателя на NODE).

  • для add_after() Параметр дает адрес NODE, который необходимо изменить. Вам не нужно изменять этот адрес.
+0

'УЗЕЛ * add_head (УЗЕЛ * phead, Int данных) {' ' NODE * новое = (УЗЕЛ *) таНос (SizeOf (УЗЕЛ));' ' New-> данные = данные;' ' new-> next = phead; ' ' phead = new; ' ' return new; ' '} ' Что произойдет, если бы у нас была эта функция? – A6SE

+0

@ A6SE хорошо, вы сами увидите, если попытаетесь создать список, используя функцию add_head, а затем распечатайте его первый элемент. Лучше попробуйте, чем спекулировать (или верить, не видя). –

+0

Изображение в разделе редактирования помогло мне понять: D Редактировать: не удается отправить изображения, но вот ссылка: https://scontent-fra3-1.xx.fbcdn.net/hphotos-xpf1/v/t35.0 -12/899637_10205653784815332_1271825706_o.jpg? о = 15e3ffd465e8c832690f0b6cae1a63dc & ае = 556D874C – A6SE

Смежные вопросы