经过几个小时的阅读,我认为我可以澄清我的问题。这是一个与作业相关的问题,但我正在寻求有关概念的帮助;不是我确切代码的解决方案。包含我的代码是出于可视化目的。
我在读入程序的文本文件中包含以下数据:
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);
}
答案 0 :(得分:1)
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]
。
答案 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;
}
对每个函数的调用放置在循环中,在将每个课程说明读入程序后,循环数量增加,然后插入/添加到链接列表中,然后转到下一个课程说明。