Guest User

Untitled

a guest
Jul 18th, 2018
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.77 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3.  
  4.  
  5. class nodo2 {
  6. friend class MatrizDisp;
  7. int elemento; /* valor en la matriz */
  8. int tono_gris;
  9. int fila;
  10. nodo2* sig2;
  11. };
  12.  
  13.  
  14. class nodo1 {
  15. friend class nodo2;
  16. friend class MatrizDisp;
  17. int posicion;
  18. nodo2* columna; /* puntero a la lista que cuelga de este nodo y
  19. almacena los valores no nulos de la columna posicion */
  20. nodo1* sig1;
  21. };
  22.  
  23.  
  24. class MatrizDisp {
  25. friend class nodo1;
  26. friend class nodo2;
  27. int nfilas;
  28. int ncolumnas;
  29. nodo1* matriz;
  30.  
  31. private:
  32.  
  33. nodo2* CreaColumna(int Fila, int Elemento, int Gris, nodo2* sig) {
  34. /* {Pre: 0 <= Fila <= nfilas - 1, 0 < Elemento.} */
  35. nodo2* fil = new(nodo2);
  36. fil->fila = Fila;
  37. fil->elemento = Elemento;
  38. fil->tono_gris = Gris;
  39. fil->sig2 = sig;
  40. return fil;
  41. }
  42. /* {Post: Devuelve un nodo2 con todos sus campos actualizados.} */
  43.  
  44.  
  45. nodo1* CreaNodo(int Fila, int Columna, int Elemento, int Gris,
  46. nodo1* sig) {
  47. /* {Pre: 0 <= Fila <= nfilas - 1, 0 <= Columna <= ncolumnas - 1, 0 < Elemento.} */
  48. nodo1* col = new(nodo1);
  49. col->posicion = Columna;
  50. col->sig1 = sig;
  51. col->columna = CreaColumna(Fila, Elemento, Gris, NULL);
  52. return col;
  53. }
  54. /* {Post: Devuelve un nodo1 con todos sus campos actualizados.} */
  55.  
  56.  
  57. int cuenta_elem(nodo2* elem, int minfil) {
  58. /* {Pre: minfil = min(nfilas1, nfilas2).} */
  59. int cont = 0;
  60. /* cont = numero de elementos en la columna con tono_gris mayor que 20
  61. hasta la posicion que hemos tratado
  62. elem = nodo2 a tratar (NULL si no existe)
  63. elem->fila = numero de fila del nodo2 a tratar (si existe)
  64. */
  65. while(elem != NULL and elem->fila < minfil) {
  66. if (elem->tono_gris > 20) ++cont;
  67. elem = elem->sig2;
  68. }
  69. return cont;
  70. }
  71. /* {Post: cont contiene la suma de el número de nodos con número de columna menor
  72. que mincol que tienen tono_gris > 20.} */
  73.  
  74.  
  75. int cuenta_col(nodo1* col, int mincol, int minfil) {
  76. /* {Pre: mincol = min(ncolumnas1, ncolumnas2), minfil = min(nfilas1, nfilas2).} */
  77. int cont = 0;
  78. /* cont = numero de elementos con tono_gris mayor que 20
  79. desde el valor incial de col hasta la posicion que
  80. hemos tratado
  81. col = nodo1 a tratar (NULL si no existe)
  82. col->posicion = numero de columna del nodo1 a tratar (si existe)
  83. */
  84. while(col != NULL and col->posicion < mincol) {
  85. cont += cuenta_elem(col->columna, minfil);
  86. col = col->sig1;
  87. }
  88. return cont;
  89. }
  90. /* {Post: cont contiene la suma de el número de nodos con número de fila menor
  91. que minfil que tienen tono_gris > 20.} */
  92.  
  93. public:
  94.  
  95. MatrizDisp(int Filas, int Columnas) {
  96. nfilas = Filas;
  97. ncolumnas = Columnas;
  98. matriz = NULL;
  99. }
  100.  
  101.  
  102. void insertar(int Fila, int Columna, int Elemento, int Gris) {
  103. /* {Pre: 0 <= Fila <= nfilas - 1, 0 <= Columna <= ncolumnas - 1, 0 <= Elemento} */
  104. if (Fila > nfilas or Columna > ncolumnas or
  105. Fila <= 0 or Columna <= 0) return;
  106. if (Elemento == 0) {
  107. suprimir(Fila, Columna);
  108. return;
  109. }
  110. if (matriz == NULL) {
  111. matriz = CreaNodo(Fila, Columna, Elemento, Gris, NULL);
  112. return;
  113. }
  114. nodo1* act = matriz;
  115. nodo1* ant = NULL;
  116.  
  117. /* { act = nodo1 a tratar, o NULL si no existe
  118. ant = el ultimo nodo1 tratado, (en la primera iteracion NULL,
  119. ya que aun no se ha tratado ninguno)
  120. act->posicion = numero de columna del nodo a tratar (si existe) }
  121. */
  122. while(act != NULL and act->posicion < Columna) {
  123. ant = act;
  124. act = act->sig1;
  125. }
  126. if (act!=NULL and act->posicion==Columna) {
  127. nodo2* act2 = act->columna;
  128. nodo2* ant2 = NULL;
  129. /* { act2 = nodo2 a tratar, o NULL si no existe
  130. ant2 = el ultimo nodo2 tratado, (en la primera iteracion NULL,
  131. ya que aun no se ha tratado ninguno)
  132. act->fila = numero de fila del nodo a tratar (si existe) }
  133. */
  134. while(act2 != NULL and act2->fila < Fila) {
  135. ant2 = act2;
  136. act2 = act2->sig2;
  137. }
  138. if (act2!=NULL and act2->fila==Fila) {
  139. act2->elemento = Elemento;
  140. act2->tono_gris = Gris;
  141. }
  142. else {
  143. nodo2* nueva2 = CreaColumna(Fila, Elemento, Gris, act2);
  144. if (ant2 != NULL) ant2->sig2 = nueva2;
  145. else act->columna = nueva2;
  146. }
  147. }
  148. else {
  149. nodo1* nueva = CreaNodo(Fila, Columna, Elemento, Gris, act);
  150. if (ant != NULL) ant->sig1 = nueva;
  151. else matriz = nueva;
  152. }
  153. }
  154. /* {Post: Si Elemento es 0, suprimimos el nodo perteneciente a (Fila, Columna).
  155. Si elemento es diferente de 0, creamos el nodo (Fila,Columna) si éste no
  156. existe. Si existiese, actualizamos los valores de elemento y tono_gris.}
  157. */
  158.  
  159.  
  160. void suprimir(int Fila, int Columna) {
  161. /* {Pre: 0 <= Fila <= nfilas - 1, 0 <= Columna <= ncolumnas - 1} */
  162. if (Fila > nfilas or Columna > ncolumnas or
  163. Fila <= 0 or Columna <= 0) return;
  164. nodo1* act = matriz;
  165. nodo1* ant = NULL;
  166. /* { act = nodo1 a tratar, o NULL si no existe
  167. ant = el ultimo nodo1 tratado, (en la primera iteracion NULL,
  168. ya que aun no se ha tratado ninguno)
  169. act->posicion = numero de columna del nodo a tratar (si existe) }
  170. */
  171. while(act!=NULL and act->posicion < Columna) {
  172. ant = act;
  173. act = act->sig1;
  174. }
  175. if (act!=NULL and act->posicion==Columna) {
  176. nodo2* act2 = act->columna;
  177. nodo2* ant2 = NULL;
  178. /* { act2 = nodo2 a tratar, o NULL si no existe
  179. ant2 = el ultimo nodo2 tratado, (en la primera iteracion NULL,
  180. ya que aun no se ha tratado ninguno)
  181. act->fila = numero de fila del nodo a tratar (si existe) }
  182. */
  183. while(act2 != NULL and act2->fila < Fila) {
  184. ant2 = act2;
  185. act2 = act2->sig2;
  186. }
  187. if (act2!=NULL and act2->fila==Fila) {
  188. if (ant2 != NULL) ant2->sig2 = act2->sig2;
  189. else if (act2->sig2 != NULL) act->columna = act2->sig2;
  190. else {
  191. if (ant != NULL) ant->sig1 = act->sig1;
  192. else matriz = act->sig1;
  193. delete(act);
  194. }
  195. delete(act2);
  196. }
  197. }
  198. }
  199. /* {Post: Hemos suprimido el nodo correspondiente a (Fila, Columa) si existía.} */
  200.  
  201.  
  202. void limpiar() {
  203. /* {Pre: -} */
  204. nodo1* act = matriz;
  205. nodo1* ant = NULL;
  206. /* { act = nodo1 a tratar, o NULL si no existe
  207. ant = el ultimo nodo1 tratado, (en la primera iteracion NULL,
  208. ya que aun no se ha tratado ninguno) }
  209. */
  210. while(act != NULL) {
  211. bool borra = false;
  212. nodo2* act2 = act->columna;
  213. nodo2* ant2 = NULL;
  214. /* { act2 = nodo2 a tratar, o NULL si no existe
  215. ant2 = el ultimo nodo2 tratado, (en la primera iteracion NULL,
  216. ya que aun no se ha tratado ninguno) }
  217. */
  218. while(act2 != NULL) {
  219. if (act2->tono_gris > 224) {
  220. if (ant2 != NULL) ant2->sig2 = act2->sig2;
  221. else if (act2->sig2 != NULL) act->columna = act2->sig2;
  222. else borra = true;
  223. nodo2* auxact2;
  224. auxact2 = act2;
  225. act2 = act2->sig2;
  226. delete(auxact2);
  227. }
  228. else {
  229. ant2 = act2;
  230. act2 = act2->sig2;
  231. }
  232. }
  233. if (borra) {
  234. if (ant != NULL) ant->sig1 = act->sig1;
  235. else matriz = act->sig1;
  236. nodo1 *auxact;
  237. auxact = act;
  238. act = act->sig1;
  239. delete(auxact);
  240. }
  241. else {
  242. ant = act;
  243. act = act->sig1;
  244. }
  245. }
  246. }
  247. /* {Post: Eliminamos de la matriz todos los nodos que tienen un valor de tono_gris
  248. mayor de 224.}
  249. */
  250.  
  251.  
  252. int compara(MatrizDisp M1) {
  253. /* {Pre: -} */
  254. int cont = 0;
  255. int minfil = nfilas+1;
  256. if (M1.nfilas < nfilas) minfil = M1.nfilas+1;
  257. int mincol = ncolumnas+1;
  258. if (M1.ncolumnas < ncolumnas) mincol = M1.ncolumnas+1;
  259. nodo1* col1 = matriz;
  260. nodo1* col2 = M1.matriz;
  261. /* { col1 = nodo1 a tratar de la primera matriz, o NULL si no existe
  262. col2 = nodo1 a tratar de la segunda matriz, o NULL si no existe
  263. col1->posicion = numero de columna del nodo a tratar de la primera
  264. matriz (si existe)
  265. col1->posicion = numero de columna del nodo a tratar de la segunda
  266. matriz (si existe)
  267. cont = numero de elementos en la intereseccion de las dos matrices
  268. hasta la posicion que hemos tratado cuya diferencia de
  269. tono_gris es mayor que 20 }
  270. */
  271. while(col1 != NULL and col2 != NULL and
  272. col1->posicion < mincol and col2->posicion < mincol) {
  273.  
  274. if (col1->posicion == col2->posicion) {
  275. nodo2* elem1 = col1->columna;
  276. nodo2* elem2 = col2->columna;
  277. /* { col1 = nodo1 a tratar de la primera matriz,
  278. o NULL si no existe
  279. col2 = nodo1 a tratar de la segunda matriz,
  280. o NULL si no existe
  281. col1->fila = numero de fila del nodo a tratar de la
  282. primera matriz (si existe)
  283. col1->fila = numero de fila del nodo a tratar de la
  284. segunda matriz (si existe)
  285. cont = numero de elementos en la intereseccion de las dos
  286. matrices hasta la posicion que hemos tratado cuya
  287. diferencia de tono_gris es mayor que 20 }
  288. */
  289. while(elem1 != NULL and elem2 != NULL and
  290. elem1->fila < minfil and elem2->fila < minfil) {
  291. if (elem1->fila == elem2->fila) {
  292. int valor = elem1->tono_gris - elem2->tono_gris;
  293. if (valor < 0) valor *= -1;
  294. if (valor > 20) ++cont;
  295. elem1 = elem1->sig2;
  296. elem2 = elem2->sig2;
  297. }
  298. else if (elem1->fila < elem2->fila) {
  299. if (elem1->tono_gris > 20) ++cont;
  300. elem1 = elem1->sig2;
  301. }
  302. else {
  303. if (elem2->tono_gris > 20) ++cont;
  304. elem2 = elem2->sig2;
  305. }
  306. }
  307. cont += cuenta_elem(elem1, minfil);
  308. cont += cuenta_elem(elem2, minfil);
  309. col1 = col1->sig1;
  310. col2 = col2->sig1;
  311. }
  312. else if (col1->posicion < col2->posicion) {
  313. cont += cuenta_elem(col1->columna, minfil);
  314. col1 = col1->sig1;
  315. }
  316. else {
  317. cont += cuenta_elem(col2->columna, minfil);
  318. col2 = col2->sig1;
  319. }
  320. }
  321. cont += cuenta_col(col1, mincol, minfil);
  322. cont += cuenta_col(col2, mincol, minfil);
  323. return cont;
  324. }
  325. /* {Post: Comparamos la intersección de las 2 matrices, cont hace referencia al
  326. número de diferencias mayores que 20 que existen entre nodos de misma
  327. (Fila, Columna) en las 2 matrices.}
  328. */
  329. void escriu() {
  330. cout << "============ PRINT ==========" << endl;
  331. nodo1 * x=matriz;
  332. while (x!=NULL) {
  333. nodo2 * pos=x->columna;
  334. cout << x->posicion << ": ";
  335. while (pos!=NULL) {
  336. cout << pos->fila << ","<<pos->elemento<<","<<pos->tono_gris<<" ";
  337. pos=pos->sig2;
  338. }
  339. cout << endl;
  340. x=x->sig1;
  341. }
  342. }
  343. };
Add Comment
Please, Sign In to add comment