В моей реализации «Односвязный список» почему, даже если я выделил память для освобождаемого узла, указатель на узел не равен NULL? - PullRequest
0 голосов
/ 08 января 2019

Используя функцию delete_SLL, я хочу удалить заголовок этого односвязного списка (head = 4). Хотя я получаю правильный вывод, переменная struct Node * "temp", содержащая значение заголовка, не равна NULL. Что такого в переменной "temp", что свободной функции не нравится? Является ли температура узла не Malloc-ed при установке его равным заголовку списка?

Источник: удаление узла

Код:

#include <stdio.h>
#include <stdlib.h>
struct Node{
  int item;
  struct Node* next;
};

struct List{
  struct Node* head;
  struct Node* tail;
};

int SLL_empty(struct List* lst){
  return lst->head == NULL ;
}

//newLst work
struct List newLst(){
  struct List  lst;
  lst.head = NULL;
  lst.tail = NULL;
  return lst;
}


//Inserts a node to the front of the list[WORKS]
void insert_SLL(struct List* lst, int x){
  struct Node* nde = (struct Node*)malloc(sizeof(struct Node));
  nde->next = lst->head;
  nde->item = x;
  if (SLL_empty(lst))
    lst->tail=nde;
  lst->head = nde;
}


//Deletes a given Node
void delete_SLL(struct List* lst, int x){
  struct Node* temp =  (struct Node*)malloc(sizeof(struct Node));;
  temp = lst->head;
  struct Node* prev = NULL;`enter code here`

  //If the head has the key
  if (temp != NULL && temp->item == x){
    lst->head = temp->next;
    temp->next = NULL;
    free(temp);
  }

  // stops once the key is found
  while(temp != NULL && temp->item != x){
    prev = temp;
    temp= temp->next;
  }

  //If not in list
  if (temp == NULL) return;

  //If middle
  if (temp != NULL && temp->item == x){
    prev->next = temp->next;
    temp->next = NULL;
  }

  //if at the end
  if (temp != NULL && temp->item == lst->tail->item){
    lst->tail= prev;
    prev->next = NULL;
  }
  free(temp);
}

int SLL_pop(struct List *list){
 struct Node* nde = list->head;
 int item = nde->item;
  list->head = nde->next;
  free(nde);
  if (SLL_empty(list))
    list->tail = NULL;
  return item;
}

int main(int argc, const char * argv[]) {
  int i;
  struct List list = newLst();
  for (i = 0; i < 5; ++i)
   insert_SLL(&list, i);
//  printf("The length of the linkedLst is: %d\n",SLL_length(&list));

  delete_SLL(&list, 4);
  while ( list.head != NULL )
    printf("Node: %d\n", SLL_pop(&list));

  return 0;
}

1 Ответ

0 голосов
/ 08 января 2019

Основная цель free () - попросить ОС вернуть выделенную память системе. Возможно, вы не сможете «увидеть» это, но если вы попытаетесь получить доступ к какому-либо элементу в «temp» впоследствии, вы должны получить ошибку.

Пока «темп» в программе только переменная. C не требует и не может изменить данный указатель на NULL из-за смысла передачи по значению. Программист должен помнить, что этот указатель больше не действителен.
Или вы можете установить его в NULL вручную каждый раз, когда вы освобождаете указатель.

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