«Перезаписать» связанные списки в C - PullRequest
0 голосов
/ 09 февраля 2019

Предпосылка: одна из необходимых функций в назначении - сортировка связанного списка.То, как я это сделал, вероятно, очень неэффективно, но это единственный способ, которым я знаю, как это сделать.

Вопрос: Если у меня есть один связанный список информации, как бы я (внутри функции) "перезаписать »информацию о переданном в связанном списке.

Код:

void sortPlaylist(Node **pList) {
    Node * pCur = (*pList);

    // Find size of list
    int size = sizeOfList(*pList);

    // Create a new Node, allocate the memory for a copy of the whole list
    Node * sortedList = NULL;

    // Create an array of the Records in our list
    Record * records;
    records = malloc(size * sizeof(Record));
    for (int i = 0; i < size; i++) {
        records[i] = pCur->record;
        pCur = pCur->pNext;
    }

    // Selection sort the records (it works with arrays, the code is long though)

    // Write the sorted records into a new list
    for (int i = 0; i < size; i++) {
        printf("\nAdding artist to new list %s\n\n", records[i].artist);
        insertFront(&sortedList, records[i]);
        printRecord(sortedList);
    }

    // ERROR HERE I THINK
    // Assign the sorted list to pList
    *pList = sortedList;

    // Free the sortedList
    free(sortedList);
}

Ошибка в том, как я назначаю отсортированный список обратно исходному списку, как я полагаю.Также я хотел бы знать, правильно ли там использовать free (sortedList), и это освободит всю память, включенную в sortedList, или просто указатель на него, и в этом случае я думаю, что я просто запускаю цикл forосвобождая весь список.

Спасибо

1 Ответ

0 голосов
/ 09 февраля 2019

Вызов free(sortedList) определенно является проблемой.Вы создали целый связанный список, задали pList, чтобы указать на него, а затем удалили заголовок.

Скорее всего, вы хотите освободить узлы в исходном списке, поскольку вы собираетесь дать вызывающему абоненту копии их в новом sortedList.

Кроме того, да,чтобы не утечь память, нужно пройтись по списку и освободить каждый узел.(Предполагая, что insertFront создает новые узлы).

...