long *IndMax(const int V[], long n, long *nMax) { long *ind = NULL; //Inizializza i valori di ind e *nMax cosicche' *nMax = 0; //se n <= 0 ritorna NULL e in *nMax restituisce 0. if (n > 0) { long i, k; int max = V[0]; for (i = 1 ; i < n ; i++) //Calcola il valore massimo di V if (V[i] > max) max = V[i]; for (i = 0 ; i < n ; i++) //Calcola il numero di elementi di V if (V[i] == max) (*nMax)++; //con valore massimo. ind = malloc((*nMax)*sizeof(long)); //Alloca il nuovo vettore for (k = 0, i = 0 ; i < n ; i++) //Scrivi nel nuovo vettore gli indici if (V[i] == max) ind[k++] = i; //degli elementi con valore massimo. } return ind; }
char *ABCStringa(int nA, int nB, int nC) { char *stringa = malloc((nA + nB + nC + 1)*sizeof(char)); //Alloca la stringa int n, i = 0; //La variabile i conterra' sempre l'indice del //prossimo carattere (non ancora scritto). for (n = nA ; n > 0 ; n--) stringa[i++] = 'A'; //Scrivi le A for (n = nB ; n > 0 ; n--) stringa[i++] = 'B'; //Scrivi le B for (n = nC ; n > 0 ; n--) stringa[i++] = 'C'; //Scrivi le C stringa[i] = '\0'; return stringa; }
long EliminaDuplicati(int V[], long dim) { long k = 0, i; for (i = 1 ; i < dim ; i++) { if (V[i] != V[k]) { k++; V[k] = V[i]; } } return dim - (k + 1); }
typedef struct Elem { int intero; struct Elem *next; } Elem, *List;Il prototipo della funzione è void SomList(List). Ad esempio se la lista è 2 -> 5 -> 3 -> 13 allora la funzione modifica la lista così 23 -> 21 -> 16 -> 13.
/* Funzione ausiliaria che ritorna la somma degli interi della lista a partire dall'elemento e. */ int Somma(const Elem *e) { int s = 0; while (e != NULL) { s += e->intero; e = e->next; } return s; } void SomList(List L) { while (L != NULL) { L->intero = Somma(L); L = L->next; } }
typedef struct VStr { long val; char * str; //stringa allocata dinamicamente struct VStr *next; } VStr, *LStr;Scrivere una funzione, con prototipo int Comp(LStr L), che presa in input la lista L, ordinata in senso non decrescente rispetto al campo val, la modifica in modo tale che elementi consecutivi che hanno lo stesso valore del campo val sono sostituiti da un elemento il cui valore del campo val è lo stesso e il campo str è la stringa prodotta dalla concatenazione, nell'ordine, delle stringhe degli elementi sostituiti. La funzione ritorna il numero massimo di elementi con lo stesso valore del campo val. Inoltre la funzione non deve modificare il puntatore al primo elemento. La memoria non più usata deve essere rilasciata e i nuovi blocchi di memoria non devono essere più grandi del necessario. Ad esempio se la lista è {5, "AA"} -> {5, "BBB"} -> {7, "C"} -> {8, "D"} -> {8, "GG"} -> {8, "F"} allora la funzione la modifica così {5, "AABBB"} -> {7, "C"} -> {8, "DGGF"} e ritorna 3.
int Comp(LStr L) { int max = 0, count = 0; LStr prev = NULL; //Manterra' il puntatore al primo elemento long val; //di una sequenza di elementi da sostituire. while (L != NULL) { if (prev != NULL && val == L->val) { //Se e' un elemento di una sequenza int newLen = strlen(prev->str) + strlen(L->str); //di elementi da sost. prev->str = realloc(prev->str, (newLen + 1)*sizeof(char)); strcat(prev->str, L->str); //Rialloca un blocco sufficiente per prev->next = L->next; //mantenere la concatenazione. free(L->str); //Sgancia l'elemento dalla lista e free(L); //rilascia la memoria della stringa L = prev->next; //e dell'elemento. count++; } else { if (count > max) max = count; count = 1; val = L->val; prev = L; L = L->next; } } if (count > max) max = count; return max; }
void InvFile(char *nameF, char *newF) { FILE *f = fopen(nameF, "r"); //Apri il file in lettura int n, lenF = 0; while (fscanf(f, "%d", &n) == 1) lenF++; //Conta gli interi nel file int k = 0, v[lenF]; //Vettore a dimensione variabile atto a contenere gli interi del file rewind(f); //Riporta il cursore del file all'inizio while (fscanf(f, "%d", &(v[k])) == 1) k++; //Copia gli interi del file nel vettore v fclose(f); FILE *nF = fopen(newF, "w"); //Crea ed apri il nuovo file for (k = lenF - 1 ; k >= 0 ; k--) //Scrivi nel nuovo file gli interi in fprintf(nF, "%d ", v[k]); //ordine inverso. fclose(nF); }
![]() |
![]() |
Questo sito usa cookies, usandolo ne accettate la presenza. (CookiePolicy)
Torna al Dipartimento di Informatica ![]() |
|
![]() |
![]() |