Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <conio.h>
- #include <string.h>
- #include <stdlib.h>
- /* tipul nodului sublistei */
- typedef struct nod_sublista {
- char *titlu;
- int an;
- struct nod_sublista *urm;
- }nodsl;
- /* tipul nodului arborelui binar ordonat */
- typedef struct nod_arbore {
- char *autor;
- 3
- nodsl *primsl; /* pointer catre primul nod al sublistei */
- struct nod_arbore *st,*dr;
- }nod;
- /* prototipurile functiilor */
- nod *citireFisier(nod*);
- nod *adauga(nod*,char*,char*,int);
- nod *adaugaArb(nod*,char*);
- nodsl *adaugasl(char*,int,nodsl*);
- void afisare(nod*);
- void afisaresl(nodsl*);
- void cautaCarte(nod*,char*,char*);
- nod *cauta(nod*,char*);
- nodsl *cautasl(char*,nodsl*);
- void eliminaCarte(nod*,char*,char*);
- nodsl *eliminasl(char*,nodsl*);
- nod *elimina(nod*,char*);
- nod *elimina2fii(nod*,nod*);
- void mesajEroare(void);
- int main(void) {
- /* radacina arborelui */
- nod *rad=NULL;
- int opt;
- char autor[31],titlu[51];
- clrscr();
- rad=citireFisier(rad);
- do {
- clrscr();
- puts("1. Afisarea tuturor datelor");
- puts("2. Afisarea anului de aparitie a unei carti");
- puts("3. Eliminarea din evidenta a unei carti");
- puts("4. Eliminarea din evidenta a unui autor");
- puts("0. Terminare program");
- printf("Optiunea dvs: "); scanf("%d",&opt);
- fflush(stdin);
- switch(opt) {
- case 1: if(rad==NULL)
- printf("\nArbore vid!");
- else
- afisare(rad);
- getch(); break;
- case 2: printf("\nAutorul: "); scanf("%s",autor);
- printf("Titlul: "); scanf("%s",titlu);
- cautaCarte(rad,autor,titlu);
- break;
- case 3: printf("\nAutorul: "); scanf("%s",autor);
- printf("Titlul: "); scanf("%s",titlu);
- eliminaCarte(rad,autor,titlu);
- break;
- case 4: printf("\nAutorul: "); scanf("%s",autor);
- rad=elimina(rad,autor);
- break;
- case 0: printf("\nProgram terminat! Apasati o tasta... ");
- getch(); break;
- default: printf("\nOptiune gresita! Apasati o tasta... ");
- getch();
- }
- }while(opt!=0);
- return 0;
- }
- 4
- nod *citireFisier(nod *rad) {
- FILE *f;
- char autor[31],titlu[51];
- int an;
- f=fopen("dep.txt","rt");
- if(f==NULL) {
- printf("\nEroare la deschiderea fisierului!");
- getch();
- exit(1);
- }
- while(fscanf(f,"%s %s %d",autor,titlu,&an)!=EOF) {
- rad=adauga(rad,autor,titlu,an);
- }
- fclose(f);
- printf("\nBaza de date a fost initializata! Apasati o tasta... ");
- getch();
- return rad;
- }
- /* cautarea unui autor - cautare in arbore */
- nod *cauta(nod *t,char *autor) {
- if(t==NULL)
- return NULL; /* autorul nu a fost gasit */
- else
- if(strcmp(autor,t->autor)<0)
- return cauta(t->st,autor);
- else
- if(strcmp(autor,t->autor)>0)
- return cauta(t->dr,autor);
- else
- return t; /* autorul a fost gasit */
- }
- /* mesaj de eroare la alocare spatiu de memorie */
- void mesajEroare(void) {
- printf("Eroare la alocarea spatiului de memorie!");
- getch();
- }
- /* adaugare */
- nod *adauga(nod *rad,char *autor,char *titlu,int an) {
- nod *nou,*q1,*q2;
- /* se cauta autorul in arbore */
- nou=cauta(rad,autor);
- /* daca nu este gasit, se adauga */
- if(nou==NULL) {
- /* se adauga in arbore */
- rad=adaugaArb(rad,autor);
- /* se cauta din nou pentru a putea accesa sublista sa */
- nou=cauta(rad,autor);
- nou->primsl=NULL;
- }
- /* completare sublista */
- nou->primsl=adaugasl(titlu,an,nou->primsl);
- return rad;
- }
- /* adaugarea in arbore se face in ordine alfabetica dupa autor */
- nod *adaugaArb(nod *t,char *autor) {
- if(t==NULL) { /* s-a gasit locul de adaugare */
- 5
- t=(nod*)malloc(sizeof(nod));
- if(t==NULL) {
- mesajEroare();
- return NULL;
- }
- t->autor=(char*)malloc(strlen(autor)+1);
- if(t->autor==NULL) {
- mesajEroare();
- return NULL;
- }
- strcpy(t->autor,autor);
- t->st=t->dr=NULL;
- }
- else
- if(strcmp(autor,t->autor)<0)
- t->st=adaugaArb(t->st,autor);
- else
- if(strcmp(autor,t->autor)>0)
- t->dr=adaugaArb(t->dr,autor);
- return t;
- }
- /* adaugarea in sublista; sublista nu este obligatoriu ordonata, deci
- modul de adaugare este la alegere;
- s-a optat pt adaugarea la inceputul listei */
- nodsl *adaugasl(char *titlu,int an,nodsl *primsl) {
- nodsl *nou;
- nou=(nodsl*)malloc(sizeof(nodsl));
- if(nou==NULL) {
- mesajEroare();
- return primsl;
- }
- nou->titlu=(char*)malloc(strlen(titlu)+1);
- if(nou->titlu==NULL) {
- mesajEroare();
- return primsl;
- }
- strcpy(nou->titlu,titlu);
- nou->an=an;
- nou->urm=primsl;
- return nou;
- }
- /* afisare - parcurgerea arborelui in inordine */
- void afisare(nod *t) {
- if(t!=NULL) {
- afisare(t->st);
- printf("\n%s",t->autor);
- afisaresl(t->primsl);
- afisare(t->dr);
- }
- }
- void afisaresl(nodsl *primsl) {
- nodsl *q;
- if(primsl==NULL) {
- printf("\n\tSublista vida!\n");
- return;
- }
- for(q=primsl;q!=NULL;q=q->urm)
- 6
- printf("\n\t%s %d",q->titlu,q->an);
- }
- /* cautarea unei carti si afisarea anului de aparitie */
- void cautaCarte(nod *rad,char *autor,char *titlu) {
- nod *p;
- nodsl *q;
- p=cauta(rad,autor);
- if(p==NULL) {
- printf("\nAutorul nu este in evidenta!");
- getch();
- return;
- }
- q=cautasl(titlu,p->primsl);
- if(q==NULL) {
- printf("\nCartea nu este in evidenta!");
- getch();
- return;
- }
- printf("\nAnul aparitiei cartii \"%s\", autor %s: %d",titlu,autor,q->an);
- getch();
- }
- nodsl *cautasl(char *titlu,nodsl *primsl) {
- nodsl *q;
- for(q=primsl;q!=NULL && strcmp(q->titlu,titlu)!=0;q=q->urm);
- return q;
- }
- /* eliminarea unei carti din evidenta */
- void eliminaCarte(nod *rad,char *autor,char *titlu) {
- nod *p;
- p=cauta(rad,autor);
- if(p==NULL) {
- printf("\nAutorul nu apare in evidenta!");
- getch();
- return;
- }
- p->primsl=eliminasl(titlu,p->primsl);
- }
- nodsl *eliminasl(char *titlu,nodsl *primsl) {
- nodsl *q1,*q2; /* q1 - nodul de sters, q2 - nodul precedent */
- for(q1=q2=primsl;q1!=NULL && strcmp(q1->titlu,titlu)!=NULL;q2=q1,q1=q1->urm);
- if(q1==NULL) {
- printf("\nCartea nu apare in evdienta!");
- getch();
- return primsl;
- }
- if(q1!=q2) {
- q2->urm=q1->urm;
- }
- else {
- primsl=q1->urm;
- }
- free(q1->titlu);
- free(q1);
- return primsl;
- }
- 7
- /* eliminare autor din arbore */
- nod *elimina(nod *t,char *autor) {
- nod *q;
- if(t==NULL) {
- printf("\nAutorul nu apare in evidenta!");
- getch();
- }
- else
- if(strcmp(autor,t->autor)<0)
- t->st=elimina(t->st,autor);
- else
- if(strcmp(autor,t->autor)>0)
- t->dr=elimina(t->dr,autor);
- else /* a fost gasit nodul de eliminat */ {
- /* stergere sublista */
- while(t->primsl!=NULL)
- t->primsl=eliminasl(t->primsl->titlu,t->primsl);
- if(t->st==NULL) { /* nu are fiu stang */
- q=t->dr; /* se retine adresa fiului drept */
- free(t->autor); free(t);
- return q;
- }
- else
- if(t->dr==NULL) { /* nu are fiu drept */
- q=t->st; /* se retine adresa nodului drept */
- free(t->autor); free(t);
- return q;
- }
- else /* are ambii fii */
- t->st=elimina2fii(t->st,t);
- }
- return t;
- }
- /* functie auxiliara pt eliminarea unui nod cu 2 fii din arbore */
- nod *elimina2fii(nod *t,nod *p) {
- nod *q,*aux;
- q=t;
- /* gaseste cel mai mare nod din subarborele drept al lui p */
- if(q->dr!=NULL)
- q->dr=elimina2fii(q->dr,p);
- else {
- /* muta autorul din nodul q in nodul p */
- free(p->autor); p->autor=q->autor; p->primsl=q->primsl;
- aux=q;
- q=q->st; /* este retinuta adresa fiului stang a lui q */
- free(aux);
- }
- return q;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement