Problema Liste in C

di il
8 risposte

Problema Liste in C

Signori buongiorno, ho un piccolo problema riguardante una struttura dati dinamica. In pratica sto creando una piccola rubrica dinamica, utilizzando le liste. Il problema sorge quando devo andare ad inserire un valore. Sul web ho trovato una piccola funzione che tratta appunto questo argomento e inserisce i valori in ordine alfabetico. Non riuscendo a capire la funzione cosa fa, qualcuno di voi mi può dare una mano a capire bene questa funzione?
// Sinonimo di char
typedef char string[SIZE];

// Creo la struttura per contenere i contatti
typedef struct{
  string nome;
  string cognome;
  string telefono;
  string email;
  string sitoweb;
} t_contatto;

// Creo la struttura per creare la lista
typedef struct nodo{
  t_contatto inf;
  struct nodo *pun;
} Nodo;

typedef Nodo * Lista;
void InserisciContatto(Lista *pLista, Nodo * info)
{
  if (!(*pLista)) 
   *pLista = info; 
  else if (strcmp(info->inf.cognome, (*pLista)->inf.cognome)>0) 
   InserisciContatto(&((*pLista)->pun), info);	
  else {
   info->pun = *pLista;	
   *pLista = info;
  }
}

8 Risposte

  • Re: Problema Liste in C

    Immagino che la parte che non hai capito sia questa
    
    InserisciContatto(&((*pLista)->pun), info);
    
    Giusto? È una ricorsione.
    In pratica nella prima chiamata di InserisciContatto confronta il nuovo contatto con il primo della lista, se è maggiore, cioè va inserito dopo, richiama la stessa funzione, passando il puntatore al secondo della lista, quindi verrà confrontato col secondo e così via.

    Comunque è bene che ne scriva una tu con un normale ciclo, se non conosci la ricorsione.
  • Re: Problema Liste in C

    Alexv ha scritto:


    Giusto? È una ricorsione.
    In pratica nella prima chiamata di InserisciContatto confronta il nuovo contatto con il primo della lista, se è maggiore, cioè va inserito dopo, richiama la stessa funzione, passando il puntatore al secondo della lista, quindi verrà confrontato col secondo e così via.

    Comunque è bene che ne scriva una tu con un normale ciclo, se non conosci la ricorsione.
    Sì esatto, più precisamente non avendo fatto la ricorsione l'ho vista un pò ambigua.
    Ricapitolando:
    if (!(*pLista)) 
       *pLista = info;
    quì controlla se è diverso da null, e mi mette l'informazione nella testa della lista.
    else if (strcmp(info->inf.cognome, (*pLista)->inf.cognome)>0) 
       InserisciContatto(&((*pLista)->pun), info);	
    quì mi fa il controllo, per poi ordinarlo.
    else {
       info->pun = *pLista;	
       *pLista = info;
      }
    
    infine questa parte cosa fa di preciso? sembra ignorante come domanda però sono quì per questo
  • Re: Problema Liste in C

    Se info NON viene dopo il nodo puntato da *pLista, lo inserisce prima.
    Per esempio il nodo di *pLista ha cognome B, mentre info è A.
    Il nodo info punterà allo stesso modo nodo di *pLista, cioè B
    info->pun = *pLista;
    mentre *pLista viene spostato su A.
    *pLista = info;
    *pLista è il puntatore al primo elemento se è la prima chiamata alla funzione, altrimenti si tratterà del "pun" (passato per indirizzo) di uno dei nodi della lista. Alla fine sarà il puntatore nullo dell'ultimo elemento, quindi la ricorsione si dovrà per forza arrestare entrando nel primo if.

    Tieni conto, però, che qui manca una funzione intermedia, ovvero una funzione che riceva in ingresso i dati del contatto e li usi per generare un nodo, per poi passarlo a InserisciContatto.
    Il primo if, inoltre, dovrebbe impostare a null il "pun" di info, se non viene fatto prima.
  • Re: Problema Liste in C

    Alexv ha scritto:


    Se info NON viene dopo il nodo puntato da *pLista, lo inserisce prima.
    Per esempio il nodo di *pLista ha cognome B, mentre info è A.
    Il nodo info punterà allo stesso modo nodo di *pLista, cioè B
    info->pun = *pLista;
    mentre *pLista viene spostato su A.
    *pLista = info;
    *pLista è il puntatore al primo elemento se è la prima chiamata alla funzione, altrimenti si tratterà del "pun" (passato per indirizzo) di uno dei nodi della lista. Alla fine sarà il puntatore nullo dell'ultimo elemento, quindi la ricorsione si dovrà per forza arrestare entrando nel primo if.

    Tieni conto, però, che qui manca una funzione intermedia, ovvero una funzione che riceva in ingresso i dati del contatto e li usi per generare un nodo, per poi passarlo a InserisciContatto.
    Il primo if, inoltre, dovrebbe impostare a null il "pun" di info, se non viene fatto prima.
    sisi l'allocazione viene gestita nel main, ho creato una funzione che mi gestisce i dati in ingresso in modo da rendere il tutto più pulito possibile:
    case 2:
            	p = (Nodo*) malloc(sizeof(Nodo));
            	p->pun =NULL;
            	LeggiContatto (&p->inf); //funzione che legge i dati in ingresso.
            	InserisciContatto(&lista, p);
        		break;
    La funzione in generale può essere gestita meglio?
  • Re: Problema Liste in C

    Calogero98 ha scritto:


    sisi l'allocazione viene gestita nel main, ho creato una funzione che mi gestisce i dati in ingresso in modo da rendere il tutto più pulito possibile:
    case 2:
            	p = (Nodo*) malloc(sizeof(Nodo));
            	p->pun =NULL;
            	LeggiContatto (&p->inf); //funzione che legge i dati in ingresso.
            	InserisciContatto(&lista, p);
        		break;
    La funzione in generale può essere gestita meglio?
    Potresti fare un'apposita funzione
    
    Nodo* creaNodo(t_contatto* c) 
    {
    	Nodo* p = (Nodo*) malloc(sizeof(Nodo));
    	p -> inf = *c;
    	p -> pun = NULL;
    	return p;
    } 
    
  • Re: Problema Liste in C

    Ottima idea grazie!
    riguardo la ricorsione come posso ovviare questo problema? in termini di codice non inserendo la ricorsione seguente
    InserisciContatto(&((*pLista)->pun), info);
    come si traduce in semplice codice?
  • Re: Problema Liste in C

    Non concentrarti su come tradurre quello. Pensa a cosa deve fare il programma (ormai lo hai capito), e a come lo faresti tu . In quali casi deve arrestarsi?
  • Re: Problema Liste in C

    Alexv ha scritto:


    Non concentrarti su come tradurre quello. Pensa a cosa deve fare il programma (ormai lo hai capito), e a come lo faresti tu . In quali casi deve arrestarsi?
    Perfetto, grazie mille per l'aiuto !!
Devi accedere o registrarti per scrivere nel forum
8 risposte