/* - varianta cu liste simplu inlantuite */ #include #include #include #include <stdio.h> <stdlib.h> <conio.h> <string.

h>

struct nod { int cv[15]; int val; int buc; int vnd;

// // // //

codul produsului valoarea nr bucati pe stoc nr bucati vandute

struct nod *urm; // urmatorul element } *v; // varful listei // Capatul (sfarsitul) listei a fost considerat acel element // care are valoarea pointerului 'c->urm' = NULL // redefinirea functiei pow(n,exp) -- ridicarea lui n la puterea exp long pow (int n, int exp) { int i, val = 1; for (i=0; i<exp; i++) val *= n; return val; } // functie de conversie din baza 2 in baza 10 int bin2dec (int bin[15]) { int i, dec = 0; for (i=0; i<15 && bin[i]!=-1; i++) dec += pow(2, bin[i]); return dec; } // functie de afisare a produselor din stoc void afisare (struct nod *v) { int i; struct nod *c = v; printf("\n\nProduse in stoc:\n"); while (c) { if (c->buc > 0) { for (i=0; (i<15) && (c->cv[i] != -1); i++) printf("%d", c->cv[i]);

1

*n. c = c->urm. getch(). (i<15) && (c->cv[i] != -1). printf("\n\nAdaugare produs nou:\n"). len. c->val. c = (struct nod*)malloc(sizeof(struct nod)). getch(). *m. c = c->urm. i=0. } // functie de afisare a produselor vandute void afisarev (struct nod *v) { int i. c->vnd). gets(codtemp). struct nod *c = v. while (c) { if (c->vnd > 0) { for (i=0. c->cv[i]). } printf("\nApasati o tasta pentru a continua. c->val. valid=1. valid = 1. 2 . } while (len==0 || len>15 || valid==0). i<len. len = strlen(codtemp). i++) if (codtemp[i]!='0' && codtemp[i]!='1') valid = 0. } printf("\t%d\t%d\n". for (i=0.} printf("\t%d\t%d\n". do { printf("Cod: "). c->buc). } printf("\nApasati o tasta pentru a continua."). int cod[15]."). i++) printf("%d". char codtemp[15]. } // functie de adaugare de noi produse void adaugare (void) { struct nod *c. printf("\n\nProduse vandute:\n").

i++) c->cv[i] = -1. inseram inaintea lui m n = m. // daca se indeplineste conditia. scanf("%d". 3 . &c->val). } else { n = v. i<15. for (i=0.// codul nu poate sa depaseasca 15 caractere printf("Valoare: "). // am folosit n pt a retine elementul anterior lui m // este necesar pt a introduce pe c intre n si m } n m c if (m == v) { if (!v) // v == NULL { v = c. &c->vnd). m = m->urm. i++) { c->cv[i] = codtemp[i]-'0'. i<len. // adaugarea elementului in lista propriu-zisa // -. scanf("%d". } for (i=len. v->urm = NULL.crearea legaturilor -m = v. printf("Bucati candute: "). while (m) // m != NULL { if ( bin2dec(c->cv) < bin2dec(m->cv) ) break. scanf("%d". &c->buc). printf("Bucati: "). n = v.

len = strlen(codtemp). char codtemp[15]. } gets(codtemp). } else { } n->urm = c. } if (good) { 4 . } // golirea buffer-ului pt citire noua // functie de stergere a unui element void stergere (void) { struct nod *c. i++) if (c->cv[i] != cod[i]) good = 0. c = v. } while (len>15). good = 0. c->urm = m. } for (i=len. i++) cod[i] = -1. printf("\n\nStergere produs:\n"). *m. m = c. cod[15]. i<len. do { printf("Cod: "). i<15. while (c) { good = 1. len.v = c. gets(codtemp). c = c->urm. i<15. int i=0. for (i=0. i++) { cod[i] = codtemp[i]-'0'. v->urm = n. if (good) break. // codul nu poate sa depaseasca 15 caractere for (i=0.

m c printf("\nApasati o tasta pentru a continua. Afisare produse vandute\n"). 5 . break. afisarev(v). m->urm = c->urm. } afisare(v). Iesire\n"). printf(" 2. break. printf(" 4. break."). printf(" 1. Afisare produse in stoc\n"). opt = getche().if (v == c) v = v->urm. printf("\nProdusul precizat nu exista. adaugare(). do { clrscr(). switch (opt) { case '1': case '2': case '3': case '4': } } while (opt!='0')."). } else printf("\nProdusul precizat a fost sters. printf("\n"). Stergere\n"). printf("\n"). break. printf(" 0. getch(). } void main() { char opt. printf(" Optiune: "). stergere(). free(c)."). printf(" 3. Adaugare\n").

} // functie de conversie din baza 2 in baza 10 int bin2dec (int bin[15]) { int i. int buc. int exp) { int i.h> struct nod { int cv[15]. i<15 && bin[i]!=-1. // elementul urmator struct nod *ant.ridicarea lui n la puterea exp long pow (int n.exp) -. (i<15) && (c->cv[i] != -1). i++) dec += pow(2. while (c) { if (c->buc > 0) { for (i=0. return dec. int val. dec = 0.h> <conio. struct nod *c = v. // varful listei // Capatul (sfarsitul) listei a fost considerat acel element // care are valoarea pointerului 'c->urm' = NULL // redefinirea functiei pow(n.h> <string. val = 1. i++) val *= n. for (i=0. } // functie de afisare a produselor din stoc void afisare (struct nod *v) { int i. return val.h> <stdlib.varianta cu liste dublu inlantuite */ #include #include #include #include <stdio. // elementul anterior } *v. // // // // codul produsului valoarea nr bucati pe stoc nr bucati vandute ant inf urm struct nod *urm. i++) printf("%d". bin[i]). c->cv[i]). i<exp. for (i=0. 6 . printf("\n\nProduse in stoc:\n"). int vnd./* .

