Как использовать структуру в C?

Мой первый шаг во взятии C был копией "Языка программирования C" - это - простая книга, но язык самостоятельно довольно прост.

13
задан Peter Mortensen 20 November 2011 в 09:15
поделиться

5 ответов

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 в узле перед ней на адрес вновь выделенного узла, а следующий указатель в новом узле, указывающий на следующий (тот, на который изначально указывал узел перед этим).

Имейте в виду, что (учитывая остальные прототипы ваших функций) вам нужно будет отслеживать указатели на каждый созданный вами узел, чтобы удалить их все.

Я не уверен, что понимаю, как работает функция поиска будет работать. Все это можно было бы реализовать намного лучше. У вас не должно быть , чтобы указать местоположение узла при его создании (что, если вы укажете большее число, чем количество узлов?) И т. Д.

7
ответ дан 1 December 2019 в 17:29
поделиться

Это typedef . На самом деле он делает две вещи одновременно. Сначала он определяет структуру:

struct node {
    int data;
    struct node *next;
}

И затем typedef :

typedef struct node LLIST;

Это означает, что LLIST является типом, точно так же, как int или ] FILE или char , что является сокращением для struct node , вашей структуры узла связанного списка. В этом нет необходимости - вы можете заменить LLIST на struct node во всех этих местах - но это немного упрощает чтение и помогает скрыть реализацию от надоедливых конечных пользователей.

24
ответ дан 1 December 2019 в 17:29
поделиться

LLIST - это просто другое имя типа для созданной структуры. Как правило, следующий формат создает тип «NAME», который является «struct x»:

typedef struct x { ... } NAME;
11
ответ дан 1 December 2019 в 17:29
поделиться

C требует, чтобы вы ссылались на структуры с префиксом "struct", поэтому обычно вводится typedef для менее подробного упоминания.

То есть объявление вашей структуры состоит из двух частей, и его можно переписать следующим образом:

struct node {
    int data;
    struct node *next; /* pointer to next element in list */
};

typedef struct node LLIST;

Итак, LLIST - это просто еще одно имя для struct node (спасибо Крису Лутцу).

10
ответ дан 1 December 2019 в 17:29
поделиться

LLIST * - это указатель на структуру, определенную структурой LLIST .

Вы должны сделать

LLIST* myList = malloc(sizeof(LLIST)*number_of_elements);

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

Я мог бы опубликовать код, как только приду домой, чего сейчас нет.

3
ответ дан 1 December 2019 в 17:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: