Discussione chiusa
Visualizzazione dei risultati da 1 a 2 su 2

Discussione: Lista collegata con puntatori e sequenza di Fibonacci

  1. #1
    Christian76 non è in linea Novello
    Post
    1

    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
    codice:
    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.
    Io per ora ho scritto il seguente codice:
    codice:
    #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;
    
    }

  2. #2
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Luogo
    Roma
    Post
    15,903
    Blogs
    5
    Chiuso per crossposting con

    https://www.iprogrammatori.it/forum-...ci-t33676.html

    Leggi i regolamenti dei forum prima di partecipare.

    Thread chiuso.
    Avvisi generali e importanti, a pena CHIUSURA thread e/o BAN
    Il crossposting è vietato.
    Le richieste di "pappa pronta" sono vietate.
    Utilizzate i tag CODE per il codice.
    Leggere il Regolamento per chiarimenti PRIMA di creare nuovi thread.
    Utilizzare sempre i PM per comunicare con i moderatori.
    Non mi contattate in PM per problemi di software, usate il forum

Discussione chiusa

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi