C -Error en lista enlazada simple

Iniciado por Niber, 21 Mayo 2019, 13:50 PM

0 Miembros y 1 Visitante están viendo este tema.

Niber

Hola, estoy intentando hacer un lista enlazada simple, pero me da un error en ejecución cuando lee los datos. No se que he hecho mal. Podriais ayudarme? Gracias  :)
#include <stdio.h>
#include <stdlib.h>
//----ESTRUCTURAS-----
struct contacto{
char nombre[30];
int tlf;
};
struct agenda{
struct contacto datos;
struct agenda *next;
};

// ---FUNCIONES--
//int menu();
void addContacto(struct agenda *pinicio,struct agenda *pultimo);
void mostrarAgenda(struct agenda *pinicio);
// ***************************************************
void main()
{
struct agenda *pinicio,*pultimo;
pinicio=NULL;
pultimo=NULL;
int pos=0;
//for (pos=0;pos<3;pos++)
//{
addContacto(pinicio,pultimo);

//}
mostrarAgenda(pinicio);

}
//----------------------------------
void addContacto(struct agenda *pinicio,struct agenda *pultimo)
{
struct agenda *pnuevo=NULL
//Asignar memoria
pnuevo=(struct agenda *)malloc(sizeof(struct agenda));
if (pnuevo==NULL)
printf("\n No hay memoria");
else
{
printf("\n Nombre: ");
scanf(" %s",pnuevo->datos.nombre);
fflush(stdin);
printf("\n TLF: ");
    scanf("%d",pnuevo->datos.tlf);
fflush(stdin);
pnuevo->next=NULL;

if (pinicio==NULL)//Si lista vacia
{
pinicio=pnuevo;
pultimo=pnuevo;
}
else
{
pultimo->next=pnuevo;
pultimo=pnuevo;
}

}

}
//-----------------------
void mostrarAgenda(struct agenda *pinicio)
{
struct agenda *paux;
paux=pinicio;
do{
if (paux!=NULL)
{
printf("\n %s",paux->datos.nombre);
printf("\n %d",paux->datos.tlf);
paux=paux->next;
}

}while (paux->next!=NULL);
}

CalgaryCorpus

#1
Te sugiero esto:
- indica cual es el error que te da. Decir que "te da un error" no ayuda a ayudarte.
- En C, si quieres modificar una variable dentro de una funcion, tienes que pasar un puntero a esa variable y desreferenciar ese puntero al modificar el valor. Si no lo haces, y solo pasas la variable, estas modificando una copia.
- si lo que quieres modificar es un puntero, tienes que pasar la direccion de memoria de ese puntero y recibirla usando un puntero a puntero. Cuando corresponda modificarlo, desreferenciar el puntero a puntero tal como se hace en general (lo dicho en el punto anterior).
Aqui mi perfil en LinkedIn, invitame un cafe aqui

Niber

Efectivamente estaba haciendo mal, el paso de referencia de un puntero (entre otras cosas) Después de darle bastantes vueltas he conseguido que funcione. Gracias