Liste!!1

di il
7 risposte

Liste!!1

Ragazzi mi serve un mano per scrivere una funzione che calcola il numero di elementi di una lista scorrendo gli elementi fino alla fine della lista.
Grazie in anticipo

7 Risposte

  • Re: Liste!!1

    Suppongo che l'elemento della lista sia:
    struct elemento {
       int inf;
       struct elemento *pun;
    }
    La tua lista sarà dichiarata:
    struct elemento *lista;
    La funzione size restituisce la lunghezza della lista. Bisogna prima passarglie la lista per referenza.
    Richiamo della funzione:
    miaVariabile = size (lista)
    La funzione size:
    int size (struct elemento *nodo)
    {
    int cont; /*contatore*/
    cont = 0;
    while (nodo->pun!=NULL)
    	{
    	cont++;
    	nodo = nodo->pun;
    	}
    return (cont++);/*bisogna incrementare cont ancora
    					di 1 se no nn viene conteggiato l'ultimo
    					elemento*/
    }
    Ti posto un programma che crea una in modo dinamico e ti conta il numero di elementi. Fa uso della libreria standard.
    #include <stdio.h>
    
    struct elemento {
    	int inf;
    	struct elemento *pun;
    };
    
    int size (struct elemento *nodo)
    {
    int cont; /*contatore*/
    cont = 0;
    while (nodo->pun!=NULL)
    	{
    	cont++;
    	nodo = nodo->pun;
    	}
    return (cont++);/*bisogna incrementare cont ancora
    					di 1 se no nn viene conteggiato l'ultimo
    					elemento*/
    }
    
    struct elemento *crea_lista()
    {
    struct elemento *p, *punt;
    int i, n;
    
    printf("Specificare il numero di elementi... ");
    scanf("%d", & n);
    if(n==0)
    	{
    	p = NULL; /* lista vuota*/
    	}
    else
    	{
    	/* creazione primo elemento */
    	p = (struct elemento *)malloc(sizeof(struct elemento));
    	printf("Inserisci il primo valore: ");
    	scanf("%d", & p->inf);
    	punt = p;
    	/* creazione elementi successivi */
    	for(i=2; i<=n; i++)
    		{
    		punt->pun = (struct elemento *)malloc(sizeof(struct elemento));
    		punt = punt->pun;
    		printf("Inserisci il %d elemento: ", i);
    		scanf("%d", & punt->inf);
    		} /* chiudo il for*/
    	punt->pun = NULL; /* marcatore fine lista*/
    	} /* chiudo l'if-else*/
    return(p);
    } /* chiudo la funzione*/
    
    int main (void)
    {
    struct elemento *lista;
    
    lista = crea_lista();
    printf("La lista Š lunga: %d\n",size(lista));
    
    while(!kbhit());/*aspetto che sia premuto un tasto*/
    return (0);
    }
    Alcune porzioni di codice sono state prese da

    Spero di essere stato esauriente e chiaro!!! Se non capisci chiedi senza problemi!
    Ciao
  • Re: Liste!!1

    Ciao, la funzione size è sbagliata almeno con quella struttura.
    nodo = nodo->pun; adesso hai perso il nodo precedente.
    int size(struct lista* nodo)
    {
    int i=0;
    struct lista* p=nodo;
    while(p->pun!=NULL)
    {
    i++;
    p=p->pun;
    }
    return i;
    }

    la struttura dovrebbe avere un altro puntatore nodo al nodo precedente.
  • Re: Liste!!1

    Ciao.
    Sapere il nodo precedente a cosa serve in una size???

    Non serve e comunque funziona benissimo!!

    Overflow perchè ricopi il codice modificandolo un pò(evidentemente senza neanche leggere)??
    int size(struct lista* nodo)
    {
    int i=0;
    struct lista* p=nodo; /*Inutile tanto hai già nodo che una volta finita la funzione verrà disallocato*/
    while(p->pun!=NULL)
    {
    i++;
    p=p->pun;
    }
    return i;/*Dimentichi l'ultimo elemento return (i++)*/
    }
    La funzione comunque è sostanzialmente uguale alla mia!?!?
    Se vuoi verificarne il funzionamento usa il programma postato da me in precedenza!

    Sapere il nodo precedente a cosa serve in una size???
  • Re: Liste!!1

    Ho fatto confusione io.
  • Re: Liste!!1

    Ciao

    Dal main richiami un altra funzione passandogli la testa della lista in modo che la legga tutta fino al NULL!!!

    Se proprio vuoi leggere la lista al contrario puoi usare una funzione ricorsiva!!!

    Il mio programma ha un problema non fa la free della memoria. Genera del memory leak.

    Ciao.
  • Re: Liste!!1

    Alla fine devi fare return ++count
    va incrementato prima di ritornarlo.
  • Re: Liste!!1

    Ciao.

    Hai ragionissima Overflow !!!!! se no è inutile!!!!

    Ciao.
Devi accedere o registrarti per scrivere nel forum
7 risposte