Advertisement
Guest User

Untitled

a guest
Dec 16th, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.82 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5. /* tipul nodului sublistei */
  6. typedef struct nod_sublista {
  7. char *titlu;
  8. int an;
  9. struct nod_sublista *urm;
  10. }nodsl;
  11. /* tipul nodului arborelui binar ordonat */
  12. typedef struct nod_arbore {
  13. char *autor;
  14.  
  15. 3
  16.  
  17. nodsl *primsl; /* pointer catre primul nod al sublistei */
  18. struct nod_arbore *st,*dr;
  19. }nod;
  20. /* prototipurile functiilor */
  21. nod *citireFisier(nod*);
  22. nod *adauga(nod*,char*,char*,int);
  23. nod *adaugaArb(nod*,char*);
  24. nodsl *adaugasl(char*,int,nodsl*);
  25. void afisare(nod*);
  26. void afisaresl(nodsl*);
  27. void cautaCarte(nod*,char*,char*);
  28. nod *cauta(nod*,char*);
  29. nodsl *cautasl(char*,nodsl*);
  30. void eliminaCarte(nod*,char*,char*);
  31. nodsl *eliminasl(char*,nodsl*);
  32. nod *elimina(nod*,char*);
  33. nod *elimina2fii(nod*,nod*);
  34. void mesajEroare(void);
  35. int main(void) {
  36. /* radacina arborelui */
  37. nod *rad=NULL;
  38. int opt;
  39. char autor[31],titlu[51];
  40. clrscr();
  41. rad=citireFisier(rad);
  42. do {
  43. clrscr();
  44. puts("1. Afisarea tuturor datelor");
  45. puts("2. Afisarea anului de aparitie a unei carti");
  46. puts("3. Eliminarea din evidenta a unei carti");
  47. puts("4. Eliminarea din evidenta a unui autor");
  48. puts("0. Terminare program");
  49. printf("Optiunea dvs: "); scanf("%d",&opt);
  50. fflush(stdin);
  51. switch(opt) {
  52. case 1: if(rad==NULL)
  53. printf("\nArbore vid!");
  54. else
  55. afisare(rad);
  56. getch(); break;
  57. case 2: printf("\nAutorul: "); scanf("%s",autor);
  58. printf("Titlul: "); scanf("%s",titlu);
  59. cautaCarte(rad,autor,titlu);
  60. break;
  61. case 3: printf("\nAutorul: "); scanf("%s",autor);
  62. printf("Titlul: "); scanf("%s",titlu);
  63. eliminaCarte(rad,autor,titlu);
  64. break;
  65. case 4: printf("\nAutorul: "); scanf("%s",autor);
  66. rad=elimina(rad,autor);
  67. break;
  68. case 0: printf("\nProgram terminat! Apasati o tasta... ");
  69. getch(); break;
  70. default: printf("\nOptiune gresita! Apasati o tasta... ");
  71. getch();
  72. }
  73. }while(opt!=0);
  74. return 0;
  75. }
  76.  
  77. 4
  78.  
  79. nod *citireFisier(nod *rad) {
  80. FILE *f;
  81. char autor[31],titlu[51];
  82. int an;
  83. f=fopen("dep.txt","rt");
  84. if(f==NULL) {
  85. printf("\nEroare la deschiderea fisierului!");
  86. getch();
  87. exit(1);
  88. }
  89. while(fscanf(f,"%s %s %d",autor,titlu,&an)!=EOF) {
  90. rad=adauga(rad,autor,titlu,an);
  91. }
  92. fclose(f);
  93. printf("\nBaza de date a fost initializata! Apasati o tasta... ");
  94. getch();
  95. return rad;
  96. }
  97. /* cautarea unui autor - cautare in arbore */
  98. nod *cauta(nod *t,char *autor) {
  99. if(t==NULL)
  100. return NULL; /* autorul nu a fost gasit */
  101. else
  102. if(strcmp(autor,t->autor)<0)
  103. return cauta(t->st,autor);
  104. else
  105. if(strcmp(autor,t->autor)>0)
  106. return cauta(t->dr,autor);
  107. else
  108. return t; /* autorul a fost gasit */
  109. }
  110. /* mesaj de eroare la alocare spatiu de memorie */
  111. void mesajEroare(void) {
  112. printf("Eroare la alocarea spatiului de memorie!");
  113. getch();
  114. }
  115. /* adaugare */
  116. nod *adauga(nod *rad,char *autor,char *titlu,int an) {
  117. nod *nou,*q1,*q2;
  118. /* se cauta autorul in arbore */
  119. nou=cauta(rad,autor);
  120. /* daca nu este gasit, se adauga */
  121. if(nou==NULL) {
  122. /* se adauga in arbore */
  123. rad=adaugaArb(rad,autor);
  124. /* se cauta din nou pentru a putea accesa sublista sa */
  125. nou=cauta(rad,autor);
  126. nou->primsl=NULL;
  127. }
  128. /* completare sublista */
  129. nou->primsl=adaugasl(titlu,an,nou->primsl);
  130. return rad;
  131. }
  132. /* adaugarea in arbore se face in ordine alfabetica dupa autor */
  133. nod *adaugaArb(nod *t,char *autor) {
  134. if(t==NULL) { /* s-a gasit locul de adaugare */
  135.  
  136. 5
  137.  
  138. t=(nod*)malloc(sizeof(nod));
  139. if(t==NULL) {
  140. mesajEroare();
  141. return NULL;
  142. }
  143. t->autor=(char*)malloc(strlen(autor)+1);
  144. if(t->autor==NULL) {
  145. mesajEroare();
  146. return NULL;
  147. }
  148. strcpy(t->autor,autor);
  149. t->st=t->dr=NULL;
  150. }
  151. else
  152. if(strcmp(autor,t->autor)<0)
  153. t->st=adaugaArb(t->st,autor);
  154. else
  155. if(strcmp(autor,t->autor)>0)
  156. t->dr=adaugaArb(t->dr,autor);
  157. return t;
  158. }
  159. /* adaugarea in sublista; sublista nu este obligatoriu ordonata, deci
  160. modul de adaugare este la alegere;
  161. s-a optat pt adaugarea la inceputul listei */
  162. nodsl *adaugasl(char *titlu,int an,nodsl *primsl) {
  163. nodsl *nou;
  164. nou=(nodsl*)malloc(sizeof(nodsl));
  165. if(nou==NULL) {
  166. mesajEroare();
  167. return primsl;
  168. }
  169. nou->titlu=(char*)malloc(strlen(titlu)+1);
  170. if(nou->titlu==NULL) {
  171. mesajEroare();
  172. return primsl;
  173. }
  174. strcpy(nou->titlu,titlu);
  175. nou->an=an;
  176. nou->urm=primsl;
  177. return nou;
  178. }
  179. /* afisare - parcurgerea arborelui in inordine */
  180. void afisare(nod *t) {
  181. if(t!=NULL) {
  182. afisare(t->st);
  183. printf("\n%s",t->autor);
  184. afisaresl(t->primsl);
  185. afisare(t->dr);
  186. }
  187. }
  188. void afisaresl(nodsl *primsl) {
  189. nodsl *q;
  190. if(primsl==NULL) {
  191. printf("\n\tSublista vida!\n");
  192. return;
  193. }
  194. for(q=primsl;q!=NULL;q=q->urm)
  195.  
  196. 6
  197.  
  198. printf("\n\t%s %d",q->titlu,q->an);
  199. }
  200. /* cautarea unei carti si afisarea anului de aparitie */
  201. void cautaCarte(nod *rad,char *autor,char *titlu) {
  202. nod *p;
  203. nodsl *q;
  204. p=cauta(rad,autor);
  205. if(p==NULL) {
  206. printf("\nAutorul nu este in evidenta!");
  207. getch();
  208. return;
  209. }
  210. q=cautasl(titlu,p->primsl);
  211. if(q==NULL) {
  212. printf("\nCartea nu este in evidenta!");
  213. getch();
  214. return;
  215. }
  216. printf("\nAnul aparitiei cartii \"%s\", autor %s: %d",titlu,autor,q->an);
  217. getch();
  218. }
  219. nodsl *cautasl(char *titlu,nodsl *primsl) {
  220. nodsl *q;
  221. for(q=primsl;q!=NULL && strcmp(q->titlu,titlu)!=0;q=q->urm);
  222. return q;
  223. }
  224. /* eliminarea unei carti din evidenta */
  225. void eliminaCarte(nod *rad,char *autor,char *titlu) {
  226. nod *p;
  227. p=cauta(rad,autor);
  228. if(p==NULL) {
  229. printf("\nAutorul nu apare in evidenta!");
  230. getch();
  231. return;
  232. }
  233. p->primsl=eliminasl(titlu,p->primsl);
  234. }
  235. nodsl *eliminasl(char *titlu,nodsl *primsl) {
  236. nodsl *q1,*q2; /* q1 - nodul de sters, q2 - nodul precedent */
  237. for(q1=q2=primsl;q1!=NULL && strcmp(q1->titlu,titlu)!=NULL;q2=q1,q1=q1->urm);
  238. if(q1==NULL) {
  239. printf("\nCartea nu apare in evdienta!");
  240. getch();
  241. return primsl;
  242. }
  243. if(q1!=q2) {
  244. q2->urm=q1->urm;
  245. }
  246. else {
  247. primsl=q1->urm;
  248. }
  249. free(q1->titlu);
  250. free(q1);
  251. return primsl;
  252. }
  253.  
  254. 7
  255.  
  256. /* eliminare autor din arbore */
  257. nod *elimina(nod *t,char *autor) {
  258. nod *q;
  259. if(t==NULL) {
  260. printf("\nAutorul nu apare in evidenta!");
  261. getch();
  262. }
  263. else
  264. if(strcmp(autor,t->autor)<0)
  265. t->st=elimina(t->st,autor);
  266. else
  267. if(strcmp(autor,t->autor)>0)
  268. t->dr=elimina(t->dr,autor);
  269. else /* a fost gasit nodul de eliminat */ {
  270. /* stergere sublista */
  271. while(t->primsl!=NULL)
  272. t->primsl=eliminasl(t->primsl->titlu,t->primsl);
  273. if(t->st==NULL) { /* nu are fiu stang */
  274. q=t->dr; /* se retine adresa fiului drept */
  275. free(t->autor); free(t);
  276. return q;
  277. }
  278. else
  279. if(t->dr==NULL) { /* nu are fiu drept */
  280. q=t->st; /* se retine adresa nodului drept */
  281. free(t->autor); free(t);
  282. return q;
  283. }
  284. else /* are ambii fii */
  285. t->st=elimina2fii(t->st,t);
  286. }
  287. return t;
  288. }
  289. /* functie auxiliara pt eliminarea unui nod cu 2 fii din arbore */
  290. nod *elimina2fii(nod *t,nod *p) {
  291. nod *q,*aux;
  292. q=t;
  293. /* gaseste cel mai mare nod din subarborele drept al lui p */
  294. if(q->dr!=NULL)
  295. q->dr=elimina2fii(q->dr,p);
  296. else {
  297. /* muta autorul din nodul q in nodul p */
  298. free(p->autor); p->autor=q->autor; p->primsl=q->primsl;
  299. aux=q;
  300. q=q->st; /* este retinuta adresa fiului stang a lui q */
  301. free(aux);
  302. }
  303. return q;
  304. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement