[英]How do I implement a linked list with multi-element struct?
經過幾個小時的閱讀,我想我可以澄清我的問題。 這是一個與作業相關的問題,但我正在尋求有關概念的幫助; 不是我的確切代碼的解決方案。 包含我的代碼用於可視化目的。
我在讀取到我的程序的文本文件中有以下數據:
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);
}
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
,數組不可分配。 相反,您應該使用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()
中沒有聲明 if i
並且您正在訪問courseM[i]
。
這是一個單鏈表——即只指向一個方向(下一個)而不是兩個方向(下一個、上一個)的列表。
使用-->
表示指針,使用[...|next]
表示列表中的項目...
對於空情況,您有:
head --> NULL
添加單個項目后,您有:
head --> [1|next] --> NULL
添加第二個項目后,您可以:
head --> [2|next] --> [1|next] --> NULL
或者:
head --> [1|next] --> [2|next] --> NULL
取決於您是迭代到列表的末尾(第二個示例),還是僅從頭指針更新(第一個示例)。 添加其他項目的工作方式與添加第二個項目的方式相同。
這是我為鏈接課程列表分配內存所需的操作:
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;
}
對每個函數的調用都被放置在一個循環內,在每個課程描述被讀入程序后,循環增加,然后在進入下一個課程描述之前插入/添加到鏈表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.