Как мне реализовать связанный список с многоэлементной структурой? - PullRequest
2 голосов
/ 17 марта 2019

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

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

HIS1043.002 MH2.102   MWF   1:00-1:50pm     120 35.00
GEO1013.005 MB1.101   TR   12:30-1:45pm       5 35.00
MAT1214.003 MS1.02.03 TR    2:00-3:15pm       1 35.00
CS1713.002  NPB1.202  MWF   1:00-1:50pm       0 50.00
MAT3013.001 MS1.02.07 TR    2:00-3:15pm       1 35.00
ENG1023.001 MH2.202   MWF  10:00-10:50am     15 35.00

И вот две структуры typedef, которые я использую:

// Course Definition
typedef struct
{
    StudentNode *pWaitlistHead;    
    char szCourseId[12];  
    char szRoom[15];
    char szDays[15];
    char szTimes[15];  
    int  iAvailSeats; 
    double dFee; 
} Course;


// Node for course list
typedef struct CourseNode {
    struct CourseNode* pNext;
    Course course;
} CourseNode;

Вот функция, которая считывает данные из файла.Внутри функции я вызываю две другие функции: одну для выделения места для узла курса и одну для добавления данных в список.

int getCourses(Course courseM[])
{
    char szInputBuffer2[100];
    int i = 0;

    while(fgets(szInputBuffer2, 100, pFileCourses) != NULL)
    {
        sscanf(szInputBuffer2, "%12s  %15s %8s %15s %d %lf", 
                          courseM[i].szCourseId, courseM[i].szRoom, 
                          courseM[i].szDays, courseM[i].szTimes, 
                          &courseM[i].iAvailSeats, &courseM[i].dFee);
    }
    //allocate space for linked-list
    pNew = allocateNodeC(courseM); //???

    //add courses to linked list
    insertN2CourseList(&pHead, &pNew);  

    return i;
}

Мой вопрос касается того, как обрабатывать данные описания курса в реализации списка.Нужно ли обращаться к каждому элементу отдельно в распределении?А как насчет чтения всех данных из файла?

    //allocate space for CourseNode linked list
CourseNode *allocateNodeC(Course courseM[])
{
    CourseNode *pNew = malloc(sizeof(CourseNode));
    pNew->pNext = NULL;
    pNew->course.szCourseId = courseM[i].szCourseId; //?????
    pNew->course.szRoom = courseM[i].szRoom; //?????
    pNew->course.szDays = courseM[i].szDays; //?????
    pNew->course.szTimes = courseM[i].szTimes; //?????
    pNew->course.iAvailSeats = courseM[i].iAvailSeats; //?????
    pNew->course.dFee = courseM[i].dFee; //?????
    return pNew;
}
//add courses to linked list
CourseNode insertN2CourseList(CourseNode **ppHead, CourseNode *ppNew)
{
    CourseNode p*;
    if(*ppHead == NULL)
    {
        *ppHead = pNew;
        return;
    }
    for(p = *ppHead; p->pNext != NULL; p = p->pNext);
}

Ответы [ 3 ]

1 голос
/ 17 марта 2019

szCourseId, szRoom, szDays и szTimes имеют тип char [], который используется для хранения чтения строки из файла:

        sscanf(szInputBuffer2, "%12s  %15s %8s %15s %d %lf", 
                      courseM[i].szCourseId, courseM[i].szRoom, 
                      courseM[i].szDays, courseM[i].szTimes, 
                      &courseM[i].iAvailSeats, &courseM[i].dFee);

и в allocateNodeC() вы пытаетесь присвоить массиву:

    pNew->course.szCourseId = courseM[i].szCourseId; //?????
    pNew->course.szRoom = courseM[i].szRoom; //?????
    pNew->course.szDays = courseM[i].szDays; //?????
    pNew->course.szTimes = courseM[i].szTimes; //?????

В C массивы не назначаются. Вместо этого вы должны скопировать содержимое элементов courseM в новый созданный узел, используя strcpy(), например:

    strcpy (pNew->course.szCourseId, courseM[i].szCourseId);
    strcpy (pNew->course.szRoom, courseM[i].szRoom);
    strcpy (pNew->course.szDays, courseM[i].szDays);
    strcpy (pNew->course.szTimes, courseM[i].szTimes);

Кроме того, это не похоже на фактический код, потому что в функции allocateNodeC() нет объявления, если i и вы получаете доступ к courseM[i].

0 голосов
/ 20 марта 2019

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

CourseNode *allocateNode(Course course, CourseNode *pNext)
{
    CourseNode *pNew = malloc(sizeof(CourseNode));
    pNew->course = course;
    pNew->pNext = NULL;
}

И вот как я добавил данные из массива в связанный список:

void insertIntoList(CourseNode **ppHead, CourseNode *pNew)
{
    CourseNode *p;
    if(*ppHead == NULL) {
        *ppHead = pNew
        return;
    }

    for(p = *ppHead; p->pNext != NULL; p = p->pNext){
        //do nothing
    }
    p->pNext = pNew;
}

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

0 голосов
/ 17 марта 2019

Это один связанный список - то есть список, который указывает только в одном направлении (следующем), а не в обоих направлениях (следующий, предыдущий).

Использование --> для обозначения указателей и [...|next] для обозначения элемента в списке ...

Для пустого кейса у вас есть:

head --> NULL

После добавления одного предмета у вас есть:

head --> [1|next] --> NULL

После добавления второго элемента вы можете получить:

head --> [2|next] --> [1|next] --> NULL

или

head --> [1|next] --> [2|next] --> NULL

в зависимости от того, выполняли ли вы итерацию до конца списка (второй пример) или просто обновляли с помощью указателя заголовка (первый пример). Добавление других элементов работает так же, как и добавление второго элемента.

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