Почему эти фрагменты кода ведут себя по-разному? - PullRequest
0 голосов
/ 02 апреля 2019

Я относительно новичок в 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 Ответ

2 голосов
/ 02 апреля 2019
    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 s. Это как разница между этими двумя:

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...