Как освободить указатель без разрыва списка? - PullRequest
0 голосов
/ 08 июня 2019

Итак, я только что закодировал сортировку вставкой, чтобы отсортировать связанный список (с фиктивной ячейкой).

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

Итак, чтобы избежать освобождения моей ячейки, сначала я указываю де указатель на NULL, но вот мой вопрос: разве он не должен был освободить только указатель, а не мою ячейку, если я не указал NULL?

Вот моя функция

void 
insertSort(cel *lst){
    cel *temp = NULL;
    cel *ordenado = lst->prox;

    while(ordenado){
        cel *valorOrdenando = ordenado->prox;

        // removendo o valorOrdenado da lista
        ordenado->prox = valorOrdenando->prox;

        for (cel* i = lst; i != ordenado->prox; i = i->prox)
        {
            if (valorOrdenando->valor <= (i->prox)->valor || i->prox == ordenado->prox){
                temp = i->prox;
                i->prox = valorOrdenando;
                valorOrdenando->prox = temp;

                break;
            }
        }
        ordenado = ordenado->prox;

    }
    // and here is where I point to NULL, otherwise I lost a cell
    temp = NULL;
    free(temp);
}

Вот другая часть кода:

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



struct cel {
    int valor;
    struct cel *prox;
}typedef cel;


void inserir (cel **lista, int x) {
    cel *temp = NULL, *aux = *lista;

    temp = malloc(sizeof(cel));
    temp->valor = x;
    temp->prox = NULL;


    if (*lista == NULL)
      *lista = temp;
    else {
      for (; aux->prox != NULL; aux = aux->prox);
      aux->prox = temp;
    }
 }

 void imprimir(cel *lista) {
    for (cel *aux = lista; aux != NULL; aux = aux->prox)
        printf("%d ,", aux->valor);
    printf("\n");
}

int main(){
    cel *list = NULL;

    inserir(&list, 3);
    inserir(&list, 2);
    inserir(&list, 1);
    inserir(&list, 8);
    inserir(&list, 6);
        insertSort(list);
        //bubbleSort(list->prox);
    imprimir(list->prox);
    return 0;
}

Как мне написать код, чтобы мне не нужно было *temp = NULL и почему это происходит в настоящее время?

1 Ответ

1 голос
/ 08 июня 2019

У вас неправильное представление о том, как работают указатели в C. Когда вы объявляете указатель, это похоже на объявление любой другой переменной.Если вы объявите указатель локально (внутри функции, без модификатора, такого как static), то занимаемая им позиция в памяти будет обрабатываться нижними уровнями, которые абстрагируется от языка C.Одной из распространенных реализаций является использование стека, когда вы объявляете переменную локально, она будет помещена в стек при вызове функции и будет вытолкнута из стека после того, как функция вернется, поэтому вам не нужно беспокоиться об освобождении вашейpointers.

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

Когда вы сделали:

temp = NULL;
free(temp);

Вы пытались освободить позицию памяти NULL, что не имеет смысла.Таким образом, вы освободите память только тогда, когда она вам больше не нужна.

Я предлагаю вам поискать больше о переменных и указателях на языке C, эта ссылка может вам помочь: введите описание ссылки здесь

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