Ошибка памяти при использовании свободной функции для связанного списка - PullRequest
0 голосов
/ 18 июня 2019

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

Я попробовал следующую функцию, которая показана в начале кода.

Эта программа получаетколичество узлов в связанном списке и значение для каждого узла.Далее программа запрашивает количество поворотов (k) для списка и поворачивает список чисел k влево.Функция работает хорошо до освобождения памяти, которая была выделена.Ошибка происходит в свободной (временная) строка «Ошибка отладки HEAP CORRUPTION DETECTED».

#include <stdio.h>
#include <stdlib.h>

typedef struct IntNode
{
    int val;
    struct IntNode* next;
} IntNode;


void printList(IntNode* list);
void freeList(IntNode* head);
IntNode* createNode(int val);
void moveKPlaces(IntNode** list, int k);
int numNodes = 0;
int main(void)
{
    IntNode* list = NULL;
    IntNode* curr = list;
    IntNode* newNode = NULL;
    int i = 0, num = 0, k = 0;
    printf("How many nodes in list? ");
    scanf("%d", &numNodes);
    getchar();
    for (i = 0; i < numNodes; i++)
    {
        printf("Enter number: ");
        scanf("%d", &num);
        getchar();
        if (i == 0)//head of the list
        {
            newNode = createNode(num);
            list = newNode;
            curr = list;
        }
        else
        {
            while (curr->next != NULL)
            {
                curr = curr->next;
            }
            newNode = createNode(num);
            curr->next = newNode;
            newNode->next = NULL;
        }
    }
    printf("Choose a number k, and the list will be rotated k places to the left: ");
    scanf("%d", &k);
    getchar();
    printf("The rotated list:\n");
    moveKPlaces(&list, k);
    printList(list);
    freeList(list);
    getchar();
    return 0;
}

/*
    This function recieves a pointer to a pointer to the head of a list and
    a number (k) and rotate the list k places to the left.
    input:
    a pointer to a pointer to the head of a list and
    a number (k)
    output:
    none
*/
void moveKPlaces(IntNode** list, int k)
{
    IntNode* curr = *list;
    IntNode* last = NULL;
    IntNode* head = *list;
    int placeNode = 0;
    while (curr->next != NULL)
    {
        curr = curr->next;
    }
    curr->next = head;//turn it to a circular list
    while (placeNode < k)
    {
        curr = curr->next;
        placeNode++;
    }
    *list = curr->next;// the k node will be the head
    curr->next = NULL;// the one before will be the last

}
//************************************
// Method:    printList
// Returns:   void
// Description: prints list recursively
// Parameter: IntNode * list
//************************************
void printList(IntNode* list)
{
    if (list)
    {
        printf("%d  ", list->val);
        printList(list->next);
    }
    else
    {
        printf("\n");
    }
}


    void freeList(IntNode* head)
    {
        IntNode* temp = NULL;
        IntNode* curr = head;
        while (curr)
        {
            temp = curr;
            curr = (curr)->next;
            free(temp);
        }

        head = NULL;
    }
IntNode* createNode(int val)
{
    IntNode* newNode = (IntNode*)malloc(sizeof(newNode));//will alocate every person node dinamically
    newNode->val = val;
    // insert all details
    newNode->next = NULL;
    return newNode;
}

Ожидается освобождение без каких-либо ошибок "Отладочная ошибка ОБНАРУЖЕНА КОРРУПЦИЯ КАРТЫ".

1 Ответ

3 голосов
/ 18 июня 2019
IntNode* newNode = (IntNode*)malloc(sizeof(newNode));//will alocate every person node dinamically

Это не выделяет достаточно места.Это должно быть sizeof(*newNode) или sizeof(IntNode).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...