2015-01-22 4 views
0
void AddToEnd(double data ,int x, int y, element **list){ 
element *node, *tmp; 
node=*list; 
if (data != 0) 
{ 
    tmp=malloc(sizeof(element)); 
    tmp->value=data; 
    tmp->x_element=x; 
    tmp->y_element=y; 
    tmp->next=NULL; 
    if (node !=NULL) { 
     while (node->next != NULL) node=node->next; 
     node->next=tmp; 
    } 
    else 
    { 
     *list=tmp; 
    } 
} 

}Добавление элемента в конец связанного списка

Как выйти это «если (узел! = NULL)/еще»? Я хочу добавить элемент в конец списка, но без этого if/else, который я использовал для добавления первого элемента.

+0

Почему вы хотите сделать это без * if/else *? – user7

+0

Это просто академический пример. – oszust002

+1

Если это академический, вы, вероятно, должны применить к нему свой мозг. Просто используйте узел вместо node-> next в то время. Я оставлю вас для выяснения деталей. –

ответ

1

Вы можете добавить один уровень косвенности и сохранить указатель на текущий узел. Измените список с помощью этого указателя. Исходным значением является адрес головы. После этого он содержит адрес поля next предыдущего узла.

void AddToEnd(double data, int x, int y, element **list) 
{ 
    if (data != 0) { 
     element *tmp = malloc(sizeof(*tmp)); 

     tmp->value = data; 
     tmp->x_element = x; 
     tmp->y_element = y;   
     tmp->next = NULL; 

     while (*list) { 
      list = &(*list)->next; 
     } 

     *list = tmp; 
    } 
} 

Этот код обновляет заголовок списка, когда список пуст.

+1

Обратите внимание, что 'tmp' на самом деле не требуется; вы можете использовать ['(* list)'] (http://pastebin.com/pQL7Dgcq), если сначала будет цикл while. Несмотря на это, вверх-тикпинг-подход указателя к указателю, который * часто * полезен с различными алгоритмами перечисления, является одним из них. – WhozCraig

1

Вы можете создать фиктивный узел головки в главном

element *list = malloc(sizeof(element)); 
list->value=0; 
list->x_element=0; 
list->y_element=0; 
list->next=NULL; 

И здесь на вы можете использовать AddToEnd modfied (без если/другое), как

void AddToEnd(double data ,int x, int y, element **list){ 
element *node, *tmp; 
node=*list; 
if (data != 0) 
{ 
    tmp=malloc(sizeof(element)); 
    tmp->value=data; 
    tmp->x_element=x; 
    tmp->y_element=y; 
    tmp->next=NULL; 

    while (node->next != NULL) node=node->next; 
    node->next=tmp; 

} 
} 

Так что ваш список на самом деле начинается с второй узел в

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