-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathUri_1861.cpp
111 lines (97 loc) · 2.38 KB
/
Uri_1861.cpp
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include <iostream>
#include <queue>
#include <string.h>
#include <string>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
typedef struct no{
char nome[11];
int morto;
int quant;
struct no *esq;
struct no *dir;
}Nodo;
typedef struct arv_bin{
Nodo * raiz;
}Arv_bin;
Arv_bin *arv_cria(){
Arv_bin * arv = (Arv_bin *) malloc(sizeof(Arv_bin));
arv->raiz = NULL;
return arv;
}
Nodo *arv_insere_no(Nodo *raiz, string c){
if (raiz == NULL){
raiz = (Nodo*)malloc(sizeof(Nodo));
raiz->dir = raiz->esq = NULL;
raiz->nome[c.copy(raiz->nome,strlen(c.c_str()),0)] ='\0';
raiz->quant = 1;
raiz->morto = 0;
}
else if (c < raiz->nome)
raiz->esq = arv_insere_no(raiz->esq, c);
else
raiz->dir = arv_insere_no(raiz->dir, c);
return raiz;
}
void arv_insere(Arv_bin *arv, string c){
arv->raiz = arv_insere_no(arv->raiz, c);
}
Nodo *arv_busca_no(Nodo *raiz, string c){
if (raiz == NULL || raiz->nome == c){
return raiz;
}
if (c < raiz -> nome){
return arv_busca_no(raiz->esq, c);
}
else{
return arv_busca_no(raiz->dir, c);
}
}
Nodo *arv_busca(Arv_bin *arv, string k){
return arv_busca_no(arv->raiz, k);
}
void assassino_quant(string assassino, Arv_bin *arv){
Nodo *aux = arv_busca(arv, assassino);
if (aux){
aux->quant = aux->quant + 1;
}
else{
arv_insere(arv, assassino);
}
}
void arv_imprime_infixa(Nodo * raiz){
if(raiz != NULL){
arv_imprime_infixa(raiz->esq);
if(raiz->morto != 1){
cout << raiz->nome;
cout <<" "<<raiz->quant << endl;
}
arv_imprime_infixa(raiz->dir);
}
}
int main(){
string assassino, morto;
queue <string> assassinos, necroterio;
Arv_bin *arv = arv_cria();
cin >> assassino >> morto;
do{
assassinos.push(assassino);
necroterio.push(morto);
cin >> assassino >> morto;
} while(!cin.eof());
while(!assassinos.empty()){
assassino_quant(assassinos.front(),arv);
assassinos.pop();
}
while(!necroterio.empty()){
Nodo *aux_morto = arv_busca(arv, necroterio.front());
if (aux_morto != NULL){
aux_morto->morto = 1;
}
necroterio.pop();
}
cout << "HALL OF MURDERERS" << endl;
arv_imprime_infixa(arv->raiz);
return 0;
}