|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Jan 2011
Messaggi: 3
|
help me c++!
Ciao a tutti!!! beh cm vedete sn nuova nel forum...così come nella programmazione! devo fare 1 rubrica telefonica e nn riesco a creare 1 funz decente che mi elimini un contatto!! xD qlk1 può aiutarmi??? thx!!!
#include<stdio.h> #include<iostream> #include<stdlib.h> #define MAXCHAR 20 typedef struct{ char cognome[MAXCHAR]; }inseriti; typedef struct{ char nome[MAXCHAR]; char numero[MAXCHAR]; char email[MAXCHAR]; char web[MAXCHAR]; char indirizzo[MAXCHAR]; }associati ; typedef struct { inseriti contenuto; associati valore; }Contatto; struct Lista; typedef struct Lista *PuntUnElementoDellaLista; typedef struct Lista{ Contatto elemento; PuntUnElementoDellaLista next; }Lista; Lista* Inserisci(PuntUnElementoDellaLista pl, inseriti *contenuto, associati *valore){ PuntUnElementoDellaLista pTmp; pTmp=(PuntUnElementoDellaLista)malloc(sizeof(Lista)); if (NULL != pTmp){ pTmp->next=pl; strcpy(pTmp->elemento.valore.nome,valore->nome); strcpy(pTmp->elemento.contenuto.cognome,contenuto->cognome); strcpy(pTmp->elemento.valore.numero,valore->numero); strcpy(pTmp->elemento.valore.email,valore->email); strcpy(pTmp->elemento.valore.indirizzo,valore->indirizzo); strcpy(pTmp->elemento.valore.web,valore->web); } return(pTmp); void Stampa(PuntUnElementoDellaLista pl){ PuntUnElementoDellaLista pTmp=pl; while (pTmp!=NULL){ printf("\n Cognome:\n %s",pTmp->elemento.contenuto.cognome); printf("\n Nome: \n %s,",pTmp->elemento.valore.nome); printf("\n Numero: \n %s",pTmp->elemento.valore.numero); printf("\n Indirizzo:\n %s",pTmp->elemento.valore.indirizzo); printf("\n Indirizzo e-mail:\n %s",pTmp->elemento.valore.email); printf("\n Indirizzo web:\n %s",pTmp->elemento.valore.web); pTmp=pTmp->next; } system("PAUSE"); } void Elimina(PuntUnElementoDellaLista pl){ Contatto elem; printf("Inserisci il cognome del contatto da eliminare"); scanf("%s",elem.contenuto.cognome); PuntUnElementoDellaLista s,r; if(pl->next!=NULL){ s=pl; while(s->next!=NULL){ if( strcmp(s->elemento.contenuto.cognome,elem.contenuto.cognome)){ r=s->next; s->next=s->next->next; free(r); } else s=s->next; } } if( strcpy(pl->elemento.contenuto.cognome,elem.contenuto.cognome)){ r=pl; pl=pl->next; free(r); } } int main(){ PuntUnElementoDellaLista lista; lista = NULL; int i=0,scelta; associati val; inseriti cont; do{ printf("Scegli una delle seguenti operazioni:\n"); printf("Digita 1 per Inserire i contatti nella rubrica\n"); printf("Digita 4 per visualizzare tutti i contatto in rubrica\n"); printf("Digita 5 per eliminare un elemento della rubrica\n"); scanf("%d",&scelta); system("CLS"); switch(scelta){ case 1: while (true){ char nome_temp[MAXCHAR]; printf("Inserisci il cognome dell'contatto (digita fine per terminare) n: %d\n",i); scanf("%s",nome_temp); if (strcmp(nome_temp, "fine")==0) break; strcpy(cont.cognome,nome_temp); printf("Inserisci il nome del contatto n: %d\n",i); scanf("%s",nome_temp); strcpy(val.nome,nome_temp); printf("Inserisci il numero del contatto n: %d\n",i); scanf("%s",nome_temp); strcpy(val.numero,nome_temp); printf("Inserisci l'indirizzo del contatto n:%d\n",i); scanf("%s",nome_temp); strcpy(val.indirizzo,nome_temp); printf("Inserisci l'indirizzo e-mail del contatto n: %d\n",i); scanf("%s",nome_temp); strcpy(val.email,nome_temp); printf("Inserisci l'indirizzo di pagina web del contatto n: %d\n",i); scanf("%s",nome_temp); strcpy(val.web,nome_temp); i++; lista=Inserisci(lista,&cont,&val); }break; case 4: printf("Ecco il contenuto della Rubrica del tuo smartphone\n"); Stampa(lista); break; case 5: Elimina(lista); break; } system("CLS"); }while(scelta<6); system("PAUSE"); return 0; } |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
c++?
![]() comunque se metti il codice tra i tag code così che rimanga l'indentazione lo leggo meglio, così è troppo incasinato a occhio potresti aver sbagliato qui: Codice:
if(strcmp(s->elemento.contenuto.cognome,elem.contenuto.cognome)) Codice:
if(!strcmp(s->elemento.contenuto.cognome,elem.contenuto.cognome)) |
|
|
|
|
|
#3 |
|
Junior Member
Iscritto dal: Jan 2011
Messaggi: 3
|
Codice:
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#define MAXCHAR 20
typedef
struct{
char cognome[MAXCHAR];
}inseriti;
typedef
struct{
char nome[MAXCHAR];
char numero[MAXCHAR];
char email[MAXCHAR];
char web[MAXCHAR];
char indirizzo[MAXCHAR];
}associati ;
typedef
struct {
inseriti contenuto;
associati valore;
}Contatto;
struct Lista;
typedef struct Lista *PuntUnElementoDellaLista;
typedef struct Lista{
Contatto elemento;
PuntUnElementoDellaLista next;
}Lista;
Lista* Inserisci(PuntUnElementoDellaLista pl, inseriti *contenuto, associati *valore){
PuntUnElementoDellaLista pTmp;
pTmp=(PuntUnElementoDellaLista)malloc(sizeof(Lista));
if (NULL != pTmp){
pTmp->next=pl;
strcpy(pTmp->elemento.valore.nome,valore->nome);
strcpy(pTmp->elemento.contenuto.cognome,contenuto->cognome);
strcpy(pTmp->elemento.valore.numero,valore->numero);
strcpy(pTmp->elemento.valore.email,valore->email);
strcpy(pTmp->elemento.valore.indirizzo,valore->indirizzo);
strcpy(pTmp->elemento.valore.web,valore->web);
}
return(pTmp);
void Stampa(PuntUnElementoDellaLista pl){
PuntUnElementoDellaLista pTmp=pl;
while (pTmp!=NULL){
printf("\n Cognome:\n %s",pTmp->elemento.contenuto.cognome);
printf("\n Nome: \n %s,",pTmp->elemento.valore.nome);
printf("\n Numero: \n %s",pTmp->elemento.valore.numero);
printf("\n Indirizzo:\n %s",pTmp->elemento.valore.indirizzo);
printf("\n Indirizzo e-mail:\n %s",pTmp->elemento.valore.email);
printf("\n Indirizzo web:\n %s",pTmp->elemento.valore.web);
pTmp=pTmp->next;
}
system("PAUSE");
}
void Elimina(PuntUnElementoDellaLista pl){
Contatto elem;
printf("Inserisci il cognome del contatto da eliminare");
scanf("%s",elem.contenuto.cognome);
PuntUnElementoDellaLista s,r;
if(pl->next!=NULL){
s=pl;
while(s->next!=NULL){
if(!strcmp(s->elemento.contenuto.cognome,elem.contenuto.cognome)){
r=s->next;
s->next=s->next->next;
free(r);
}
else s=s->next;
}
}
if(!strcmp(pl->elemento.contenuto.cognome,elem.contenuto.cognome)){
r=pl;
pl=pl->next;
free(r);
}
}
int main(){
PuntUnElementoDellaLista lista;
lista = NULL;
int i=0,scelta;
associati val;
inseriti cont;
do{ printf("Scegli una delle seguenti operazioni:\n");
printf("Digita 1 per Inserire i contatti nella rubrica\n");
printf("Digita 4 per visualizzare tutti i contatto in rubrica\n");
printf("Digita 5 per eliminare un elemento della rubrica\n");
scanf("%d",&scelta);
system("CLS");
switch(scelta){
case 1:
while (true){
char nome_temp[MAXCHAR];
printf("Inserisci il cognome dell'contatto (digita fine per terminare) n: %d\n",i);
scanf("%s",nome_temp);
if (strcmp(nome_temp, "fine")==0) break;
strcpy(cont.cognome,nome_temp);
printf("Inserisci il nome del contatto n: %d\n",i);
scanf("%s",nome_temp);
strcpy(val.nome,nome_temp);
printf("Inserisci il numero del contatto n: %d\n",i);
scanf("%s",nome_temp);
strcpy(val.numero,nome_temp);
printf("Inserisci l'indirizzo del contatto n:%d\n",i);
scanf("%s",nome_temp);
strcpy(val.indirizzo,nome_temp);
printf("Inserisci l'indirizzo e-mail del contatto n: %d\n",i);
scanf("%s",nome_temp);
strcpy(val.email,nome_temp);
printf("Inserisci l'indirizzo di pagina web del contatto n: %d\n",i);
scanf("%s",nome_temp);
strcpy(val.web,nome_temp);
i++;
lista=Inserisci(lista,&cont,&val);
}break;
case 4:
printf("Ecco il contenuto della Rubrica del tuo smartphone\n");
Stampa(lista);
break;
case 5:
Elimina(lista);
break;
} system("CLS");
}while(scelta<6);
system("PAUSE");
return 0;
}
ke sciocca!!! nn volevo scrivere strcpy ma stcmp cmq anke modifcato così...fa cose strane...cioè mi cancella tutti i contatti tranne il primo invece ne dovrebbe cancellà 1 solo! |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
il fatto che non ti cancelli la testa della lista è normale, perché passando il puntatore al primo elemento non hai nessun controllo sul puntatore lista che hai nel main (che è il puntatore alla testa, e non viene modificato)
ovviamente tu devi poter cancellare anche il primo elemento e modificare la testa della lista se necessario, quindi devi cambiare il prototipo della funzione, hai due opzioni: Codice:
PuntUnElementoDellaLista Elimina(PuntUnElementoDellaLista lista); Codice:
lista = Elimina(lista); Codice:
void Elimina(PuntUnElementoDellaLista *lista); Codice:
Elimina(&lista); Codice:
PuntUnElementoDellaLista tmp = *lista; *lista = (*lista)->next free(tmp); comunque in realtà devi rivedere un po' tutta la struttura della funzione, usando una delle due opzioni che ti ho detto |
|
|
|
|
|
#5 |
|
Junior Member
Iscritto dal: Jan 2011
Messaggi: 3
|
ho corretto nel while ma non ho capito il resto che hai detto!
cioè mica posso mettere la variabile lista come parametro della funzione?? nn ho capito sto fatto.... |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 02:48.




















