为什么这些代码段的行为不同?

时间:2019-04-02 01:58:33

标签: c linked-list

我对C语言还比较陌生,一直在学习有关带指针的链表的信息。

我了解到 (*foo).bar是同一广告foo->bar。 使用foo->bar是因为它更具可读性。

因此,我不明白为什么这些代码段的行为不同:

1)

void appendCourse(CourseNode** pLL, Course c){
    CourseNode * root = *pLL;

    CourseNode* last = makeCourseNode(c);

    if(root != NULL){
        CourseNode node = *root;

        while(node.pNext != NULL){
            node = *node.pNext;
        }

        node.pNext = last;
    } else {
        *pLL = last;
    }  
}

2)

void appendCourse(CourseNode** pLL, Course c){
    CourseNode * root = *pLL;

    CourseNode* last = makeCourseNode(c);

    if(root != NULL){
        CourseNode *node = root;

        while(node->pNext != NULL){
            node = node->pNext;
        }

        node->pNext = last;
    } else {
        *pLL = last;
    }  
}
在我看来,

看起来像1)应该表现为先引用后再引用成员访问。有点像(*foo).bar

但是1)似乎根本无法正常工作,它只能成功添加第一个元素。

2)确实将所有元素添加到了链表中。

以防万一:我的结构和其他方法:

typedef struct CourseNode {
    struct CourseNode* pNext;
    Course course;
} CourseNode;

typedef struct
{
    StudentNode *pWaitlistHead;             // Waitlist for this course
    char szCourseId[12];                    // Course Identifier
    char szRoom[15];                        // Room number of the course
    char szDays[15];                         // What days the course will meet, ex: MWF, TR, etc
    char szTimes[15];                        // Meeting Time, ex: 10:00-11:15am
    int  iAvailSeats;                       // Number of available seats in the course
    double dFee;                            // Additional fees for the course
} Course;


CourseNode* makeCourseNode(Course c){
    CourseNode * node = malloc(sizeof(CourseNode));
    node->pNext = NULL;
    node->course = c;
    return node;
}

1 个答案:

答案 0 :(得分:2)

    CourseNode node = *root;

    while(node.pNext != NULL){
        node = *node.pNext;
    }

这将创建一个名为CourseNode的新node。该新CourseNode的值被修改,但是对链接列表没有影响。

    CourseNode *node = root;

    while(node->pNext != NULL){
        node = node->pNext;
    }

在这里,node指向链接列表上的CourseNode

了解差异的最简单方法是,第一个代码摘录创建新的CourseNode。就像这两者之间的区别:

int foo (int *i)
{
    int *j = i; // j is a pointer to the same int i points to
    *j = 2;     // this changes the value of the int i points to

    int j = *i; // this creates a new int
    j = 2;      // this changes the value of that new int
}