создание односвязного списка с несколькими структурами в C

Привет, я пытаюсь создать программу ЕДИНОСвязный список, в которой есть 2 структуры.

Существует структура, которая содержит информацию о сотруднике; нравится

typedef struct{
    int ID; //Employee ID, randomly generated 4 digit integer
    char *firstName[25]; //Employee's first name
    char *lastName[35]; //Employess's last name
    char status; //AM/PM status, if valueof char:1=AM Employee,0=PM Employee
}EMPLOYEE;

Затем есть структура связанного списка, которая содержит структуру информации о сотруднике И ссылку на структуру связанного списка (я назвал ее далее); это выглядит так:

struct LinkedList{
    EMPLOYEE employee;
    struct LinkedList *next;
};

В функции main () мне нужно создать ДВА узла заголовка связанного списка, потому что у меня должно быть ДВА связанных списка, один для сотрудников AM и один для сотрудников PM, поэтому я сделал следующее:

void main() {
    struct LinkedList *AMHead = NULL; //I made this NULL for now, they will be allocated in create a LinkedListNode function.
    struct LinkedList *PMHead = NULL;
}

Так что сейчас у меня возникли трудности. Затем есть функция, которая создает узел связанного списка, у него не может быть параметров. Он будет использовать выделение памяти для создания узла, затем я запрошу пользователя информацию о сотруднике и инициализирую часть структуры сотрудника узла связанного списка с данной информацией. Затем я установлю следующий указатель на NULL и верну указатель на этот новый узел. Вот что я написал до сих пор:

void createLinkedListNode(){
    struct LList *node = (struct LList)*malloc(sizeof(struct LList)); 
    //node created by allocating memory to struct


    //prompt for all info required in employee struct
    printf("Enter ID:\n");
    printf("Enter first name:\n");
    printf("Enter last name:\n");
    printf("Enter status:\n");
};

Итак, мои вопросы: нужно ли мне создавать 2 узла? Один для списка AM, а другой для списка PM, или я могу использовать один и тот же узел для обоих. А затем как мне инициализировать структуру сотрудника и сохранить прочитанную информацию. И правильно ли я создал структуры и головные узлы, потому что у меня есть 2 связанных списка в программе односвязных списков. Что-нибудь, что я должен исправить, или как-нибудь сделать код лучше?


person user2188315    schedule 13.04.2015    source источник
comment
мне нужно создать 2 узла. Вам необходимо уточнить свой вопрос. Как бы то ни было, ответ зависит от обстоятельств. Это зависит от того, как используются списки AM и PM. Это зависит от того, смогут ли сотрудники перейти с утра до вечера. Это зависит от того, каким образом сотрудник определен как AM или PM. и т. д. Нет правила, которое гласит, что у вас должен быть один список, и нет правила, которое гласит, что вам нужно иметь два. Это зависит от контекста.   -  person kaylum    schedule 13.04.2015
comment
Да, сотрудникам разрешено переходить с утра до вечера, они определяются на основе присвоенного им значения char.   -  person user2188315    schedule 13.04.2015
comment
В этом случае, вероятно, создайте один узел и поместите его в соответствующий список. Когда статус изменится, переместите его. Обратите внимание, что это не единственный правильный способ делать что-то. Например, вы можете просто поместить всех сотрудников в один список, а затем читать статус каждый раз, когда вам нужно работать с сотрудником. Я не говорю, что это лучший или даже правильный способ сделать это. Дело в том, что на ваш вопрос действительно нет правильного ответа. Чтобы определить компромиссы, необходимо рассмотреть всю проблему в целом, и только тогда есть шанс сделать обдуманный выбор дизайна.   -  person kaylum    schedule 13.04.2015
comment
используйте fgets для чтения ввода, что-то вроде fgets(node->firstName, sizeof(node->firstName), stdin); Упростите и используйте только одно из EMPLOYEE и LList   -  person Ôrel    schedule 13.04.2015


Ответы (1)


Кстати, я также практикую односвязный список сейчас. Позвольте мне попытаться ответить, основываясь на том, что я понял из вашего вопроса и что, как мне кажется, я узнал до сих пор.

Вы спросили: «Мне нужно создать два узла?» Я предполагаю, что ваш вопрос был: "Могу ли я создать два связанных списка?"

Если сотрудников больше двух, вам придется создать более двух узлов. Без вариантов.

Однако, если вы имели в виду «Могу ли я создать два связанных списка?». Ответ - нет, если список AM и список PM идентичны. Если список AM и список PM идентичны, то да, вы можете использовать только ОДИН список.

Однако, если списки AM и PM не идентичны, вам необходимо использовать два списка. Поскольку, поскольку ваш связанный список является односвязным списком, у него не может быть двух следующих указателей, что является проблемой. Поскольку любой узел в вашем списке может указывать только на ОДИН другой узел (или NULL), этот единственный узел не может указывать на другой узел в зависимости от того, считаете ли вы, что узел находится в AM или PM.

Например: это означает, что вы не можете заставить узел, указывающий на узел с employee.id == 25 в списке AM, указывать на узел с employee.id == 30 в списке PM. Итак, я думаю, вам понадобится два списка в этом случае.

Итак, вы видите, это зависит от обстоятельств. Думаю, как по природе ваших списков, так и по узлам.

Чтобы инициализировать структуру сотрудников и сохранить информацию, прочтите:

После того, как вы выделили память для нового узла с помощью следующей инструкции:

struct LList *node = malloc(sizeof(struct LList)); 

Затем вы можете использовать оператор -> для сохранения данных в узле.

Например, чтобы сохранить ID:

int id;
printf("Enter ID:\n");
scanf("%d",&id)
node->ID = id;

Точно так же вы можете хранить другие данные (фамилию, имя) с помощью оператора ->.

Что касается правильности, я вижу одну проблему.

Вы определили узел как:

struct LinkedList{
EMPLOYEE employee;
struct LinkedList *next;
};

Однако вы создали узел с:

struct LList *node = (struct LList)*malloc(sizeof(struct LList)); 

Однако структуры LList нет. Вам нужно изменить это на:

struct LinkedList *node = malloc(sizeof(struct LinkedList)); 

Я не думаю, что приведение типов необходимо для malloc ().

Возможно, я допустил ошибки в этом анализе, поэтому, пожалуйста, оставьте комментарий или отредактируйте ответ, если есть какие-либо ошибки выше.

person sps    schedule 13.04.2015