2016-04-18 3 views
0

У меня возникают трудности с использованием malloc для динамического выделения памяти при создании узлов связанных списков.C: malloc для связанного списка node (struct in struct)

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

typedef struct course { 
    char *name; 
    BST students; 
} Course; 

typedef struct courseNode { 
    Course data; 
    struct courseNode *next; 
} *CourseList; 

В CourseList структуры являются фактические связанный список узлов, в то время как Course Структуры содержат название курса и бинарное дерево поиска студентов поступил. Вы заметите, что структура Course находится внутри структуры CourseList.

Мне нужно создать новый узел CourseList, задав строку для использования в качестве поля name внутренней структуры курса, используя динамическое распределение в зависимости от длины строки. Я пробовал все комбинации mallocing внешних и внутренних структур на основе длины строки, но я не могу заставить строку name правильно скопировать во внутреннюю структуру. Я уверен, что есть простой ответ, но я не нахожу его.

+0

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

ответ

2

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

Это потому, что длина строки не изменяет способ размещения struct, который имеет фиксированный размер. Строка должна быть выделена отдельно, и назначается name члена data члена CourseList:

CourseList newNode = malloc(sizeof(*newNode)); 
newNode->data.name = malloc(strlen(name)+1); 
strcpy(newNode->data.name, name); 

Примечания звездочки перед newNode. Это связано с тем, что CourseList является типом указателя.

0

Ну, если вы действительно хотите, чтобы таНос на-структуру на основе длины строки:

/* Assuming newname is a const char * with the course name, 
    * course_head is the start of the linked, list, 
    * and students should be zero initialized */ 
    CourseList newNode = malloc(sizeof CourseList); 
    Course newCourse = malloc(sozeof(Course) + strlen(newname) + 1); 
    memset(newCourse->students, 0, sizeof(BST)); 
    newCourse->name = (char *)newCourse + sizeof(newCourse); 
    strcpy(newCourse->name, newname); 
    newNode->data = newCourse; 
    newNode->next = course_head; 
    course_head = newNode; 

Это помещает курс структуры в том же буфере памяти как имя курса.

Смежные вопросы