Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    1,258

    [c] lista non-funzionante

    Ciao...credo che l'errore sia da ricercare nella funzione inserisci testa. Succede che alloca nodi uguali all'ultimo inserito per n(numero inserimenti) volte. Non sono riuscito a correggerlo. ufffff...
    codice:
    #include <stdio.h>
    
    typedef struct {
      char nome[80];
      char indirizzo[80];
      char telefono[80];
    } record;
    
    typedef struct nodo *lista;
    
    struct nodo{
      record *elemento;
      lista next;
    };
    
    typedef enum{OK, ERROR} status;
    
    
    status allocanodo(lista *r_L, record *d);
    status inseriscitesta(lista *r_L, record *d);
    void display(lista start);
    
    int main()
    {
      lista start = NULL;
      record r; //usato per le immissioni
      char ec;
    
      for(;;){
        printf("\n(i)inserisci nuovo nome \n");
        printf("(p)stampa a video \n");
        printf("(x)uscita dal programma \n");
        ec = getche();
    
        switch(ec){
          case('i'):
    
            printf("inserisci il nome: ");
            gets(r.nome);
            printf("inserisci l'indirizzo: ");
            gets(r.indirizzo);
            printf("inserisci il telefono: ");
            gets(r.telefono);
            inseriscitesta(&start, &r);
            break;
    
    
    
          case('p'):
            display(start);
            break;
    
          case('x'):
            exit();
            break;
        }
        getch();
      }
      getch();
      return 0;
    }
    
    //inserisce nella lista il nodo al posto giusto
    status allocanodo(lista *r_L, record *d){
     *r_L = (lista)malloc(sizeof(struct nodo));
     if(*r_L==NULL) return ERROR;
     else {
       (*r_L)->elemento=d;
       (*r_L)->next=NULL;
      }
     return OK; 
    }
    
    
    status inseriscitesta(lista *r_L, record *d)
    {
      lista L;
      if (allocanodo(&L,d) == ERROR)
        return ERROR;
      L-> next = *r_L;
      *r_L = L;
      return OK;
    }
    
    void display(lista start)
    {
      while(start){
        printf("%s\n", (start->elemento)->nome);
        printf("%s\n", (start->elemento)->indirizzo);
        printf("%s\n\n", (start->elemento)->telefono);
        start = start -> next;
      }
    }
    notare che ; ) è stato convertito in sorrisetto!

  2. #2
    Non ho capito cosa deve fare questo programma, è una lista?

    Il puntatore non dovresti farlo passare per riferimento?

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    1,258
    è una lista, in cui gli elementi vengono inseriti all'inizio, con lo spostamento dei collegamenti. B

    io ho passato il puntatore per riferimento:

    inseriscitesta(&start, &r);

  4. #4
    Si certo

    Ma i parametri puntatore delle funzioni devono essere **, perchè tu passi un puntatore per riferimento.

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    1,258
    ma lo è! :bubu:

    typedef struct nodo *lista;

    ..lista è già un puntatore alla struttura nodo, basta aggiungerci ancora un asterisco e il gioco è fatto. Se vedi qualcosaltro che può non andare segnalamelo pure...

  6. #6
    Ci ho pensato venti minuti e poi finalmente ho capito penso..!

    Il programma è sbagliato perchè si, allocchi sempre un nuovo elemento, ma che punta sempre alla variabile record r.

    Quindi è sempre lo stesso indirizzo che scrive, e quindi sempre l'ultimo elemento che inserisci (nome,cognome,ecc) perchè è quello che assume il record r.

    Devi allocare anche lo spazio ogni volta per la struttura, gh.

    Penso (penso) sia questo il problema.

    Ciao!

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    1,258
    Non riesco a capire l'errore...

    codice:
     
    //alloco un puntatore a struttura
    lista L;
    
    //alloco un nuovo nodo
    if (allocanodo(&L,d) == ERROR)
        return ERROR;
    //il campo next del nuovo nodo punta all'indirizzo del primo nodo
    L-> next = *r_L;
    // il primo nodo diventa L
      *r_L = L;
      return OK;
    ]

  8. #8
    Esatto, ma le stringhe le inserisci nel record r!
    Quindi tu ogni volta che crei un nuovo nodo in testa, il puntatore punta sempre all'indirizzo del record r.

    Non fai altro che salvare in ogni nodo, lo stesso indirizzo, per questo è sbagliato.
    Oltre che allocare lo spazio per ogni nodo, devi anche allocare lo spazio per ogni stringa, e copiare dal record r, nel nuovo spazio.

    bye

  9. #9
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    1,258
    è vero...io ho un puntatore al record. thanks! :metallica

  10. #10
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    1,258
    però un momento....non mi è per nulla chiaro come risolvere il problema

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 © 2025 vBulletin Solutions, Inc. All rights reserved.