Lista collegata con puntatori

di il
7 risposte

Lista collegata con puntatori

Avendo fatto un pasticcio nello scorso topic ne apro un altro piu preciso nella speranza di essere piu corretto nei confronti delle regole:
ho provato a implementare un programma ma sfortunatamente non mi gira e penso che il problema si trovi in una funzione ben specifica che di seguito vi illustrero per rendere tutto piu chiare mettero prima l'intestazione dell'esercizio:

scrivere la funzione c che opera nel modo seguente:
-riceve in ingresso una lista collegata con puntatori "list" di valori interi;
-riceve in ingresso un valore intero x>0 e modifica la lista di ingresso sommando insieme sotto-liste di x elementi consecutivi ed assegnando il valore della somma al primo elemento della sottolista. Gli x-1 elementi successivi al primo sono rimossi dalla lista finale;
- restituisce tra i parametri formali il numero di elementi finali della lista. la funzione restituisce anche come valore di ritorno un "boolean" "FALSE" o "TRUE" a seconda,rispettivamente, che la lista sia o meno vuota.

struct list{
int value;
struct list *next_ptr;
};

di seguito metto la parte in cui secondo me ci dovrebbe essere il problema
boolean addlist(struct list**ptrptr,int x)
{
	boolean found;
	struct list *tmp_ptr;
	if(*ptrptr==NULL)
		found=FALSE;
		else
		{
			found=TRUE;
			while(*ptrptr!=NULL)
			{
				while(x!=0)
				{
					tmp_ptr=*ptrptr;
					ptrptr=&((*ptrptr)->next_ptr);
					tmp_ptr->value=(tmp_ptr->value)+(*ptrptr->value);
					*ptrptr=(*ptrptr)->next_ptr;
					*ptrptr=&*tmp_ptr;
					x--;
				}
			ptrptr=&((ptrptr)->next_ptr);


			}

		}
	return(found);

ps spero di trovare qualcuno che mi aiuti e non qualcuno che mi accusi di barare agli esami perchè non è cosi... ringrazio in anticipo tutti coloro si presteranno ad aiutarmi

7 Risposte

  • Re: Lista collegata con puntatori

    Ciao
    per capire non mi sono chiare 3 cose.
    1) che tipo di errore ti da?
    1.1) errore di compilazione?
    1.2) loop perpetuo?
    1.3) risultati sballati?
    2) se nella lista ci sono 10 elementi ed x=5, suppongo che x indichi il record di partenza, al valore del 5° elemento devono essere sommati i record successivi o quelli precedenti?
    3) per x=0 il programma cosa dovrebbe fare?
  • Re: Lista collegata con puntatori

    Ho deciso di implementarla cosi:
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef unsigned short int boolean;
    #define TRUE 1
    #define FALSE 0
    
    struct list{
    	int value;
    	struct list * next_ptr;
    };
    //okok
    
    void init( struct list ** ptr );
    void visit( struct list * ptr );
    void pre_insert(struct list ** ptr, int value);
    boolean addlist(struct list ** ptr, int num, int X);
    
    
    int main()
    {
    
        struct list * ptr;
    	int n;
    	int count;
    	int value;
        int X;
        int num;
    
        init (&ptr);
    
        printf("\n quanti numeri vuoi nella lista?");
        scanf("%d", &n);
    
    
    
        for (count=1; count<=n; count++)
        {
            printf( "\n inserisci l'elemento %d: ", count );
            scanf( "%d", &value );
            pre_insert(&ptr,value);
        }
        printf("\n quanto vale X?");
        scanf("%d", &X);
    
        printf( "\n la lista iniziale si presenta così: " );
        visit( ptr );
    
        addlist(&ptr, num, X);
        printf( "\n la lista modificata si presenta così:" );
                visit( ptr );
    
        return (0);
    }
    
    void init( struct list ** ptr )
    {
        *ptr = NULL;
    }
    
    void visit( struct list * ptr)
    {
        while ( ptr != NULL ) {
            printf( "_%d_ ", ptr->value );
            ptr = ptr->next_ptr;
        }
    }
    
    
    void pre_insert(struct list ** ptr, int value)
    {
    	 struct list * tmp_ptr = (struct list *)malloc(sizeof (struct list));
    	    tmp_ptr -> value = value;
    	    tmp_ptr -> next_ptr = * ptr;
    	    * ptr = tmp_ptr;
    }
    
    
    boolean addlist(struct list ** ptr, int num, int X)
    {
    	boolean found;
        struct list * v;
        struct list * tmp= * ptr;
        int count;
        int sum;
    
        found=FALSE;
        if(ptr!=NULL)
        {
        	found=TRUE;
    
    
         while(tmp != NULL && tmp -> next_ptr != NULL)
         {
           v=tmp;
            int sum = tmp -> value;
            for(count = 1; count < X; count++)
            {
            	if(v->next_ptr==NULL)
            	break;
                v=v->next_ptr;
                sum+= v->value;
            }
            tmp->value=sum;
            tmp -> next_ptr = v-> next_ptr;
            if(tmp!=NULL)
            tmp = tmp -> next_ptr;
            num++;
    
         }
        }
        else
        	found=FALSE;
    
        return(found);
    }

    @smalldragon :ti faccio un esempio:facciamo che la lista in ingresso è {0,3,1,4,6}
    se x=2 al termine del programma la lista sara modificata e stampata in questo modo: {3,5,6}
    nell'intestazione comunque dice che x deve essere obbligatoriamente maggiore e non uguale a zero...l'errore che mi da è sempre lo stesso...
    "Errors occurred during the build.
    Errors running builder 'CDT Builder' on project 'programma_esame'.
    java.lang.NullPointerException" questo è quello che mi da quando vado a buildare...non è che potete provare a farlo partire sul vostro compilatore e controllare?? ho come l'idea che non faccia il mio ehehe
  • Re: Lista collegata con puntatori

    Mi correggo il vero errore è
    make: *** No rule to make target `clean'.  Stop.
  • Re: Lista collegata con puntatori

    Ciao
    allora da una prima prova con visual c++ c' è un errore nella variabile num che non viene inizializzata ma usata.
    la riga più precisamente e la seguente:
    addlist(&ptr, num, X);
    il fatto che ti da quel errore dipende molto probabilmente dal valore casuale di quella variabile.
    prova ad inizializzarla.
    con inizializzazione a zero o a 1 e per la seguente lista 1,2,3,4,5 con x=2 mi da 9,5,1

    leo94s ha scritto:


    @smalldragon :ti faccio un esempio:facciamo che la lista in ingresso è {0,3,1,4,6}
    se x=2 al termine del programma la lista sara modificata e stampata in questo modo: {3,5,6}
    seguendo il tuo esempio mi restituisce 10,4,0
    è corretto ?
    fammi sapere ok?
    comunque a prescindere dal risultato c'è un errore per quanto riguarda il primo elemento che invece di fare la somma stampa la lista inordine inverso.
    se ho capito bene l'esercizio il primo elemento dovrebbe restituire solamente la somma non essendoci elementi precedenti.
  • Re: Lista collegata con puntatori

    No! allora se la lista è 1,2,3,4,5 deve restituire 3(che sarebbe la somma dei primi due elementi),7(somma dei secondi due elementi) ed infine 5 che essendo l'ultimo elemento non puo essere sommato con il successivo) se fosse stata una lista da 1 a 6 l'ultimo elemento sarebbe stato 11 (5+6) scusate se non riesco a spiegarlo comunque grazie mille ora provo a inizializare num pero prima ho una domanda se vogli che num venga restituito alla funzione principale devo fare una sorta di implementazione con puntatore quando chiamo la funione giusto? in maniera che mi ritorni il risultato di num nella espressione, allego il codice modificato per farmi intendere:
    /*
     * name.c
     *
     *  Created on: 08/set/2014
     *      Author: leonardo
     */
    // programma_esame
    
    
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef unsigned short int boolean;
    #define TRUE 1
    #define FALSE 0
    
    struct list{
    	int value;
    	struct list * next_ptr;
    };
    
    
    void init( struct list ** ptr );
    void visit( struct list * ptr );
    void pre_insert(struct list ** ptr, int value);
    boolean addlist(struct list ** ptr, int*num, int X);
    
    
    int main()
    {
    
        struct list * ptr;
    	int n;
    	int count;
    	int value;
        int X;
        int num;
    
    
    
        init (&ptr);
    
        printf("\n quanti numeri vuoi nella lista?");
        scanf("%d", &n);
    
    
    
        for (count=1; count<=n; count++)
        {
            printf( "\n inserisci l'elemento %d: ", count );
            scanf( "%d", &value );
            pre_insert(&ptr,value);
        }
        printf("\n quanto vale X?");
        scanf("%d", &X);
    
        printf( "\n la lista iniziale si presenta così: " );
        visit( ptr );
    
        addlist(&ptr, &num, X);
        printf( "\n la lista modificata si presenta così:" );
                visit( ptr );
                printf("il numero di elementi finali della lista è %d",num);
    
        return (0);
    }
    
    void init( struct list ** ptr )
    {
        *ptr = NULL;
    }
    
    void visit( struct list * ptr)
    {
        while ( ptr != NULL ) {
            printf( "_%d_ ", ptr->value );
            ptr = ptr->next_ptr;
        }
    }
    
    
    void pre_insert(struct list ** ptr, int value)
    {
    	 struct list * tmp_ptr = (struct list *)malloc(sizeof (struct list));
    	    tmp_ptr -> value = value;
    	    tmp_ptr -> next_ptr = * ptr;
    	    * ptr = tmp_ptr;
    }
    
    
    boolean addlist(struct list ** ptr, int*num, int X)
    {
    	boolean found;
        struct list * v;
        struct list * tmp= * ptr;
        int count;
        int sum;
        *num=0;
    
        found=FALSE;
        if(ptr!=NULL)
        {
        	found=TRUE;
    
    
         while(tmp != NULL && tmp -> next_ptr != NULL)
         {
           v=tmp;
            sum = tmp -> value;
            for(count = 1; count < X; count++)
            {
            	if(v->next_ptr==NULL)
            	break;
                v=v->next_ptr;
                sum+= v->value;
            }
            tmp->value=sum;
            tmp -> next_ptr = v-> next_ptr;
            if(tmp!=NULL)
            tmp = tmp -> next_ptr;
            (*num)++;
    
         }
        }
        else
        	found=FALSE;
    
        return(found);
    }
    
    a questo punto la variabile num continua ad aver bisogno di essere inizializzata?? o posso anche non farlo? alla fine quando chiamo la funzione utilizzo l'indirizzo di num e non il suo valore
    ps se potete continuarmi a farmi il piacere di provare con il vostro compilatore ve ne sarei grato perchè il mio qualsiasi cosa scriva che sia un abominio o che sia giusta continua imperterrito a darmi lo stesso errore
  • Re: Lista collegata con puntatori

    Allora l'ultimo programma che ho postato mi funziona con una piccola aggiunta di un inserimento suffisso e non prefisso...per questo la funzione stampava e memorizzava gli elementi al contrario per quello dunque mi è bastato cambiare la fnzione ora pero l'unico problema è che il num che mi restituisce non è sempre un valore esatto sapete dirmi il motivo?
  • Re: Lista collegata con puntatori

    Ciao
    la variabile num deve essere inizializzata prima di chiamare la funzione addlist(&ptr, num, X);
    poi la seguente istruzione *num=0; è "sbagliata" perchè cosi inizializzi il puntatore della variabile num a zero e non la variabile.
    ciò la fa sballare basta una semplice num=0 ti risolve il problema.
    se la variabile sarà modificata dalla funzione il prototipo della funzione deve cambiare da
    boolean addlist(struct list ** ptr, int*num, int X)
    a
    boolean addlist(struct list ** ptr, int &num, int X)
Devi accedere o registrarti per scrivere nel forum
7 risposte