Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2011
    Messaggi
    6

    [C++] PROBLEMA lista concatenata

    ciao ragazzi ho alcuni problemi con il mio codice che dovrebbe gestire una rubrica telefonica....in particolare ho dei problemi gravi con la funzione per cancellare un contatto sulla quale vi chiedo di illuminarmi totalmente perche non essendo esperto credo proprio ke la mia funzione sia più che sbagliata....e poi ho un lieve problema con la funzione per la stampa della lista ke nello specifico di tutti i contatti che inserisco mi stampa sempre gli ultimi due....vi prego di aiutarmi e correggermi....con questa speranza vi posto il codice....grazie mille...

    Codice PHP:
    #include <stdio.h>
    #include <iostream>
    #include <stdlib.h>
    #include <string.h>
    #define DIM_numero 10
    #define MAX_carattere 100

    typedef struct {                    // DEFINIAMO IL TIPO CONTATTO.
            
    char nome [MAX_carattere];
            
    char cognome [MAX_carattere];
            
    char numero_cell [DIM_numero];
            
    char numero_casa [DIM_numero];
            
    char email [MAX_carattere];
            
    char indirizzo_web [MAX_carattere];
            } 
    tipi_contatti;
            
    struct Contatto_in_rubrica;

    typedef Contatto_in_rubrica *PuntContatto_in_rubrica;

    typedef struct Contatto_in_rubrica {
            
    tipi_contatti CONTATTO;
            
    Contatto_in_rubrica contattoSuccessivo;
            } 
    Contatto_in_rubrica;
            
    PuntContatto_in_rubrica inserisci_in_ordine(PuntContatto_in_rubrica Ltipi_contatti *CONTATTO) { // FUNZIONE PER L'INSERIMENTO DI UN CONTATTO IN RUBRICA.
                  
                  
    PuntContatto_in_rubrica succprecnew_node;
                  
    new_node=(PuntContatto_in_rubrica)malloc(sizeof (struct Contatto_in_rubrica));
                  if (
    new_node==NULL) {
                        
    printf("Errore nell'allocazione della memoria. \n");
                        exit (
    1);
                        };
                  
    new_node->contattoSuccessivo NULL;
                  
    succ=L;
                  
                  
    printf("Inserire il NOME del contatto: \n");
                  
    scanf("%s", &new_node->CONTATTO.nome);
                  
    printf("Inserire il COGNOME del contatto: \n");
                  
    scanf("%s", &new_node->CONTATTO.cognome);
                  
    printf("Inserire il NUMERO del contatto: \n");
                  
    scanf("%s", &new_node->CONTATTO.numero_cell);
                  
    printf("Inserire il NUMERO DI CASA del contatto: \n");
                  
    scanf("%s", &new_node->CONTATTO.numero_casa);
                  
    printf("Inserire l'INDIRIZZO EMAIL del contatto: \n");
                  
    scanf("%s", &new_node->CONTATTO.email);
                  
    printf("Inserire l'INDIRIZZO DI PAGINA WEB del contatto: \n");
                  
    scanf("%s", &new_node->CONTATTO.indirizzo_web);
                  
    printf("\n Il contatto è stato inserito in rubrica! \n");
                  
                 if (
    succ == NULL) {
                         return 
    new_node;
                  };
                  while (
    succ->contattoSuccessivo!=NULL) {
                      
    succ succ->contattoSuccessivo;
                  };
                  
    succ->contattoSuccessivo new_node;
                  return 
    succ;
               while (
    strncmp (new_node->CONTATTO.nomesucc->CONTATTO.nomeMAX_carattere) > 1) {
                        
    prec=succ;
                        
    succ=succ->contattoSuccessivo;
                        };

                  if (
    prec==NULL) {   
                        
    new_node->contattoSuccessivo succ;
                        return 
    new_node;
                  } 
                  else {
                        
    new_node->contattoSuccessivo succ;
                        
    prec->contattoSuccessivo new_node;
                        return 
    L;
                        }; 
                  };
                  
    PuntContatto_in_rubrica cancella_tutto (PuntContatto_in_rubrica L) { // FUNZIONE PER LA CANCELLAZIONE DELLA RUBRICA.
                            
                            
    L->contattoSuccessivo;
                            
    == NULL;
                            
    free (L);
                            return 
    L;
                            
                            };
                            
    PuntContatto_in_rubrica cancella_un_contatto (PuntContatto_in_rubrica Ltipi_contatti *CONTATTO) { // FUNZIONE PER LA CANCELLAZIONE DI UN CONTATTO DALLA RUBRICA.
                            
    PuntContatto_in_rubrica succprectemp;
                            
    temp->contattoSuccessivo NULL;
                            
    succ L;
                            
                            
    printf("\n Inserire il NOME da eliminare: \n");
                            
    scanf("%s", &temp->CONTATTO.nome);
                            
                            if (
    succ == NULL) {
                                     
    printf("\n La rubrica è vuota oppure il contatto non è presente in rubrica. \n");
                                     return 
    L;
                            }
                            while (
    succ->contattoSuccessivo != NULL) {
                                     
    succ succ->contattoSuccessivo;
                                     };
                                     
                            
    succ->contattoSuccessivo temp;
                            return 
    succ;
                            
                            while (
    strncmp(temp->CONTATTO.nomesucc->CONTATTO.nomeMAX_carattere) >1) {
                                  
    prec succ;
                                  
    succ succ->contattoSuccessivo;
                                  };
                                  
                            if (
    prec == NULL) {
                                     
                                 
    temp->contattoSuccessivo succ;
                                 
    free (temp);
                                 
    printf("\n Il contatto è stato rimosso dalla rubrica! \n");
                                 return 
    L;
                            }
                            else {
                                 
    temp->contattoSuccessivo succ;
                                 
    prec->contattoSuccessivo temp;
                                 
    free (temp);
                                 
    printf("\n Il contatto è stato rimosso dalla rubrica! \n");
                                 return 
    L;
                                 };
                            };
                            


    PuntContatto_in_rubrica cerca_contatto (PuntContatto_in_rubrica Ltipi_contatti *CONTATTO) { // FUNZIONE PER LA RICERCA DI UN CONTATTO IN RUBRICA.
                            
    PuntContatto_in_rubrica temp;
                            
                            
    printf("\n Inserire il NOME da ricercare: \n");
                            
    scanf("%s", &temp->CONTATTO.nome);
                            
                            if (
    == NULL) {
                                     
    printf("\n La rubrica è vuota oppure il contatto non è presente in rubrica. \n");
                                     return 
    L;
                                     };
                            
                            if (
    strncmp(temp->CONTATTO.nomeL->CONTATTO.nomeMAX_carattere) != 0) {
                                     
    L->contattoSuccessivo;
                            }
                            else {
                                 
    temp L;
                                 
    printf("\n Il contatto è presente in rubrica: \n \n NOME: %s \n COGNOME: %s \n NUMERO DI CELLULARE: %s \n NUMERO DI CASA: %s \n INDIRIZZO DI POSTA ELETTRONICA: %s \n INDIRIZZO DI PAGINA WEB: %s \n", &temp->CONTATTO.nome, &temp->CONTATTO.cognome, &temp->CONTATTO.numero_cell, &temp->CONTATTO.numero_casa, &temp->CONTATTO.email, &temp->CONTATTO.indirizzo_web);
                                 return 
    L;
                                 };
    };

    void visualizza_rubrica (PuntContatto_in_rubrica L) { // FUNZIONE PER LA VISUALIZZAZIONE DELLA RUBRICA.
                  
    PuntContatto_in_rubrica temp;
                  
    temp L;
                  while (
    temp != NULL) {
                                        
    printf("\n NOME: %s\n"temp->CONTATTO.nome);
                                        
    printf(" COGNOME: %s\n"temp->CONTATTO.cognome);
                                        
    printf(" NUMERO: %s\n"temp->CONTATTO.numero_cell);
                                        
    printf(" NUMERO DI CASA: %s\n"temp->CONTATTO.numero_casa);
                                        
    printf(" INDIRIZZO EMAIL: %s\n"temp->CONTATTO.email);
                                        
    printf(" INDIRIZZO DI PAGINA WEB: %s\n"temp->CONTATTO.indirizzo_web);
                                        
    printf("\n __________________________________________________________________ \n");
                                        
                                        
    temp temp->contattoSuccessivo;
                  }
                  if (
    == NULL) {
                       
    printf("\n La rubrica è priva di contatti. \n"); 
                       return;    
                       };                 
                  
    };               


    int main () { // FUNZIONE PRINCIPALE DELLA RUBRICA.
        
    PuntContatto_in_rubrica L=NULL;
        
    tipi_contatti CONTATTO;
        
    int scelta;
        
    printf("\n §§§ RUBRICA TELEFONICA §§§ \n");
        while (
    scelta != 6) {
              
    printf("\n 1- AGGIUNGI CONTATTO. \n");
              
    printf(" 2- CERCA CONTATTO. \n");
              
    printf(" 3- ELIMINA CONTATTO. \n");
              
    printf(" 4- ELIMINA TUTTA LA RUBRICA. \n");
              
    printf(" 5- VISUALIZZA RUBRICA. \n");
              
    printf(" 6- ESCI. \n");
              
              
    scanf("%d", &scelta);
              
              switch (
    scelta) {
                               case 
    :
                                    
    inserisci_in_ordine (L, &CONTATTO);
                                    break;
                                    
                               case 
    :
                                    
    cerca_contatto (L, &CONTATTO);
                                    break;
                                    
                               case 
    :
                                    
    cancella_un_contatto (L, &CONTATTO);
                                    break;
                                    
                               case 
    :
                                    
    cancella_tutto (L);
                                    break;     
                                    
                               case 
    :
                                    
    visualizza_rubrica (L);
                                    break;
                               }
    }
    system("PAUSE");
    return 
    0;


  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2011
    Messaggi
    6
    ma nessuno mi da una mano ???.....VI PREGOO.....

  3. #3
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Quando ho scritto:
    La prima regola è: usare un puntatore che non si sa a cosa punti, porta a pena infinita.
    mi riferivo a uno dei principi cardine di tutta la programmazione C/C++.
    Principio che continui a violare.
    codice:
    PuntContatto_in_rubrica cancella_un_contatto (PuntContatto_in_rubrica L, tipi_contatti *CONTATTO) { 
        // FUNZIONE PER LA CANCELLAZIONE DI UN CONTATTO DALLA RUBRICA.
        PuntContatto_in_rubrica succ, prec, temp; // a cosa punta temp? E prec?
        // questo puoi farlo solo se temp è un puntatore valido.
       temp->contattoSuccessivo = NULL;
    E continui a sbagliare la scanf ( sia qui che in: inserisci_in_ordine() )
    codice:
    // questa è sbagliata: nome è già una stringa ASCIIZ. Mettere & fa solo danni.
    scanf("%s", &temp->CONTATTO.nome);
    D'accordo che sei alle prime armi, ma questi sono errori gravi.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301

    Moderazione

    Si sta già discutendo di problemi analoghi a questo codice in questa discussione.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.