如何释放指针而不中断列表?

时间:2019-06-08 12:49:54

标签: c linked-list

所以,我刚刚编码了一个插入排序来对链接列表(带有哑单元)进行排序。

它工作得很好,但是在代码的结尾,如果我在用作辅助的指针中使用free(),那么它也是一个单元格(循环中最后一个it指针)也是免费的。

因此,为了避免释放单元格,首先我将指针指向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 个答案:

答案 0 :(得分:1)

您对指针在C中的工作方式有一个误解。声明指针时,就像声明任何其他变量一样。 如果您在本地声明一个指针(在函数内部,而没有诸如静态的修饰符),则它所占据的内存位置将由C语言为您抽象的较低层处理。一种常见的实现方式是使用堆栈,当您在本地声明变量时,将在调用函数时将其压入堆栈,并在函数返回后将其弹出堆栈,因此无需担心释放您的代码。指针。

但是,指针指向某个内存位置,当您使用malloc之类的函数时,它将为您分配一个空闲内存块,并且指针指向该块的第一个位置。现在,该块将仅在您释放时返回到空闲块列表。因此,一旦使用完该内存位置,就应该释放它。

当您这样做时:

temp = NULL;
free(temp);

您试图释放NULL内存位置,这没有任何意义。 因此,一旦不再需要它,您将只释放它。

我建议您搜索更多有关C语言中的变量和指针的信息,此链接可能会帮助您: enter link description here