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
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:
#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;
}