簡體   English   中英

如何使用多元素結構實現鏈表?

[英]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);
}

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()中沒有聲明 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM