Как получить указатель элемента из связанного списка - PullRequest
1 голос
/ 28 марта 2020

Нетрудно найти элемент в связанном списке и вернуть его: просто просмотрите копию списка и верните элемент, который соответствует предикату поиска. Однако мне было интересно, есть ли способ получить указатель элемента, который мы ищем в списке, что подразумевает трудность, которую я не смог преодолеть: не может быть копии исходного списка (в противном случае указатель будет недействительным или не будет соответствовать элементу в исходном списке).

Я выбрал структуру связанного списка, потому что мне нужно много дополнений и удалений, что позволяет делать массив, но в меньшем количестве эффективный способ. Тем не менее, я хотел бы иметь возможность изменять некоторые элементы моего списка; чтобы сделать это, я представил себе такую ​​функцию:

struct Item
{
    char* str;
    int value;
};

typedef struct Node
{
    struct Item item;
    struct Node *next;
} Node;

Node *push(Node *head, const struct Item)
{
    Node *new_node;
    new_node = malloc(sizeof(*new_node));
    new_node->item = item;
    new_node->next = head;
    head = new_node;
    return head;
}

Node *remove(Node *head, char* str)
{
    if (head == NULL)
        return NULL;

    if (!strcmp(head->item.str, str))
    {
        Node *tmp_next = head->next;
        free(head);
        return tmp_next;
    }

    head->next = remove(head->next, str);
    return head;
}

struct Item *get_item_ptr(const Node *head, char* str)
{
    // I would get the pointer of the structure Item that refers to the string `str`.
    ...
    return NULL; // I return `NULL` if no item meets this predicate.
}

Я не знаю, как это сделать, сохранив исходный связанный список, и я не уверен, что это хорошая идея, и в этом случае я будет сокращен до простого массива (или другой более подходящей структуры данных?).

1 Ответ

1 голос
/ 28 марта 2020

Кажется, что функция должна быть определена как

struct Item * get_item_ptr( const Node *head, const char *str )
{
    while ( head != NULL && strcmp( head->item.str, str ) != 0 )
    {
        head = head->next;
    }

    return head == NULL ? ( struct Item * )NULL : &head->item; 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...