Ejecuta tu codigo en el depurador, y veras que hay cosas que no funcionan.
Ya se que no debo hacerlo, pero te cuelgo un codigo completo de tal como resolveria la lista (no es la unica forma ni la mas eficiente, pero puedes sacar ideas); debajo te comento un par de cosas (de todas formas he comentado las lineas mas interesantes del codigo):
Código C:
Ver original#include <stdio.h>
void fflush_stdin() {
char c;
while((c
= getchar()) != EOF
&& c
!= '\n'); }
int main() {
int *lista, *temporal, contador, input, q;
size_t szmem;
lista = 0;
contador = 0;
//bucle infinito
while(1) {
//añadir elemento
printf("Quieres añadir un elemento? (s/n)"); break;
}
//recupera input de usuario
printf("Dime el valor para la posicion %d:" , contador
); fflush_stdin();
//determina nueva posicion y tamaño de la lista
contador++;
szmem = sizeof(int) * contador;
//reserva memoria
if(!lista) {
//nueva lista
if(!(lista
= malloc(szmem
))) { //memoria insuficiente
break;
}
}
else {
//expande lista existente
if(!(temporal
= realloc(lista
, szmem
))) { //memoria insuficiente
break;
}
//restablece lista
lista = temporal;
}
//asigna valor
*(lista + contador - 1) = input;
//valor insertado
//printf("%d=>%d\n", contador, *(lista + contador - 1));
}
//final
if(lista) {
//volcar lista
for(q = 0; q < contador; q++) {
printf("%d=>%d\n", q
, *(lista
+ q
)); }
//libera memoria
}
return 0;
}
Observa la linea del realloc: esta funcion en caso de exito retorna la nueva posicion del bloque de memoria, y retorna nulo en caso de error. Eso significa que en caso de exito la linea que tienes en tu codigo provocará una violacion de segmento en el siguiente acceso a la lista:
Código C:
Ver original//esto es parte de tu codigo, linea 24
En caso de exito el bloque previo de lista será movido a otra posicion para albergar la nueva memoria solicitada, es decir que la posicion previa de lista ya no está disponible, y los siguientes intentos de acceso a 'lista' provocan el segfault. Se soluciona tal como te dejo en el ejemplo: asignar el retorno a una variable temporal sobre la que vas a hacer las comprovaciones. Si asignas el retorno de realoc a la misma variable, en caso de error no podras recuperar el bloque previo y provocaras una perdida de memoria, por eso se usa una variable temporal intermediaria.
De forma parecida tienes que escanear el nuevo valor en una variable auxiliar, en vez de directamente en la posicion de memoria. De esta forma puedes hacer comprovaciones y decidir si ese valor es valido para la lista.
Revisa este ejemplo y compara con el codigo que colgaste, si hay algo (una duda o un error por mi parte) ya sabes que puedes comentarlo aqui mismo ;)
Espero que te sea de ayuda.
Saludos
vosk
p.s. una ultima observacion:
Código C:
Ver original//parte de tu codigo, linea 18
printf("\nElemento %d de la lista enlazada y preciona...
'preciona' va con 's' :), saludos