Хранить данные из структуры в другой структуре - PullRequest
0 голосов
/ 25 мая 2018

Я делаю что-то вроде симулятора супермаркета с использованием C. У меня есть структура, которая хранит данные от сотен вымышленных клиентов, например:

typedef struct clients {
int ID;
char Name[50];
}Clients;

Я импортировал .txt файл, содержащий эти клиенты.В основном это выглядит так:

1234 Peter Parker
4724 Barack Obama
3851 John Wick
9428 Donald Trump
...

Так что теперь мне нужно смоделировать супермаркет, у меня есть таймер, который обновляется, выбирает случайных клиентов из структуры и помещает их в супермаркет, мне нужно отслеживатьсколько из них и какие из них находятся внутри супермаркета.Дело в том, что я не знаю, как нравится размещать клиентов на рынке и хранить данные этих клиентов.Например, представьте, что клиенты A и B входят в супермаркет, как мне хранить этих конкретных клиентов на рынке, чтобы я мог искать, какие из них находятся на рынке?Должен ли я сделать структуру, содержащую данные из структуры клиентов?Я понятия не имею.Рад, что вы могли бы помочь мне.

Ответы [ 3 ]

0 голосов
/ 25 мая 2018

Первое, что приходит на ум, - это использовать какой-то направленный (или двунаправленный) список, содержащий ссылки на структуру вашего Клиента.Например,

typedef struct {
  Client *client;
  Visitor *next;
  Visitor *prev;
} Visitor;

может быть одним из узлов этого списка.В случае заголовка или конца списка можно указать значения NULL, чтобы различать разные угловые случаи, но это зависит от реализации.

Сам список:

typedef struct {
    Visitor *head;
    Visitor *tail;
} VisitorList;

Недостатоктакая структура состоит в том, что получение количества посетителей имеет линейную сложность, которая может быть не той, которую вы хотите.

0 голосов
/ 25 мая 2018

Ответ заключается в том, что есть много способов сделать это, с за и против каждого.Если вы заботитесь о производительности, и ваши данные становятся больше, чем сотни и в верхние тысячи, то вы, вероятно, начнете беспокоиться о том, какой тип структуры данных вы используете, и тогда возникает вопрос о структурах данных и о том, как вы будете искатьимена.Если вас не очень беспокоит производительность, вы можете перейти к реализации массива, в которой вы создадите массив Clients, например, так: он объявляет массив из 200 клиентов, которым вы можете присвоить значения.

Clients array[200];

Обратной стороной этого является то, что если вы получите Clients больше, чем выделено для памяти, вам потребуется либо malloc больше памяти, чтобы вместить его.

В качестве альтернативы вы можете пойти среализация связанного списка и создание своего рода struct, представляющего узел с соответствующими функциями для управления им.

typedef struct {
  Client *client;
  node *next;
  node *prev;
} node;

Но это потребует написания большего количества кода для добавления и удаления узлов как минимум.

Итак, это действительно вопрос того, что ВЫ хотите.

РЕДАКТИРОВАТЬ: Если вы просто хотите добавить способ узнать, если какой-то клиент находится на супер-рынке, почему бы не создать enum и добавить его вclient struct?Я предпочитаю это вместо bool, потому что тогда, если вы хотите поместить кого-то в другое место в будущем, тогда у вас есть возможность просто добавить его в enum.

enum place {
    supermarket,
    none
};
0 голосов
/ 25 мая 2018

Вы можете создать массив своих клиентов struct.

Вот некоторые ресурсы, которые я нашел.http://www.asic -world.com / scripting / structs_c.html http://www.c4learn.com/c-programming/c-array-structure/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...