Witam, mam program który wczytuje mi tylko jeden obraz pgm do listy.
Moje pytanie brzmi jak go zmienić, aby można było wczytać kilka obrazów (po wczytaniu kolejnego w tym programie poprzedni zostaje usunięty) naraz i wykonywać na nich operacje, np użytkownik wybiera plik nad którym chce pracować spośród wczytanych.

Z góry dziękuję za odpowiedź.

#include <stdio.h>
#include <string.h>

#define MAXNAMELENGTH 40

typedef struct {
    char* pointer;
    int x, y, scale;
    char name[MAXNAMELENGTH];
    short int modified;
    struct image *next;
} image;

image * lista=NULL;

void clearscreen() {
#ifdef _WIN32
    system("cls");
#else
    system("clear");
#endif
}

void sleep_(int ms) {
#ifdef _WIN32
    sleep(ms);
#else
    usleep(ms * 1000);
#endif
}

#define DL_LINII 80
/*  funckja zostala zmodyfikowana tak, aby "tablica" zostala tworzona na wielkosc obrazu,
    poprawiona zastala kontrola odczytywanych wartosci */
int img_load(FILE* p, image* img) {
    char s[DL_LINII];
    int znak,koniec=0,i,j;
    unsigned int element;

    /*sprawdzenie czy podano prawidłowy uchwyt pliku */
    if (p==NULL) {
        fprintf(stderr,"Blad: Nie podano uchwytu do pliku\n");
        return(0);
    }
    if (fgets(s,DL_LINII,p)==NULL) koniec=1;
        /* Sprawdzenie "numeru magicznego - powinien być P2 */
        if ( (s[0]!='P') || (s[1]!='2') || koniec) {
        fprintf(stderr,"Blad: To nie jest plik PGM\n");
        return(0);
    }
    /* Pominiecie komentarzy */
    do {
        if ((znak=fgetc(p))=='#') {
            if (fgets(s,DL_LINII,p)==NULL) koniec=1;
        }  else {
            ungetc(znak,p);
        }
    } while (! koniec && znak=='#');

    /* Pobranie wymiarow obrazu i liczby odcieni szarosci */
    if (fscanf(p,"%d %d %d",&img->x, &img->y, &img->scale)!=3) {
        fprintf(stderr,"Blad: Brak wymiarow obrazu lub liczby stopni szarosci\n");
        return(0);
    }

   if (img->pointer != NULL) { /* jezeli orbaz istnieje juz w pamieci, zwolnij *
        dodaj(img->pointer);

    }
    img->pointer = malloc(img->x * img->y); /* przyznacz miejsce dla obrazu */
    if (img->pointer == NULL) {
        fprintf(stderr,"Blad: malloc\n");
        return 0;
    }

  /* Pobranie obrazu i zapisanie w tablicy*/
    for (j=0; j < img->y; j++) {
        for (i=0; i < img->x; i++) {
            /* wypelnij obszar w pamieci na wzor tablicy dwuwymiarowej */
            if (fscanf(p,"%u", &element)!=1) {
                fprintf(stderr,"Blad: Niewlasciwe wymiary obrazu\n");
                return(0);
            }
            if (element > img->scale) element = img->scale;
            *(unsigned char*)(img->pointer + i + j*img->x) = element;
            /*printf("%u  ", *(unsigned char*)(img->pointer));*/
        }
    }
    return img->x*img->y;
}



void img_init(image* img) {
    memset(img, 0, sizeof(image)); /* inicjuje obiekt image */
}

void img_open(image* img) {
    char name[MAXNAMELENGTH];
    FILE* file;
    clearscreen();
    printf("(Wczytaj)\nNazwa pliku: ");
    scanf("%s", &name);
    printf("\n");
    file = fopen(name, "r");
    if (file == NULL) {
        printf("Blad: Nie mozna otworzyc pliku ""%s""\n", name);
        sleep_(1500);
    } else {
        
        if (img->pointer != NULL) {  jezeli jakis obraz jest juz wczytany, usun go z pamieci, zeruj zmienne
            free(img->pointer);
            img_init(img);
        }  
        if (img_load(file, img)) {
            memcpy(img->name, name, MAXNAMELENGTH); /* zapisz nazwe pliku */
            img->modified = 0;
            fclose(file);
        } else {
            img_init(img);
            printf("Blad: Nie mozna zaladowac obrazu\n");
            sleep_(1500);
        }
    }
}

//tu jakis przykład operacji na pliku
void img_invert(image *img) { /* negatyw */
    int i, j;
    char* pixel;
    if (img->pointer != NULL) {
        clearscreen();
        printf("Negatyw...\n");
        for (i=0; i < img->x; i++) {
            for (j=0; j < img->y; j++) {
                pixel = img->pointer + i + j*img->x;
                *pixel = img->scale - *pixel; /* odwraca kolor kazdego elementu "tablicy" */
            }
        }
        img->modified = 1;
        printf("Gotowe\n");
        sleep_(500);
    }
}

int main() {
    int input;
    image img;
    img_init(&img);
    do {
        clearscreen();
        if (img.pointer != NULL) { /* jezeli obraz jest wczytany */
            printf("Otwarty plik: %s%c [%dx%d]\n\n", img.name, img.modified? '*' : ' ', img.x, img.y);
            printf("Menu:\n");
            printf(" 1. Wczytaj\n");
            printf(" 2. Negatyw\n");
        } else {
            printf("Menu:\n");
            printf(" 1. Wczytaj\n");
        }
        printf(" 0. Wyjdz\n\n");
        printf(" Wybor: ");
        scanf("%d", &input);
        if (img.pointer == NULL) { /* jezeli obraz nie jest jeszcze wczytany */
            if (input > 1 || input < 0) { /* jezeli wprowadzona niepoprawna opcja */
                printf("Niepoprawna opcja\n");
                sleep_(600);
                continue;
            }
        }
        switch(input) {
            case 1: /* wczytwyanie */
                if (img.pointer == NULL) { /* jezeli plik nie jest jeszcze otwarty */
                    img_open(&img);
                } else {
                    if (img.modified) {
                        printf("Plik nie zostal zapisany od ostatniej zmiany\n");
                        printf("Zapisac?\n 1. tak\n 0. nie\n");
                        scanf("%d", &input);
                        if (input == 1) {
                            img_save(&img);
                        } else
                            input = -1; /* aby program nie zostal zamkniety */
                    }
                    img_open(&img);
                }
                break;
            case 2: img_invert(&img); break; /* negatyw */
            case 0: /* wyjscie */
                if (img.modified){
                    printf("Zapisac plik przed wyjsciem?\n 1. tak\n 0. nie\n");
                    scanf("%d", &input);
                    if (input == 1) {
                        img_save(&img);
                        input = 0; /* wymus wyjscie z petli */
                        clearscreen();
                    }
                }
                break;
            default:
                printf("Niepoprawna opcja\n");
                sleep_(600);
        }
    } while (input != 0);
    if (img.pointer != NULL) {
        free(img.pointer);
    }
    clearscreen();
}