char *PadString(const char *str, unsigned start, unsigned end, char pad) { int k; //Alloca la nuova stringa char *newStr = malloc((strlen(str) + start + end + 1)*sizeof(char)); for (k = 0 ; k < start ; k++) newStr[k] = pad; //Scrivi i caratteri pad iniziali for ( ; *str != '\0' ; str++, k++) newStr[k] = *str; //Copia i caratteri di str for ( ; end > 0 ; end--, k++) newStr[k] = pad; //Scrivi i caratteri pad finali newStr[k] = '\0'; return newStr; }
/* Funzione ausiliaria che ritorna vero se la stringa in posizione k e' da eliminare. */ short IsDel(char **V, long n, long k) { long i = k + 1; while (i < n && strcmp(V[k], V[i]) > 0) i++; return (i < n); } char *Coll(char **strVec, long n) { long k, len = 0; //Calcola la somma delle for (k = 0 ; k < n ; k++) //lunghezze delle stringhe if (IsDel(strVec, n, k)) //da eliminare. len += strlen(strVec[k]); char *newStr = malloc((len + 1)*sizeof(char)); //Alloca la nuova stringa e newStr[0] = '\0'; //concatena le stringhe da for (k = 0 ; k < n ; k++) //eliminare e rilascia la if (IsDel(strVec, n, k)) { //memoria delle stringhe strcat(newStr, V[k]); //eliminate. free(V[k]); V[k] = NULL; } return newStr; }
long Com(int A[], long dimA, int B[], long dimB) { long k = 0, i; //La variabile k manterra' l'indice della prima //posizione disponibile del vettore A. for (i = 0 ; i < dimA ; i++) { long j = 0; while (j < dimB && A[i] != B[j]) j++; //Controlla se A[i] appare in B if (A[i] == B[j]) { //Se e' cosi' sposta A[i] nella A[k] = A[i]; //prima posizione disponibile, k++; //compattando cosi' il vettore. } } return k; }
typedef struct Elem { int val; struct Elem *next; } Elem;Il prototipo della funzione è int *Piccoli(const Elem *L, unsigned k). Si assume che gli interi della lista sono tutti distinti e che sono in numero maggiore di k. Si richiede che il vettore sia ordinato in senso crescente. Ad esempio se la lista è 6 -> 2 -> 7 -> 9 -> 5 -> 3 -> 10 e k = 3 allora la funzione deve restituire il vettore [2, 3, 5].
/* Funzione ausiliaria che ritorna il piu' piccolo intero strettamente maggiore di x * * contenuto nella lista L (se non esiste ritorna x). */ int MinMagg(int x, const Elem *L) { int mm = x; while (L != NULL) { int v = L->val; if (v > x && (mm == x || v < mm)) mm = v; L = L->next; } return mm; } int *Piccoli(const Elem *L, unsigned k) { int *vet = malloc(k*sizeof(int)); //Alloca il vettore const Elem *p = L; int i, min = L->val; //Scorri la lista per trovare il minimo while (p != NULL) { if (p->val < min) min = p->val; p = p->next; } vet[0] = min; for (i = 1 ; i < k ; i++) //Trova il prossimo intero piu' piccolo vet[i] = MinMagg(vet[i - 1], L); //tramite la funzione MinMagg. return vet; }
typedef struct Elem { int info; struct Elem *next; } Elem, *List;Il prototipo della funzione è List Sposta(List L, unsigned k). Ad esempio se la lista è 7 -> 4 -> 2 -> 8 -> 9 e k = 3 allora la funzione modifica la lista così 7 -> 4 -> 8 -> 9 -> 2.
List Sposta(List L, unsigned k) { List *p = &L; //Vai al k-esimo elemento mantenendo in while (*p != NULL && k > 1) { //p l'indirizzo della locazione che p = &((*p)->next); //contiene il puntatore a tale elemento. k--; } if (*p != NULL) { //Se il k-esimo elemento esiste Elem *e = *p; //toglilo dalla lista, *p = e->next; while (*p != NULL) p = &((*p)->next); //arriva alla fine della lista *p = e; //e aggancia l'elemento. e->next = NULL; } return L; }
typedef struct { short str; //1 se e' valido il campo s, 0 se e' valido il campo n union { char s[101]; //se valido contiene una stringa di lunghezza <= 100 int n; //se valido contiene un numero } val; } Rec; typedef struct Elem { char * string; struct Elem *next; } Elem, *List;Scrivere una funzione, con prototipo List Update(List L, char *nameF), che presa in input una lista di stringhe ordinata L vi inserisce, mantenendo la lista ordinata, le stringhe contenute nel file binario il cui nome nella stringa nameF e che contiene una sequenza di record di tipo Rec. La funzione non deve inserire stringhe che sono già presenti nella lista e l'ordinamento delle stringhe è quello dato dalla funzione della libreria standard strcmp. Siccome la lunghezza media delle stringhe nel file è molto minore di 100, l'allocazione delle stringhe nella lista non deve sprecare memoria. La funzione ritorna il puntatore al primo elemento della lista aggiornata. La lista di input pu anche essere vuota (L = NULL). Se la lista è "cane" -> "gatto" -> "lupo" e il file contiene {1, "leone"}, {0, 13}, {1, "cane"}, {1, "leone"}, {1, "aquila"} allora la funzione ritorna la lista "aquila" -> "cane" -> "gatto" -> "leone" -> "lupo".
/* Funzione ausiliaria che, se la stringa str non e' presente nella lista L, inserisce la stringa str nella lista ordinata L mantenendola ordinata. */ List InsOrd(List L, const char *str) { Elem **prec = &L; //Indirizzo della locazione che eventualmente dovra' contenere //il puntatore all'elemento inserito. while (*prec != NULL && strcmp(str, (*prec)->string) > 0) //Scorri la lista finche' prec = &((*prec)->next); //o la lista e' finita o trovi una //stringa maggiore od uguale a str. if (*prec == NULL || strcmp(str, (*prec)->string) != 0) { //Se non e' stata trovata //una stringa uguale a str... Elem *new = malloc(sizeof(Elem)); //alloca un nuovo elemento new->string = malloc((strlen(str) + 1)*sizeof(char)); //Alloca memoria per la stringa strcpy(new->string, str); //Copia la stringa new->next = *prec; //Inserisci il nuovo elemento *prec = new; //nella lista. } return L; } List Update(List L, char *nameF) { FILE *f = fopen(nameF, "rb"); //Apri il file binario in lettura Rec r; while (fread(&r, sizeof(Rec), 1, f) == 1) //Leggi ogni record del file... if (r.str == 1) //Se il record contiene una stringa L = InsOrd(L, r.val.s); //tenta di inserirla nella lista fclose(f); return L; }
![]() |
![]() |
Questo sito usa cookies, usandolo ne accettate la presenza. (CookiePolicy)
Torna al Dipartimento di Informatica ![]() |
|
![]() |
![]() |