【问题标题】:How do I implement a linked list with multi-element struct?如何实现具有多元素结构的链表?
【发布时间】:2019-08-07 16:56:04
【问题描述】:

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

我的程序读入的文本文件中有以下数据:

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);
}

【问题讨论】:

  • 您似乎在问如何实现链表,而不是如何“将数据从数组添加到列表”。列表不是 C 语言中的东西,也不是由标准库提供的,因此如何将项目添加到列表中完全取决于您的列表实现。由于您似乎尚未编写列表实现,因此您可能问错了问题。
  • 我正在使用链表并更新现有程序,因此我只包含了我所坚持的特定区域的一部分代码(也是更新的起点)。读入课程数据后,我现在需要将其添加到链表中,但我不太明白它是如何与数组一起工作的。
  • 很好的澄清,但现在很明显你的问题过于复杂了。您的问题似乎只是如何复制字符串的问题。在 C 中,字符串和数组不是一等数据类型,不能使用 = 运算符进行赋值。
  • allocateNodeC 应该采用单个 Course 对象指针,而不是整个数组。

标签: c arrays pointers struct linked-list


【解决方案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 中,数组不可赋值。相反,您应该使用strcpy()courseM 成员的内容复制到新创建的节点,如下所示:

    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]

【讨论】:

  • 感谢您的指点。这是实际代码,但正在更新中,目前还不完善。
【解决方案2】:

这是一个单链表——即只指向一个方向(下一个)而不是两个方向(下一个、上一个)的列表。

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

对于空箱,您有:

head --> NULL

添加单个项目后,您有:

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

添加第二项后,您可以拥有:

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

或:

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

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

【讨论】:

    【解决方案3】:

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

    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;
    }
    

    每个函数的调用都放置在一个循环中,该循环在每个课程描述被读入程序后增加,然后在进入下一个课程描述之前插入/添加到链表中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-23
      • 2011-10-25
      • 1970-01-01
      • 1970-01-01
      • 2022-12-04
      • 2019-10-19
      相关资源
      最近更新 更多