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.........
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.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; } }
Vi ringrazio in anticipo per l'eventuale dritta.
P.S. utilizzo xcode

Rispondi quotando