2016-07-14 2 views
2

Я пытаюсь добавить Process -структуры в связанный список. Их определения заключаются в следующем.Добавление структуры к связанному списку в c

typedef struct { 
    char name[2]; 
    int duration; 
    int priority; 
    int arrival; 
} Process; 

typedef struct { 
    Process p; 
    struct LinklistNode* next; 
} LinklistNode; 

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

Process makeProcess(char nameIn[2], int durationIn, int priorityIn, int arrivalIn){ 
    Process p = (Process*) malloc(sizeof(Process)); //getting an error 
    p->name = nameIn; 
    p->duration = durationIn; 
    p->arrival = arrivalIn; 
    p->priority = priorityIn; 
} 

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

Мой код для создания связанного списка узла выглядит следующим образом:

LinklistNode* create_linklist_node(Process pIn) { 
    LinklistNode* node = (LinklistNode*) malloc(sizeof(LinklistNode)); 
    node->p = pIn; 
    node->next = NULL; 
    return node; 
} 

Для бита больше контекста я буду называть эти функции в main() где я лексемы строки из файла, который я нахожусь считывание из. Мне интересно, как создать структуру Process. Сейчас у меня есть следующее:

while(!feof(fPointer)){ 
    //the i counter is for the first line in the text file which I want to skip 
    while ((fgets(singleLine, 1500, fPointer) != NULL) && !(i == 0)){ 
     char *token = strtok (singleLine, delimit); 

     while(token != NULL){ 
      printf(" %s\n", token); 
      token = strtok(NULL, delimit); 



     } 

    } 
    i++; 
} 

Немного длинного вопроса, но любые ссылки или дополнительная информация всегда приветствуются. Дайте мне знать, если у вас есть дополнительные вопросы или вам нужна дополнительная информация о том, что я делаю, или почему я что-то делаю. Или, если вы можете найти пример чего-то подобного, это было бы очень признательно, поскольку мне пока не повезло.

Thanks

+0

В 'Process p = (Process *) malloc (...' переменная 'p' является структурой, а не указателем. Поэтому он не может принимать возвращаемое значение из 'malloc'. –

+1

Я не читал больше, но вижу, что вы используете 'feof', поэтому, пожалуйста, прочитайте [почему' feof' обычно ошибается] (http://stackoverflow.com/questions/5431941/why-is-while-feof- файл-всегда-неправильно). Просто зайдите в 'while (fgets (...)! = NULL)' –

+0

Что касается того, что сказал Weather Vane, вы должны объявить 'p' следующим образом:' Process * p = (Process *) malloc (sizeof (Process)); ' –

ответ

2

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

Process p = (Process*)malloc(sizeof(Process)); //getting an error 

, что вы должны делать

Process *p = malloc(sizeof(Process)); 

, потому что в отличие от new в некоторых других языках, таНос просто возвращает void *, (который в чистом C может быть автоматически преобразован в любой другой тип указателя объекта данных). Этот указатель хранит адрес памяти, выделенной для вашей структуры. Конечно, вам также придется вернуть указатель, изменив тип возвращаемого значения на Process*.

В соответствии с вашим первоначальным дизайном вам также необходимо будет сохранить Process* в списке-узле и, следовательно, передать его вашему методу строительства (LinklistNode* create_linklist_node(Process *pIn)).

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

Однако, учитывая размер вашего Process структуры, я хотел бы предложить что-то другое:

Поскольку у вас уже есть список ваших узлов, как это:

typedef struct{ 
    Process p; 
    struct LinklistNode* next; 
}LinklistNode; 

Вы бы выделить память для реального процесса struct внутри узла во время вызова до create_linklist_node. Затем вы можете просто передать в структуру Process, которая находится в стеке, и скопировать ее в список struct, который находится в куче памяти, выделенной вызовом create-call. В этом случае вам не нужно динамически выделять Process вообще, и проблемы с указателем в первой части становятся неактуальными.

LinkListNode *create_linklist_node(Process proc) 
{ 
    LinklistNode *p = malloc(sizeof *p); 
    if (p == NULL) 
    { 
     perror("Failed to allocate new node: "); 
     exit(EXIT_FAILURE); 
    } 
    p->p = proc; 
    p->next = NULL; 
    return p; 
} 

Вы бы тогда сделать что-то вроде этого:

Process proc = {{'a', 'b'}, 0, 0, 0}; 
LinklistNode *p = create_linklist_node(proc); 

Однако, это более распространено иметь метод, который непосредственно создает и вставляет узел в список, например, учитывая:

typedef struct { 
    LinklistNode *head; 
} Linklist; //doing this is kinda optional, using a simple pointer would do too 

можно вставить во главе списка, делая что-то вроде:

void insert (Linklist *list, Process ins) 
{ 
    LinklistNode *tmp = create_linklist_node(ins); 
    tmp->next = list->head; 
    list->head = tmp; 
} 
Смежные вопросы