-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcodificare.h
93 lines (83 loc) · 2.13 KB
/
codificare.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
//
// Created by Alexandru Chirea on 25.11.2017.
//
#include <string.h>
#include <stdlib.h>
#include "definitii.h"
#ifndef HUFFMANCODING_CODIFICARE_H
#define HUFFMANCODING_CODIFICARE_H
void codificare(char *fisier) {
int i, frecv[500] = {0}, nrcar = 0, start = 9999, stop = 0, k = 0, height;
char intrare[1001];
FILE *f = fopen(fisier, "r");
if (!f) {
printEroare(fisierInexistentCodificare);
return;
}
FILE *g = fopen("output.txt", "w");
//Numarul de aparitii pentru fiecare caracter prezent in fisier.
//start = cel mai mic cod al caracterului (int)
//stop = cel mai mare cod al caracterului (int)
while (fgets(intrare, sizeof(intrare), f)) {
for (i = 0; i < strlen(intrare); i++) {
frecv[intrare[i]]++;
start = min(start, intrare[i]);
stop = max(stop, intrare[i]);
nrcar++;
}
}
fclose(f);
//Numarul de caractere diferite care apar
for (i = start; i <= stop; i++) {
if (frecv[i]) {
k++;
}
}
fprintf(g, "%d ", k);
//Lista cu noduri
struct Nod **listaNoduri = (struct Nod **) malloc(sizeof(struct Nod *) * k);
k = 0;
for (i = start; i <= stop; i++) {
if (frecv[i]) {
fprintf(g, "%d %d ", i, frecv[i]);
//Creare nod nou, adaugarea lui in lista
listaNoduri[k] = adaugare(i, frecv[i], NULL, NULL);
k++;
}
}
fprintf(g, "\n");
//Sortare noduri crescator dupa 'valoare'
sortare(listaNoduri, k - 1);
int o = k;
while (o) {
//Creare nod din primele cele mai mici noduri din lista
listaNoduri[0] = adaugare(0, listaNoduri[0]->valoare + listaNoduri[1]->valoare, listaNoduri[0], listaNoduri[1]);
o--;
if (o == 1) {
break;
}
for (i = 1; i < o; i++) {
listaNoduri[i] = listaNoduri[i + 1];
}
sortare(listaNoduri, o - 1);
height++; //inaltime arbore
}
struct Nod *root;
root = listaNoduri[0];
int pos;
int *arr = (int *) malloc(sizeof(int) * height);
f = fopen(fisier, "r");
while (fgets(intrare, sizeof(intrare), f)) {
for (i = 0; i < strlen(intrare); i++) {
pos = 0;
cauta(intrare[i], root, pos, arr, g);
}
}
//Inchidere fisiere
fclose(f);
fclose(g);
//Eliberare memorie
elibereaza(root);
free(listaNoduri);
}
#endif //HUFFMANCODING_CODIFICARE_H