/* - 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

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

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

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

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

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

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

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

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

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

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

v->l = NULL. int buc. vnd. c->vnd = vnd. struct nod *r. c->val = val. v->r = NULL. v->val = -1. c->buc = buc.h> <string./* . } *v. int len) { struct nod *n. val. // daca nu exista nodul respectiv se creeaza fizic // si se adauga legaturile (fara valoare) if (v == NULL) { v = (struct nod*)malloc(sizeof(struct nod)). buc. } // 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]. // functie recursiva de inserare in arbore int insert_arb (struct nod *c. } 12 . // valoarea // nr bucati pe stoc // nr bucati vandute // left // right // varful listei struct nod *l. c = v. int poz. int vnd.h> <conio.h> struct nod { int val. return 1.h> <stdlib.varianta cu arbori */ #include #include #include #include <stdio.

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

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

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

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

Sign up to vote on this title
UsefulNot useful