у меня есть проблема, удалив узел списка, вдвойне соединенного в 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
};
Если кто-то может помогать мне решать это сомнение, он ему был бы благодарен за это. Привет
Чтобы удалять узел списка вдвойне соединенная, только ты должен получать предыдущий узел и следующего за тем, которого ты хочешь удалить, я не увидел ты 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):
Замечает: Сделав calloc
estГЎs размещая память dinГЎmica для переменной data
, потом sobreescribes data
теряя байт, которые ты разместил, если ты хочешь достать дату, только ты нуждаешься в том, чтобы распределить стоимость однажды, как появляется в cГіdigo, который я поместил тебе mГЎs наверху.
типов Привета!