tipos tda simples simple operaciones listas lista fuente estructura enlazadas enlazada ejemplos doblemente datos con codigo c linked-list

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) .