Liste neordonate simplu inlantute


Problema
Sa se scrie un program care tine evidenta stocului de medicamente al unei farmacii. Pentru fiecare dintre produsele existente se cunoaste numele si cantitatea din stoc. Datele de intrare initiale sunt intr-un fisier al carui nume se da in linia de comanda.
Programul va permite executia urmatoarelor comenzi:

-a nume medicament cantitate adauga un medicament nou
-e nume medicament verifica existenta unui medicament in depozit
-s nume medicament cantitate scoate din depozit o anumita cantitate din un medicament
-l afiseaza continutul depozitului
-h informatii despre executia programului
-x terminarea programului

Exemplu de fisier de intrare

aspirina 456
paracetamol 56
fenosept 234
bixtonim 23

Rezolvarea problemei farmacie.c

Tipurile de date folosite

        /* pentru un medicament se pastreaza numele si cantitatea disponibila */
	typedef struct {
		char * nume;
		int cantitate;
	} medicament_t;
	
	/* un element al listei pastreaza informatii despre un medicament si 
		adresa urmatorui element din lista */
	typedef struct s {
		medicament_t med; // informatia utila
		struct s* next; // adresa urmatorului element
	} nod_t;
		
	/* inceputul listei va fi adresa primului element */
    	typedef nod_t* lista_t;
		

Functia main - operatii

Alte functii - pe scurt

	/* insereaza un nou medicament in lista, pe prima pozitie */
	void inserareinceput(lista_t* list, medicament_t* m);

	/* adauga in depozit cantitatea m->cantitate din medicamentul m->nume 
		daca pana acum nu exista medicamentul resp in depozit, 
		il adauga la inceputul listei*/
	void adaug(lista_t* list, medicament_t *m);	   
		
	/* afiseaza continutul listei(numele si cantitatea pentru fiecare 
		dintre medicamentele din depozit) */
	void afisare(lista_t list);

	/* cauta un medicament in lista. 
		daca il gaseste returneaza adresa elementului care-l pastreaza. 
		daca nu-l gaseste returneaza NULL */
	nod_t *cauta(lista_t list, medicament_t* m);
	
	/* sterge primul element al listei */
	void sterginceput(lista_t *lista);

	/* daca elementul nod exista in lista, il sterge */
	void sterg(lista_t* lista, nod_t *nod);

	/* afiseaza formatul comenzilor care pot fi executate */
    	void ajutor();

	/* scoate din stoc o cantitate data (m->cantitate) din medicamentul (m->nume) */	
    	void retragere(lista_t *lista, medicament_t* m);