PDA

Visualizza la versione completa : [C] Liste linkate e stampa di simboli indesiderati


nicone 91
11-02-2011, 20:45
buonasera a tutti scusate il disturbo ma ho un problema con questo programma


#include <stdio.h>
#include <iostream>
#include <string.h>
#include <stdlib.h>
typedef struct{
char Nome[30];
char Cognome[30];
char Tel[30];
char Indirizzopaginaweb[50];
char Indirizzoemail[50];
} Contatto;

struct elemento{
Contatto inf;
struct elemento *pun;
};


void visualizzaContatto(struct elemento* p){
if (p == NULL){
printf (" # VISUALIZZA CONTATTO #\n");
printf (" Nessun contatto presente\n");
} else {
printf (" # VISUALIZZA CONTATTO #\n");
printf (" NOME > %s\n", p->inf.Nome);
printf (" COGNOME > %s\n", p->inf.Cognome);
printf (" TELEFONO > %s\n", p->inf.Tel);
printf (" SITOWEB > %s\n", p->inf.Indirizzopaginaweb);
printf (" EMAIL > %s\n", p->inf.Indirizzoemail);
}
while (p != NULL){
printf (" # VISUALIZZA CONTATTO #\n");
printf (" NOME > %s\n", p->inf.Nome);
printf (" COGNOME > %s\n", p->inf.Cognome);
printf (" TELEFONO > %s\n", p->inf.Tel);
printf (" SITOWEB > %s\n", p->inf.Indirizzopaginaweb);
printf (" EMAIL > %s\n", p->inf.Indirizzoemail);
p = p->pun;
system("PAUSE");
}

}

struct elemento *aggiungiContatto(struct elemento *p){
printf (" # AGGIUNGI CONTATTO #\n");
char nome[50];
char cognome[50];
char telefono[30];
char email[100];
char sitoweb[200];
Contatto daInserire;
struct elemento *punt;

punt = (struct elemento *)malloc(sizeof(struct elemento));
p = (struct elemento *)malloc(sizeof(struct elemento));

printf (" NOME > ");
scanf ("%s", nome);
strcpy(daInserire.Nome, nome);
printf (" COGNOME > ");
scanf ("%s", cognome);
strcpy(daInserire.Cognome, cognome);
printf (" TELEFONO > ");
scanf ("%s", telefono);
strcpy(daInserire.Tel, telefono);
printf (" SITOWEB > ");
scanf ("%s", sitoweb);
strcpy(daInserire.Indirizzopaginaweb, sitoweb);
printf (" EMAIL > ");
scanf ("%s", email);
strcpy(daInserire.Indirizzoemail, email);

if(p != NULL){
punt->inf = daInserire;
punt->pun = p;
} else {
p->inf = daInserire;
p->pun = NULL;
punt = p;
}
return(punt);
}



struct elemento *rimuoviContatto(struct elemento *p){
struct elemento *aus;
struct elemento *twin = p;
int subscelta;
int i=1;
int n=1;
printf (" # RIMUOVI CONTATTO #\n");
while (p != NULL){
printf ("%i) \t %s \t %s\n", i, p->inf.Nome, p->inf.Cognome);
p = p->pun;
i++;
}
p = twin;
printf("\n\n Inserisci il numero del contatto che vuoi rimuovere: ");
scanf("%i", &subscelta);
if (subscelta < i){
if(p == NULL)
return 0;

if(p->pun != NULL){
aus=p;
n++;
while(n != i){
if(subscelta == n){
aus->pun=aus->pun->pun;
} else {
aus=aus->pun;
}
n++;
}}


if(subscelta == 1){
p=p->pun;
}}
twin = p;
return twin;
}

bool cerca(struct elemento* p,char *c) {
struct elemento *punt=p;
bool trovato=false;
while((punt!=NULL) && (!trovato)) {
if(strcmp(c,punt->inf.Cognome)==0)
trovato=true;
else
punt=punt->pun;
}
return(trovato);
}

void *leggiValore(struct elemento* p,char *c){
struct elemento *punt=p;
bool trovato=false;
while((punt!=NULL) && (!trovato)) {
if(strcmp(c,punt->inf.Cognome)==0)
trovato=true;
else
punt=punt->pun;
}
printf("il valore relativo al contenuto inserito e':\n");
printf (" NOME > %s\n", punt->inf.Nome);
printf (" COGNOME > %s\n", punt->inf.Cognome);
printf (" TELEFONO > %s\n", punt->inf.Tel);
printf (" SITOWEB > %s\n", punt->inf.Indirizzopaginaweb);
printf (" EMAIL > %s\n", punt->inf.Indirizzoemail);
system("PAUSE");
}

void leggi(struct elemento* p,char *c){
if (cerca(p,c)==true)
leggiValore(p,c);
else{
printf("\n\nERRORE: il valore collegato al contenuto inserito NON ESISTE\n");
system("PAUSE");
}}

void Cancella(struct elemento* p){
struct elemento *aux;
while (NULL != p){
aux = p;
p = p->pun;
free(aux);
}}

int main(){
int scelta;
struct elemento *lista = NULL;
char c[50];

do{
printf (" 1) VISUALIZZA CONTATTO\n\n");
printf (" 2) AGGIUNGI CONTATTO\n\n");
printf (" 3) RIMUOVI CONTATTO\n\n");
printf (" 4) CERCA CONTATTO\n\n");
printf (" 5) ELIMINA TUTTA LA RUBRICA\n\n");
printf (" 6) ESCI\n\n\n\n");
printf (" la tua scelta > ");
scanf("%d",&scelta);
system("CLS");
switch(scelta){
case 1:{
visualizzaContatto(lista);
break;
}
case 2:{
lista = aggiungiContatto(lista);
break;
}
case 3:{
lista = rimuoviContatto(lista);
break;
}
case 4:{
printf("Inserisci il cognome che vuoi leggere: \n");
scanf("%s", c);
leggi(lista,c);
break;
}
case 5:{
Cancella(lista);
lista=NULL;
break;
}
system("PAUSE");
system("CLS");
}}while(scelta!=6);
return 0;
}



