2016-01-13 2 views
0

Примечание. У меня уже есть назначенная функция для работы с моим собственным кодом, но я видел учебник на другом веб-сайте и задаюсь вопросом, почему он не работает.Ошибка синтаксиса основного C связанного списка

https://www.eskimo.com/~scs/cclass/int/sx8.html

Предпосылка выглядит следующим образом:

Я играл с очень простым связным списком:

typedef struct node { 
    int val; 
    struct node * next; 
} node_t; 

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

int remove_by_value(node_t ** head, int val) { 
    for(head = &node_t; *head != NULL; head = &(*head)->next){ 
     if ((*head)->val == val) { 
      *head = (*head)->next; 
      break; 
     } 
    } 
} 

Однако я получаю сообщение об ошибке при вызове этой функции, а именно:

"prog.c:35:17: error: expected expression before 'node_t' 
for(head = &node_t; *head != NULL; head = &(*head)->next){ 
^" 

Есть идеи? Является ли это простой синтаксической ошибкой, которую я не вижу? Благодаря!

+4

Что это за 'head = & node_t' для? –

+0

В дополнение к ошибкам синтаксиса ваша логика для сплайсинга элемента неверна. –

+0

попробуйте «для (; ...)», i..e оставьте tghe «head = & node_t») –

ответ

2

корень проблемы состоит в том, что node_t является типом, а не переменной и не может принимать адрес типа.

Следующий код полностью компилируется.

быть уверены, чтобы проверить логику,

  1. для первой итерации цикла, когда head = NULL или только одна структура в связанном списке
  2. проверка логика при желании структура либо последнего или предпоследнего в связанном списке

вот код:

typedef struct node 
{ 
    int val; 
    struct node * next; 
} node_t; 


int remove_by_value(node_t ** head, int val) 
{ 
    int retVal = -1; // initialize to failed 
    node_t *previousNode = *head; 
    node_t *currentNode = *head; 

    for(; 
     previousNode && currentNode; // assure something to test 
     previousNode = currentNode, // update the pointers 
     currentNode = currentNode->next) 
    { 
     if (currentNode->val == val) 
     { 
      previousNode->next = currentNode->next; 
      retVal = 0; // indicate success 
      break; 
     } 
    } 
    return retVal; 
} // end function: remove_by_value 
+0

Спасибо много для ясного объяснения. Не понял, что я пытался выполнять переменные вызовы на typedef. Очень полезно! :) – riceman89

0

1) Ошибка, которую вы получаете, уже была указана iharob. 2) Я могу понять, что из этой головы = & t_node вы хотите, чтобы голова указывала в голову вашего списка. статическая переменная может потребоваться в вашем файле, чтобы быть в состоянии использовать это, то вы можете указать головку правильно

1

Поскольку я не могу комментировать accepted answer написан @user3629249: Этот код еще хуже, чем оригинал (за исключением того, будет компилироваться).

Я хотел бы предложить что-то вроде этого:

node_t *remove_by_value(node_t **head, int val) 
{ 
    node_t *ret = NULL; 

    for (; *head; head = &((*head)->next)) 
    { 
      if ((*head)->val == val) 
      { 
        ret = *head; 
        *head = (*head)->next; 
        break; 
      } 
    } 
    return ret; 
} 

Этот код правильно удаляет элемент из начала, середины и конца списка. Кроме того, он дает вызывающему абоненту возможность освободить несвязанный узел.

+0

Что бы вы предложили вместо этого как более чистый способ его написания? Благодаря! – riceman89

+0

Я отредактировал свой ответ в соответствии с вашим запросом. – gollum

+0

Спасибо! Это намного короче, элегантно и работает правильно. Очень признателен! – riceman89

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