Удалить узел из связанного списка, если (условие) - PullRequest
1 голос
/ 08 октября 2019

Мой связанный список составлен из структур с 4 целыми числами. Когда целое число ttl меньше 1, узел должен быть удален из моего списка. Код, который у меня есть на данный момент, работает в некоторых случаях, а именно, только когда удаляемый узел находится в начале списка.

typedef struct _ttl_t {
    int x;
    int y;
    int value;
    int ttl;
    struct ttl *next;
} ttl_t;



ttl_t *remove_ttl (ttl_t *head) { // ’r’ command
    if (head==NULL){
        return head;
    }
    else {
        ttl_t *curr=head;
        while (curr){
            if (curr->ttl<1){
                head=curr->next;
                free(curr);
            }
            curr=curr->next;
        } 
    }
    return head;
}

1 Ответ

1 голос
/ 08 октября 2019

Для начала объявление структуры в typedef

typedef struct _ttl_t {
    int x;
    int y;
    int value;
    int ttl;
    struct ttl *next;
} ttl_t;

неверно. struct _ttl_t и struct ttl - это два разных типа. Я думаю, что вы имеете в виду

typedef struct _ttl_t {
    int x;
    int y;
    int value;
    int ttl;
    struct _ttl_t *next;
} ttl_t;

Этот цикл

    while (curr){
        if (curr->ttl<1){
            head=curr->next;
            free(curr);
        }
        curr=curr->next;
    } 

также неверен, потому что, если узел имеет элемент данных ttl меньше 1, головной узел изменяется, хотя его собственные данныеэлемент ttl может быть больше или равен 1.

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

Например

void remove_ttl( ttl_t **head ) 
{
    while ( *head != NULL )
    {
        if ( ( *head )->ttl < 1 )
        {
            ttl_t *tmp = *head;
            *head = ( *head )->next;
            free( tmp );
        }
        else
        {
            head = &( *head )->next;
        }
    }
}
...