Мой первый шаг во взятии C был копией "Языка программирования C" - это - простая книга, но язык самостоятельно довольно прост.
typedef
создает новый " type "в вашей программе, поэтому возвращаемое значение и типы параметров этих функций - это просто ваша структура. Это просто сокращение использования struct node
для типа.
Если бы вы создавали новый узел, вы могли бы сделать это следующим образом (используя тип):
LLIST *node = malloc(sizeof(LLIST));
node->data = 4;
node->next = someOtherItem;
list_add(node, 1)
Также, с помощью функции прототипы в вашем вопросе, вам действительно не нужны двойные указатели; поскольку данные в вашей структуре представляют собой просто int
, вы можете сделать что-то вроде
LLIST *list_add(int data, int position);
, тогда функция list_add
будет обрабатывать выделение, скопируйте int
в структуру и добавить ее в связанный список.
Поместить ее в определенную позицию так же просто, как изменить указатель next
в узле перед ней на адрес вновь выделенного узла, а следующий
указатель в новом узле, указывающий на следующий (тот, на который изначально указывал узел перед этим).
Имейте в виду, что (учитывая остальные прототипы ваших функций) вам нужно будет отслеживать указатели на каждый созданный вами узел, чтобы удалить их все.
Я не уверен, что понимаю, как работает функция поиска будет работать. Все это можно было бы реализовать намного лучше. У вас не должно быть , чтобы указать местоположение узла при его создании (что, если вы укажете большее число, чем количество узлов?) И т. Д.
Это typedef
. На самом деле он делает две вещи одновременно. Сначала он определяет структуру:
struct node {
int data;
struct node *next;
}
И затем typedef
:
typedef struct node LLIST;
Это означает, что LLIST
является типом, точно так же, как int
или ] FILE
или char
, что является сокращением для struct node
, вашей структуры узла связанного списка. В этом нет необходимости - вы можете заменить LLIST
на struct node
во всех этих местах - но это немного упрощает чтение и помогает скрыть реализацию от надоедливых конечных пользователей.
LLIST - это просто другое имя типа для созданной структуры. Как правило, следующий формат создает тип «NAME», который является «struct x»:
typedef struct x { ... } NAME;
C требует, чтобы вы ссылались на структуры с префиксом "struct", поэтому обычно вводится typedef для менее подробного упоминания.
То есть объявление вашей структуры состоит из двух частей, и его можно переписать следующим образом:
struct node {
int data;
struct node *next; /* pointer to next element in list */
};
typedef struct node LLIST;
Итак, LLIST
- это просто еще одно имя для struct node
(спасибо Крису Лутцу).
LLIST *
- это указатель на структуру, определенную структурой LLIST
.
Вы должны сделать
LLIST* myList = malloc(sizeof(LLIST)*number_of_elements);
, чтобы выделить часть памяти для этого списка . Добавление и удаление элементов требует перераспределения памяти с помощью realloc. Я уже написал некоторый фрагмент кода для списков (созданных с помощью массивов).
Я мог бы опубликовать код, как только приду домой, чего сейчас нет.