Добавление в начало связанного списка - PullRequest
3 голосов
/ 11 марта 2020
Student *addToHead(Student *node, int data) {
    Student *temp;
    temp = createNode(data);
    temp->nextPtr = node;
    return temp;
}

Этот код не вставляется в заголовок связного списка. Понятия не имею, почему. Я не использую фиктивный узел в начале связанного списка.

Вот моя основная функция:

int main(void) {
    Student *test = initList();
    int searchTest = 0;

    test = addToHead(test, 3);
    test = addToHead(test, 2);
    test = addToHead(test, 1);
    test = addToTail(test, 4);
    test = addToTail(test, 5);

    printList(test);

    searchTest = searchAge(test, 4);
    printf("%d\n", searchTest);

    test = freeList(test);
}

Вот что выводится:

4
5
0
Free was successful

Хвост вставляется правильно, но не голова.

Вот код для хвоста

Student *addToTail(Student *node, int data) {
    Student *temp;
    temp = createNode(data);
    temp->age = data;

    if (node == NULL) {
        node = temp;
    } else {
        while (node->nextPtr != NULL) {
            node = node->nextPtr;
        }
        node->nextPtr = temp;
    }
    return node;
}

Ответы [ 3 ]

6 голосов
/ 11 марта 2020

Проблема не в функции addToHead. Проблема в том, что функция addToTail не показана.

Она может выглядеть, например, следующим образом

Student *addToTail(Student *node, int data){
        Student *temp = createNode(data);

        if ( node == NULL )
        {
            temp->nextPtr = node;
            node = temp;
        }
        else
        {
            Student *tail = node;
            while ( tail->nextPtr != NULL ) tail = tail->nextPtr;
            // Uncomment the line below if createNode does not set the data member nextPtr to NULL
            // temp->nextPtr = NULL
            tail->nextPtr = temp;
        }

        return node;
}

Редактировать: После добавления вашего ответа с определением функции addToTail очевидно, что я был прав, говоря, что эта функция неправильная.

Внутри функции вы меняете головной узел

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

, который вы возвращаете из функция.

1 голос
/ 11 марта 2020

Как вы называете эту функцию? Вызывающий должен сделать, например,

head = addToHead(head, 3) 

.

0 голосов
/ 11 марта 2020

То, что вы хотите, больше похоже на

Student *addToHead(Student **head, int data) {
    Student *tmp = NULL;
    tmp = createNode(data);
    tmp->nextPtr = *head;
    *head = tmp;
    return tmp;
}

А затем назовите его с помощью

addToHead(&listHead, 42);

Или сохраните свою версию и назовите ее с помощью:

listHead = addToHead(listHead, 42);
...