Lista collegata con puntatori e sequenza di Fibonacci

di il
2 risposte

Lista collegata con puntatori e sequenza di Fibonacci

Salve ragazzi. Ho tra le mani la realizzazione di un programmino in C che mi sta dando non pochi grattacapi e mi chiedevo se voi mi poteste dare una mano a venirne a capo. Praticamente devo scrivere la funzione C che riceve in ingresso una lista collegata con puntatori L di valori di tipo int, e
restituisce tra i parametri formali un array V ottenuto nel modo seguente:
• Inizialmente, la funzione rimuove dalla lista L gli elementi la cui posizione corrisponde ad un numero della successione di Fibonacci (ipotizzare che il primo elemento della lista abbia posizione 1 e che i primi due valori della successione di Fibonacci siano F0=1, F1=2, con l’elemento generico della successione dato da Fn=Fn-1+Fn-2);
• Gli elementi rimossi da L sono inseriti nell’array V in modo che l’ultimo elemento rimosso da L sia l’elemento in testa di V (l’array V deve essere allocato internamente alla funzione. Come dimensione può essere usata la lunghezza della lista L).
Ogni elemento della lista L, ha la forma seguente:

struct list {
       int value;
int pos; // posizione occupata inizialmente nella lista struct list * next_ptr;
};
dove la posizione occupata dall’elemento nella lista non cambia nel corso della esecuzione.
Grazie anticipatamente per l’eventuale partecipazione

2 Risposte

  • Re: Lista collegata con puntatori e sequenza di Fibonacci

    Partecipazione a cosa? C'è del codice che hai scritto da correggere eventualmente?
  • Re: Lista collegata con puntatori e sequenza di Fibonacci

    Si
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    typedef unsigned short int Boolean;
    #define FALSE 0
    #define TRUE 1
    #include "header.h"
    struct list{
        int value;
        int pos;
        struct list * next_ptr;
    };
    
    Boolean function (struct list **L, int** V, int *length){
        int i, j, size;
        int * F;
        struct list * positionPtr=*L;
        struct list ** ptrptr=L;
        struct list *tmp;
        while (positionPtr!=NULL && positionPtr->next_ptr!=NULL)
            positionPtr=positionPtr->next_ptr;
        if (positionPtr!=NULL) size=positionPtr->pos;
        else return FALSE;
        *V=(int*)malloc(sizeof(int)*(size));
        F=(int*)malloc(sizeof(int)*(size));
        if (*V==NULL || F==NULL) return FALSE;
        F[0]=1;
        F[1]=2;
        for (i=2;i<size && F[i-1]<size;i++)
            F[i]=F[i-1]+F[i-2];
        i=0;
        j=size-1;
        while (*ptrptr!=NULL){
            if ((*ptrptr)->pos==F[i]) {
                (*V)[j] = (*ptrptr)->value;
                tmp = *ptrptr;
                *ptrptr = (*ptrptr)->next_ptr;
                free(tmp);
                i++;
                j--;
            }
            else
                ptrptr=&((*ptrptr)->next_ptr);
        }
        for (i=j+1;i<size;i++)
            (*V)[i-j-1]=(*V)[i];
        *length=size-j-1;
        return TRUE;
    }
    
    int main(){
        int choice, element, deleted, N;
        struct list *ptr;
        int *arr;
        do {
            printf("\n\nCosa vuoi fare?\n\n");
            printf("1. Inizializza lista\n");
            printf("2. Inserimento in testa\n");
            printf("3. Inserimento in coda\n");
            printf("4. Cancellazione in testa\n");
            printf("5. Cancellazione in coda\n");
            printf("6. Stampa\n");
            printf("7. Stampa con posizioni\n");
            printf("8. Funzione\n");
            printf("\n0. Esci\n");
    
            scanf("%d", &choice);
    
            switch (choice) {
                case 1:
                    init(&ptr);
                    printf ("\nLa lista è stata inizializzata ");
                    break;
    
                case 2:
                    printf ("\nInserisci il valore dell'elemento: ");
                    scanf("%d", &element);
                    preInsert(&ptr, element);
                    printf("%d è stato inserito", element);
    
                    break;
    
                case 3:
                    printf ("\nInserisci il valore dell'elemento: ");
                    scanf("%d", &element);
                    sufInsert(&ptr, element);
                    printf("%d è stato inserito", element);
                    break;
    
                case 4:
                    consumeFirstV(&ptr, &deleted)?printf("%d è stato
    eliminato correttamente", deleted):printf("ERRORE: LISTA VUOTA");
                    break;
    
                case 5:
                    consumeLastV(&ptr, &deleted)?printf("%d è stato
    eliminato correttamente", deleted):printf("ERRORE: LISTA VUOTA");
                    break;
    
                case 6:
                    stampa(ptr);
                    break;
    
                case 7:
                    stampaPosition(ptr);
                    break;
    
                case 8:
                    function(&ptr, &arr, &N);
                    printf("Lista:\n");
                    stampaPosition(ptr);
                    printf("\n\nVettore:\n");
                    for (int i=0;i<N;i++)
                        printf("%d\t", arr[i]);
                    break;
             }
        } while(choice!=0);
    
        return 0;
    
    }
Devi accedere o registrarti per scrivere nel forum
2 risposte