c->val. good=0. c->cv[i]). } c = c->urm. for (i=0. printf("\n\nAdaugare produs nou:\n"). printf("\n\nProduse vandute:\n"). } // functie de afisare a produselor vandute void afisarev (struct nod *v) { int i. i++) printf("%d". len. c->buc). while (c) { if (c->vnd > 0) { for (i=0. getch(). *n. } printf("\nApasati o tasta pentru a continua. *m. i<len. len = strlen(codtemp). c->val. c->vnd). valid=1.printf("\t%d\t%d\n". getch(). i=0. } // functie de adaugare de noi produse void adaugare (void) { struct nod *c. printf("\t%d\t%d\n". int cod[15]. char codtemp[15]. do { printf("Cod: "). struct nod *c = v.")."). gets(codtemp). c = (struct nod*)malloc(sizeof(struct nod)). 7 . } c = c->urm. i++) if (codtemp[i]!='0' && codtemp[i]!='1') valid = 0. valid = 1. (i<15) && (c->cv[i] != -1). } printf("\nApasati o tasta pentru a continua.

break. i<15. // codul nu poate sa depaseasca 15 caractere printf("Valoare: "). inseram inaintea lui m } m = m->urm.crearea legaturilor -m = v. c->urm = m. &c->vnd). scanf("%d". // v != NULL && m->urm != NULL if ( bin2dec(c->cv) < bin2dec(m->cv) ) { good = 1. while (v && m->urm) { good = 0. 8 . c->ant = NULL. &c->val).} while (len==0 || len>15 || valid==0). &c->buc). // adaugarea elementului in lista propriu-zisa // -. } for (i=len. } // daca se indeplineste conditia. i++) { c->cv[i] = codtemp[i]-'0'. printf("Bucati candute: "). i<len. m->ant = c. scanf("%d". scanf("%d". i++) c->cv[i] = -1. printf("Bucati: "). for (i=0. n m c if (good) { if (m == v) { v = c.

gets(codtemp). v->ant = NULL. int i=0. v->urm = NULL. } // golirea buffer-ului pt citire noua c // functie de stergere a unui element void stergere (void) { struct nod *c. len. c->urm = NULL. char codtemp[15]. v->urm = m. good = 0.} else { n = m->ant. } else { // nodul inserat devine varful listei v = c. 9 . c->ant = m. c->urm = m. n->urm = c. c->ant = n. } else { } } } m->urm = c. cod[15]. v->ant = NULL. } else { } if (m == v) { if (!v) // v == NULL { // lista este vida // nodul inserat devine primul din lista v = c. m->ant = c.

printf("\nProdusul precizat a fost sters. gets(codtemp). do 10 . i++) cod[i] = -1. } c = c->urm."). free(c). c = v. for (i=0. while (c) { good = 1. } while (len>15). i++) if (c->cv[i] != cod[i]) good = 0. getch(). // codul nu poate sa depaseasca 15 caractere for (i=0. if (good) { if (v == c) v = v->urm."). } for (i=len. do { printf("Cod: "). i<len. i<15. if (good) break."). i++) { cod[i] = codtemp[i]-'0'. i<15. c->ant->urm = c->urm. len = strlen(codtemp). } else printf("\nProdusul precizat nu exista.printf("\n\nStergere produs:\n"). printf("\nApasati o tasta pentru a continua. } void main() { char opt.

break. printf(" Optiune: "). opt = getche(). printf(" 4. printf(" 0. break. break. Iesire\n"). Afisare produse vandute\n"). 11 . switch (opt) { case '1': case '2': case '3': case '4': } } while (opt!='0'). printf(" 3. afisarev(v). break. adaugare(). printf("\n").{ clrscr(). printf("\n"). Afisare produse in stoc\n"). printf(" 2. Stergere\n"). Adaugare\n"). printf(" 1. stergere(). } afisare(v).

} *v. struct nod *r. return 1. } 12 . // functie recursiva de inserare in arbore int insert_arb (struct nod *c. int len) { struct nod *n. buc. c = v. int vnd. val. v->r = NULL. // daca nu exista nodul respectiv se creeaza fizic // si se adauga legaturile (fara valoare) if (v == NULL) { v = (struct nod*)malloc(sizeof(struct nod)).h> <stdlib. v->val = -1. c->vnd = vnd.h> struct nod { int val.h> <string.h> <conio.varianta cu arbori */ #include #include #include #include <stdio. } // nodul respectiv este pe pozitia dorita si se // scrie informatia nodului daca e cazul if (poz==len) { // valoarea nodului nu este nula => codul mai e folosit // se ignora cea de-a doua valoare if (c->val!=-1) return 0. int cv[15]. c->buc = buc./* . vnd. int poz. // valoarea // nr bucati pe stoc // nr bucati vandute // left // right // varful listei struct nod *l. int buc. c->val = val. v->l = NULL.

