tda - Eliminando el nodo de la lista vinculada por índice
tda lista (2)
Ahora que su sangrado ha sido reparado, señalaré el problema. Cuando elimina un nodo en la última condición, está configurando el next
campo para el nodo anterior como NULL
, en lugar de para el siguiente nodo.
Este es mi código para eliminar un nodo de una lista vinculada.
vec_store
contiene seq
y size
. La variable seq
contiene los vectores y un puntero.
Por alguna razón, el else if(i<s->size-1)
no funciona, que es la última condición.
¿Alguien puede resolver el problema? Por cierto, este es el código C.
void delete_vec(vec_store s, int i)
{
if (i<0 || s->size-1<i)
{
printf("Cannot delete vector because index %d is out of bounds/n",i);
}
else if (i==0)
{
node temp;
temp = s->seq;
s->seq = s->seq->next;
s->size--;
free(temp);
}
else if(i==s->size-1)
{
node temp1, temp2;
//temp1 = malloc(sizeof (node));
temp2 = malloc(sizeof (node));
temp1=s->seq;
if(temp1->next==NULL)
{
free(temp1);
s->seq=NULL;
s->size--;
printf("s->size-1/n");
}
else
{
while (temp1->next!=NULL)
{
temp2 = temp1;
temp1 = temp1->next;
}
free(temp1);
temp2->next=NULL;
s->size--;
printf("s->size-1 2/n");
}
}
else if(i<s->size-1)
{
node temp1,temp2;
int j;
temp1=s->seq;
temp2 = malloc(sizeof (struct node_record));
for(j=0;j<=i-1;j++)
{
temp2=temp1;
temp1 = temp1->next;
}
free(temp1);
temp2->next=NULL;
s->size--;
}
}
Este código es inalcanzable
if(temp1->next==NULL){
free(temp1);
s->seq=NULL;
s->size--;
printf("s->size-1/n");
}
... porque temp1
es el primer elemento de la lista, por lo que solo ocurriría si el primer elemento fuera también el último elemento, lo que implica que s->size
es 1, por lo que esto habría sido capturado por el anterior if (i==0)
caso
Esta asignación a temp2
(que ocurre en dos lugares) es falsa: el valor de temp2
se sobrescribe de todos modos, filtrando la memoria que asignó:
temp2 = malloc(sizeof (node));
Finalmente, cuál es probablemente el problema sobre el que está preguntando aquí (en el if(i<s->size-1)
):
free(temp1);
temp2->next=NULL;
Esto corta todo el final de la lista. Desea mantener la cola de la lista, como esta:
temp2->next = temp1->next;
free(temp1);
Por cierto, temp2
y temp2
son nombres de variables bastante poco inspiradores: ¿qué hay de previous
y current
o algo así? Además, el caso especial para if(i==s->size-1)
es completamente innecesario: debe manejarse bien con el código que tiene para el if(i<s->size-1)
.