Lezione 23
Discussione dell'esercizio 5 dell'Esempio 1.
#include <stdio.h>

void fcutlines(char *fname1, char *fname2, int i, int n) {
    FILE *f1 = fopen(fname1, "r");     //Apri il primo file in lettura
    if (f1 == NULL) return;
    FILE *f2 = fopen(fname2, "w");     //Apri il secondo file in scrittura
    if (f2 == NULL) {
        fclose(f1);
        return;
    }
    char line[101];
    int j = 0;
    while (fgets(line, 101, f1) != NULL) {
        if (j < i || j >= i + n)
            fprintf(f2, "%s", line);
        j++;
    }
    fclose(f1);
    fclose(f2);
}
Discussione dell'esercizio 6 dell'Esempio 1.
#include <stdlib.h>

void compact_ms(MSet M) {
    if (M == NULL)
        return;
    MElem *e = M;
    while (e->next != NULL) {
        MElem *p = e;
        while (p->next != NULL) {
            MElem *d = p->next;
            if (d->val == e->val) {
                e->count += d->count;
                p->next = d->next;
                free(d);
            } else
                p = p->next;
        }
        e = e->next;
    }
}
Discussione dell'esercizio 4 dell'Esempio 2.
#include <stdlib.h>
#include <string.h>

List copytail(List L, int k) {
    if (L == NULL) return L;
    Elem *copy = malloc(sizeof(Elem));    //Crea il nuovo elemento
    Elem *last = L;
    while (last->next != NULL)            //Vai all'ultimo elemento della lista
        last = last->next;
          //Alloca il blocco per mantenere la stringa da copiare
    copy->str = malloc((strlen(last->str) + 1)*sizeof(char));
    strcpy(copy->str, last->str);         //Copia la stringa dell'ultimo elemento
    Elem **pre = &L;
    while (k > 0 && *pre != NULL) {       //Vai alla locazione in cui agganciare
        pre = &((*pre)->next);            //il nuovo elemento
        k--;
    }
    copy->next = *pre;                    //Inserisci il nuovo elemento nella lista
    *pre = copy;
    return L;
}
Discussione dell'esercizio 5 dell'Esempio 2.
#include <stdio.h>

void insrec(char *fname1, char *fname2, Record rec) {
    FILE *f1 = fopen(fname1, "rb");    //Apri il primo file in lettura
    if (f1 == NULL) return;
    FILE *f2 = fopen(fname2, "wb");    //Apri il secondo file in scrittura
    if (f2 == NULL) {
         fclose(f1);
         return;
    }
    int ins = 0;       //0 se il record rec non è stato ancora inserito, 1 altrimenti
    Record r;
    while (fread(&r, sizeof(Record), 1, f1) == 1) {    //Leggi i record dal primo file
        if (!ins && r.value > rec.value) {
            fwrite(&rec, sizeof(Record), 1, f2);       //Scrivi il record rec
            ins = 1;
        }
        fwrite(&r, sizeof(Record), 1, f2);
    }
    if (!ins)
        fwrite(&rec, sizeof(Record), 1, f2);
    fclose(f1);
    fclose(f2);
}
Discussione dell'esercizio 3 dell'Esempio 1.
#include <stdlib.h>

int *eqrowcol(int n, char M[n][n], int *cnt) {
    int *eqA = NULL, i;
    *cnt = 0;
    for (i = 0 ; i < n ; i++) {
        int j, equal = 1;
        for (j = 0 ; j < n && equal ; j++)
            if (M[i][j] != M[j][i]) equal = 0;
        if (equal) {
            eqA = realloc(eqA, (*cnt + 1)*sizeof(int));
            eqA[*cnt] = i;
            (*cnt)++;
        }
    }
    return eqA;
}
Ulteriori esercizi Esempio 3.