Нетрудно найти элемент в связанном списке и вернуть его: просто просмотрите копию списка и верните элемент, который соответствует предикату поиска. Однако мне было интересно, есть ли способ получить указатель элемента, который мы ищем в списке, что подразумевает трудность, которую я не смог преодолеть: не может быть копии исходного списка (в противном случае указатель будет недействительным или не будет соответствовать элементу в исходном списке).
Я выбрал структуру связанного списка, потому что мне нужно много дополнений и удалений, что позволяет делать массив, но в меньшем количестве эффективный способ. Тем не менее, я хотел бы иметь возможность изменять некоторые элементы моего списка; чтобы сделать это, я представил себе такую функцию:
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.
}
Я не знаю, как это сделать, сохранив исходный связанный список, и я не уверен, что это хорошая идея, и в этом случае я будет сокращен до простого массива (или другой более подходящей структуры данных?).