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

Это код для связанного списка на языке программирования C.

#include <stdio.h>    /* For printf */
#include <stdlib.h>   /* For malloc */

typedef struct node {
    int data;
    struct node *next; /* Pointer to next element in list */
} LLIST;

LLIST *list_add(LLIST **p, int i);
void list_remove(LLIST **p);
LLIST **list_search(LLIST **n, int i);
void list_print(LLIST *n);

Код не завершен, но я думаю, что этого достаточно для моего вопроса. Здесь в конце struct node используется "LLIST", а также используется в качестве возвращаемого типа в прототипировании функции list_add. Что происходит?

Ответ 1

typedef создает новый "тип" в вашей программе, поэтому возвращаемое значение и типы параметров этих функций являются вашей структурой. Это просто сокращение использования struct node для типа.

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

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

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

Ответ 2

Это a typedef. Это на самом деле делает сразу две вещи. Во-первых, он определяет структуру:

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

И затем делает typedef:

typedef struct node LLIST;

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

Ответ 3

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

typedef struct x { ... } NAME;

Ответ 4

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

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

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

typedef struct node LLIST;

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

Ответ 5

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

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

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

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

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