如何实现具有多元素结构的链表?

时间:2019-03-16 23:18:07

标签: c arrays pointers struct linked-list

经过几个小时的阅读,我认为我可以澄清我的问题。这是一个与作业相关的问题,但我正在寻求有关概念的帮助;不是我确切代码的解决方案。包含我的代码是出于可视化目的。

我在读入程序的文本文件中包含以下数据:

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 个答案:

答案 0 :(得分:1)

szCourseIdszRoomszDaysszTimes的类型为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中,数组不可分配。相反,您应该使用courseMstrcpy()成员的内容复制到新创建的节点,如下所示:

    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]

答案 1 :(得分:0)

这是一个链接列表-即仅指向一个方向(下一个)而不是两个方向(下一个,上一个)的列表。

使用-->指示指针,使用[...|next]指示列表中的项目...

对于空箱,您有:

head --> NULL

添加单个项目后,您将拥有:

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

添加第二项后,您可以选择以下任一项:

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

或:

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

取决于您是迭代到列表的末尾(第二个示例),还是只是从头指针进行更新(第一个示例)。添加其他项目的方式与添加第二个项目的方式相同。

答案 2 :(得分:0)

这是我需要为链接的课程列表分配内存的步骤:

>>> from itertools import combinations
>>> list1 = ["a", "b", "c", "d"]
>>> list2 = [1, 2, 3]
>>> [[*x, *y] for x in combinations(list1, 3) for y in combinations(list2, 2)]
[['a', 'b', 'c', 1, 2], ['a', 'b', 'c', 1, 3], ['a', 'b', 'c', 2, 3], ['a', 'b', 'd', 1, 2], ['a', 'b', 'd', 1, 3], ['a', 'b', 'd', 2, 3], ['a', 'c', 'd', 1, 2], ['a', 'c', 'd', 1, 3], ['a', 'c', 'd', 2, 3], ['b', 'c', 'd', 1, 2], ['b', 'c', 'd', 1, 3], ['b', 'c', 'd', 2, 3]]

这是我将数组中的数据添加到链接列表中的方式:

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

对每个函数的调用放置在循环中,在将每个课程说明读入程序后,循环数量增加,然后插入/添加到链接列表中,然后转到下一个课程说明。