compilate il programma e se potete dammi qualche consiglio ve ne sarei grato
grazie in anticipo

Celebron
11-02-2011, 20:48
in realtà dovresti tu specificarci il problema, dove insorge, quale pensi possa essere la causa e in seguito valutiamo in che modo aiutarti
E magari una piccola spiegazione su cosa faccia, visto che le uniche informazioni che hai dato sono un titolo di dubbio significato e la totale assenza di commenti nel codice

nicone 91
11-02-2011, 21:01
si hai ragione cmq questo è un programma di una rubrica telefonica con le liste linkate che ha una funzione che aggiunge un contatto, stampa i contatti presenti, cerca un elemento della lista, elimina un elemento della lista, ed infine elimina tutta la rubrica

il mio problema è questo quando eseguo il programma aggiungo un contatto, dopo averlo fatto voglio visualizzare questo contatto, ma quando esegue la funzione stampa, mi stampa il mio contatto piu un contatto con dei simboli che non ho messo.

questo problema lo riscontrato pure nelle altre funzione.

secondo me il problema dovrebbe essere un puntatore ma non so in cosa consiste questo problema

è sufficiente oppure metto pure i commenti nel programma?

Laikius91
11-02-2011, 21:29
else {
printf (" # VISUALIZZA CONTATTO #\n");
printf (" NOME > %s\n", p->inf.Nome);
printf (" COGNOME > %s\n", p->inf.Cognome);
printf (" TELEFONO > %s\n", p->inf.Tel);
printf (" SITOWEB > %s\n", p->inf.Indirizzopaginaweb);
printf (" EMAIL > %s\n", p->inf.Indirizzoemail);
}
while (p != NULL){
printf (" # VISUALIZZA CONTATTO #\n");
printf (" NOME > %s\n", p->inf.Nome);
printf (" COGNOME > %s\n", p->inf.Cognome);
printf (" TELEFONO > %s\n", p->inf.Tel);
printf (" SITOWEB > %s\n", p->inf.Indirizzopaginaweb);
printf (" EMAIL > %s\n", p->inf.Indirizzoemail);
p = p->pun;
system("PAUSE");
}



Perchè questa stampa "doppia" ?

nicone 91
11-02-2011, 21:39
perchè con la prima stampa il primo elemento e con la seconda stampa tutti gli altri elementi

è un errore?

Laikius91
11-02-2011, 21:46
Originariamente inviato da nicone 91
perchè con la prima stampa il primo elemento e con la seconda stampa tutti gli altri elementi

è un errore?

Bè, a meno che non mi sfugga qualcosa, la funzione per stampare non ha molto senso secondo me... Tu dici:

1) se p == NULL (lista vuota) stampa "Nessun contatto presente";
2) altrimenti stampa il primo elemento (ma NON sposta il puntatore nella lista, cioè punta ancora al primo elemento!);
3) in ogni caso (il ciclo è fuori dall'if e dall'else) stampi tutti gli elementi della lista;

Quindi a occhio il primo elemento dovrebbe venire stampato due volte!

nicone 91
11-02-2011, 22:17
allora cmq si il primo elemento lo stampava 2 volte
cmq ho provato a togliere la prima stampa e lascire solo la seconda è l'unica cosa che mi stampa sono simboli nemmeno piu il primo elemento che metto quindi il problema o sta nella funzione stampa o in quella aggiungi contatto

Laikius91
11-02-2011, 22:30
Allora analizziamo la funzione per aggiungere un contatto:



struct elemento *aggiungiContatto(struct elemento *p){
printf (" # AGGIUNGI CONTATTO #\n");
char nome[50];
char cognome[50];
char telefono[30];
char email[100];
char sitoweb[200];
Contatto daInserire;
struct elemento *punt;

punt = (struct elemento *)malloc(sizeof(struct elemento));
p = (struct elemento *)malloc(sizeof(struct elemento)); /* perchè fai una malloc anche per p?? devi farla solo per il nuovo nodo, ossia punt! */

printf (" NOME > ");
scanf ("%s", nome);
strcpy(daInserire.Nome, nome);
printf (" COGNOME > ");
scanf ("%s", cognome);
strcpy(daInserire.Cognome, cognome);
printf (" TELEFONO > ");
scanf ("%s", telefono);
strcpy(daInserire.Tel, telefono);
printf (" SITOWEB > ");
scanf ("%s", sitoweb);
strcpy(daInserire.Indirizzopaginaweb, sitoweb);
printf (" EMAIL > ");
scanf ("%s", email);
strcpy(daInserire.Indirizzoemail, email);

punt->inf = daInserire;
punt->pun = p; /* semplicemente concateni p a punt, sia che p sia NULL o che punti a una lista di elementi, non importa fare la distinzione di prima! */
return(punt);

}




Sono un paio di cose che mi vengono in mente, fai qualche prova e dimmi come va! :)

nicone 91
11-02-2011, 22:47
allora abbiamo fatto un passo avanti pero questa volta mi stampa le lettere non piu i simboli e non mi crea piu un contatto con i simboli

Laikius91
11-02-2011, 23:13
Originariamente inviato da nicone 91
allora abbiamo fatto un passo avanti pero questa volta mi stampa le lettere non piu i simboli e non mi crea piu un contatto con i simboli

Non ho capito bene, in che senso ti stampa le lettere?

Loading