Удалять узел списка, вдвойне соединенного в C

у меня есть проблема, удалив узел списка, вдвойне соединенного в c. Осуществите функцию для этого и кроме того вышеупомянутая функция должна возвращать удаленную информацию. Код находится далее:

void * popCurrent(DoublyLinkedList * list) 
{  
    void *data;
    Node *aux;
    data = calloc(1, sizeof(void *));

    if ( data == NULL ) exit(EXIT_FAILURE);

    // Verificar si la lista está vacía
    if ( !(list -> head && list -> head -> data) )
        return NULL;
    else
    {
        data = list -> current -> data;
        aux = list -> current;
    }
    // Verificar si el current se encuentra en head    
    if ( list -> current == list -> head )
        list -> head = list -> current -> next;
    // Verificar si el current se encuentra en la cola de la lista    
    if ( list -> current -> next != NULL )
        list -> current -> next -> prev = list -> current -> prev;
    // Verificar si el current no de encuentra en head    
    if ( list -> current -> prev != NULL )
        list -> current -> prev -> next = list -> current -> next;

    free(aux);
    return data;
}

В момент составления, он удаляет мне все узлы начиная с current (указателя настоящего (узла) списка).

LISTA ORIGINAL
1 2 3 4 5 6 7 8 9
10 9 8 7 6 5 4 3 2 1 

RESULTADO ESPERADO:
Dato del nodo eliminado: 10
1 2 3 4 5 6 7 8 9
9 8 7 6 5 4 3 2 1

RESULTADO FINAL:
Dato del nodo eliminado: 10
1 2 3 4 5 6 7 8 9

Из-за, возможно это структуры, которые я использовал:

typedef struct Node Node;

typedef struct DoublyLinkedList DoublyLinkedList;

struct Node {
    void * data; // Puntero al dato
    Node * next; // Puntero al siguiente Node
    Node * prev; // Puntero al Node previo
};

struct DoublyLinkedList {
    Node * head; // Puntero al primer elemento
    Node * tail; // Puntero al ultimo elemento
    Node * current; // Puntero para poder recorrer la lista
};

Если кто-то может помогать мне решать это сомнение, он ему был бы благодарен за это. Привет

2
задан 16.03.2019, 20:12
1 ответ

Чтобы удалять узел списка вдвойне соединенная, только ты должен получать предыдущий узел и следующего за тем, которого ты хочешь удалить, я не увидел ты implementaciГіn оригинал, но можешь вести тебя с этим фрагментом cГіdigo:

void *popCurrent(DoublyLinkedList *list) {
  // Verificamos si la lista está vacía
  if (!(list && list->head && list->current))
    return NULL;

  Node *curr = list->current;  // Nodo "actual", el que será eliminado.
  Node *last = curr->prev;     // Nodo anterior al actual.
  Node *next = curr->next;     // Nodo siguiente al actual.
  void *data = curr->data;

  // Verificamos que el actual sea la cabeza (aka head):
  if (list->current == list->head) {
    list->current = next;
    list->head = next;          // Recuerda asignar la nueva cabeza y el nuevo nodo "actual"
    list->current->prev = NULL; // Recuerda eliminar la cabeza anterior.
  }
  // Si no es la cabeza, entonces o es la cola, o es algo del medio.
  else {
    list->current = next;
    if (next) // Sin esto, "next" puede ser NULL (cola) y causar segfault.
      next->prev = last;  
  }
  free(curr); // Luego de aislar este nodo, podemos eliminarlo.
  return data;
}

BГЎsicamente, каждый раз, когда ты будешь удалять узел списка вдвойне соединенная, ты должен налаживать предыдущий узел для того, чтобы Ваш "следующий" узел был следующим настоящего узла, равного изюма с предыдущим следующего узла, должен способствовать тому, чтобы он обозначился к предыдущему, немного как это изображение, если не понятно то, что я хочу сказать (Он игнорирует мои удивительные полномочия excel):

Super poderes para dibujar

Замечает: Сделав calloc estГЎs размещая память dinГЎmica для переменной data, потом sobreescribes data теряя байт, которые ты разместил, если ты хочешь достать дату, только ты нуждаешься в том, чтобы распределить стоимость однажды, как появляется в cГіdigo, который я поместил тебе mГЎs наверху.

типов Привета!

3
ответ дан 02.12.2019, 05:34

Теги

Похожие вопросы