poz+1. for (i=0. char codtemp[15]. scanf("%d". i<len. } } // functie de adaugare produs nou void adaugare (void) { int cod[15]. 0 valid = 1. len = strlen(codtemp). n->val = -1. len). len). valid=1. n->l = NULL. do { v 1 printf("Cod: "). len. poz+1. } insert_arb(c->r. 13 . i=0. printf("\n\nAdaugare produs nou:\n"). c->r = n. gets(codtemp). } while (len==0 || len>15 || valid==0). n->r = NULL.// daca pozitia curenta din cod este 1 se merge // pe partea dreapta a arborelui if (cv[poz]==1) { if (c->r == NULL) // daca nu exista nodul din dreapta { // se creaza fizic (alocare+legaturi) n = (struct nod*)malloc(sizeof(struct nod)). n->val = -1. c->l = n. i++) if (codtemp[i]!='0' && codtemp[i]!='1') valid = 0. n->l = NULL. } else { if (c->l == NULL) // daca nu exista nodul din stanga { // se creaza fizic (alocare+legaturi) n = (struct nod*)malloc(sizeof(struct nod)). n->r = NULL. // codul nu poate sa depaseasca 15 caractere printf("Valoare: "). } insert_arb(c->l. &val).

%d\n". getch(). v->buc. v->buc. %d %d\n". printf("Bucati candute: "). i<len. } } // functia de afisare void afisare (struct nod *v) { printf("\n\nProduse in stoc:\n"). scanf("%d". 14 . v->vnd). v->vnd).x). for (i=0. } for (i=len. gets(codtemp). int x) { if (v != NULL) { if (v->val != -1) if (x == 0) printf("%d %d else if (v->vnd>0) printf("%d if (v->l != NULL) afis_rec (v->l.0.crearea legaturilor -if (insert_arb(v. // adaugarea elementului in lista propriu-zisa // -.len) == 1) printf("\nProdusul a fost introdus cu succes.x). v->val. } // functie recursiva pentru afisare // x == 0 => afisare toate produsele // x == 1 => afisare produsele vandute int afis_rec (struct nod *v.\n\n"). i++) { cv[i] = codtemp[i]-'0'.\n\n"). i++) cv[i] = -1. i<15. &buc). v->val. // golirea buffer-ului pt citire noua printf("\nApasati o tasta pentru a continua."). if (v->r != NULL) afis_rec (v->r. &vnd). scanf("%d". else printf("\nProdusul exista deja in baza de date.printf("Bucati: ").

int cod[15]. printf("\nApasati o tasta pentru a continua. c->vnd = 0. } else { // se anuleaza nodul (valorile) c->val = -1. } // afisare produse vandute void afisarev (struct nod *v) { printf("\n\nProduse vandute:\n"). getch().len).cod. int poz. c = 0. c->buc = 0.poz+1.0).len). cod[15]. int len) { if (!c) // c == NULL return 0.poz+1. 1 c 15 . } } // functia de stergere void stergere (void) { int i=0. else stergere_rec (c->l. printf("\nApasati o tasta pentru a continua. return 1.1). } // functie recursiva de stergere int stergere_rec (struct nod *c. return 1. } } else { if (cod[poz]==1) stergere_rec (c->r."). if (poz == len) { // nodul nu mai are descendenti => stergere fizica if (c->l==NULL && c->r==NULL) { free(c).cod. good = 0. afis_rec (v. getch().afis_rec (v."). len.

Iesire\n").len)) printf("\nProdusul precizat a fost sters. Afisare produse vandute\n"). break. switch (opt) { case '1': case '2': case '3': case '4': } } while (opt!='0'). opt = getche()."). else printf("\nProdusul precizat nu exista. break. i++) { cod[i] = codtemp[i]-'0'. for (i=0. break.char codtemp[15]. // codul nu poate sa depaseasca 15 caractere si trebuie sa fie valid for (i=0. stergere(). break.0. do { clrscr(). getch(). afisarev(v). printf("\n"). i++) if (codtemp[i]!='0' && codtemp[i]!='1') good = 0. printf("\n\nApasati o tasta pentru a continua.cod. printf("\n"). printf(" Optiune: "). } if (stergere_rec(v. adaugare(). printf(" 3. } afisare(v). Adaugare\n"). printf(" 1."). } void main() { char opt. len = strlen(codtemp). printf(" 4. 16 . } while (len==0 || len>15 || good==0). do { printf("Cod: "). printf(" 0. gets(codtemp)."). Stergere\n"). i<len. good = 1. printf(" 2. Afisare produse in stoc\n"). printf("\n\nStergere produs:\n"). i<len.