Ciao a tutti, è la prima volta che scrivo qui, vi prego di perdonare eventuali errori di forma.
Sto cercando di scrivere un codice per esercitarmi sulle liste dove il campo nodo è di tipo struct. Nello stesso tempo mi esercito ad utilizzare le funzioni e chiaramente usandole senza averne la completa padronanza mi complico la vita. Sono riuscito a scrivere il codice che ora vi posto (anche con l'aiuto della vostra guida in linea) in cui inserisco tramite la funzione ins_elem (che contiene la funzione ins_contact) i vari contatti nella lista, ma quando scelgo di visualizzali tramite la funzione visualizza, mi stampa il numero giusto degli elementi inseriti ma contenenti tutti i dati dell'ultimo contatto dato in input.
Inserendo i contatti tengo fermo in testa il puntatore p e faccio scorrere il puntatore punt;
stampando i contatti faccio scorrere il puntatore p che avevo lasciato in testa ma.........
codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//dichiaro la struttura di ogni contatto della rubrica++++++++++++++++++++++++++
struct contatti {
char nome[30];
char cog[30];
char tel[20];
}cont;
//dichiaro la struttura della lista+++++++++++++++++++++++++++++++++++++++++++++
struct elemento {
struct contatti *contatto; //1 campo costituito dal contatto (struttura completa)
struct elemento *pun; //2 campo costituito da un puntatore che punta alla successiva struct elemento
};
//dichiaro il prototipo della funzione di inserimento dei campi del contatto+++++++++++++++++++
struct contatti *ins_contact();
//dichiaro la funzione di formazione del primo elemento lista completo dei 2 campi (contatti e puntatore)
struct elemento *ins_elem();
//dichiaro la funzione di visualizzazione dei contatti
void visualizza(struct elemento*);
int main(int argc, const char * argv[])
{
struct elemento *lista;//dichiarazione della lista (sempre un puntatore )
lista=ins_elem(); //ora la creo
char risp[2];
printf("\nVuoi stampare la lista degli elementi? ");
scanf("%s",risp);
if (strcmp(risp,"s")==0) {
visualizza(lista);
}else {
printf("\nCiao");
}
return 0;
}
//funzione ins-elem++++++++++++++++++++++
struct elemento *ins_elem() {
struct elemento *p,*punt;
int n,i;
printf("quanti elementi vuoi inserire in rubrica? ");
scanf("%d",&n);
if (n==0) {
p=NULL;
}else {
//inserimento primo contatto+++++++++++++++++++++++++++++++++++++++++++++++++++++++
p=(struct elemento*)malloc(sizeof(struct elemento));
printf("\nInserisci il primo elemento\n");
ins_contact();
p->contatto=&cont;
punt=p;//associo il puntatore che scorrerà la lista
//creo gli altri elementi+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
for (i=2; i<=n; i++) {
punt->pun=(struct elemento*)malloc(sizeof(struct elemento));//creo l'altro elemento
punt=punt->pun;
printf("\nInserisci il %d elemento\n ",i);
ins_contact();
punt->contatto=&cont;
}
punt->pun=NULL;
}
return p;
}
struct contatti *ins_contact() {
printf("\nInserisci il cognome: ");
scanf("%s",cont.cog);
printf("\nInserisci il nome : ");
scanf("%s",cont.nome);
printf("\nInserisci il tel : ");
scanf("%s",cont.tel);
return &cont;
}
void visualizza(struct elemento *p) {
while (p!=NULL) {
printf("\n %s %s %s ",p->contatto->cog,p->contatto->nome,p->contatto->tel);
p=p->pun;
}
}
ho scritto un codice uguale con il nodo tipo int (studiato sulla vostra guida in linea) e gira benissimo, qui non riesco a capire dove sbaglio: deve esserci un errore nell'inserimento ma non riesco a trovarlo.
Vi ringrazio in anticipo per l'eventuale dritta.
P.S. utilizzo xcode