Advertisement
seergiomv

P4

Jun 15th, 2020
44
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 26.03 KB | None | 0 0
  1. #include <stdio.h>
  2. #include "types.h"
  3. #include "center_list.h"
  4. #include "party_list.h"
  5.  
  6. #define CODE_LENGTH 2
  7.  
  8. void C(tCenterName NombreCentro, tNumVotes TotalVoters, tListC *ListC){
  9. tItemC tempItemC;
  10. strcpy(tempItemC.centerName,NombreCentro);
  11. createEmptyList(&tempItemC.partyList);
  12. tempItemC.totalvoters = TotalVoters;
  13. tempItemC.validVotes = 0;
  14. tempItemC.nullVotes = 0;
  15.  
  16. if(findItemC(NombreCentro,*ListC) != NULLC){
  17. printf("+ Error: Create not possible\n");
  18. } else {
  19. if (insertItemC(tempItemC, ListC) == 1) {
  20. printf("* Create: center %s totalvoters %d\n", tempItemC.centerName, tempItemC.totalvoters);
  21. } else {
  22. printf("+ Error: Create not possible\n");
  23. }
  24. }
  25. }
  26.  
  27. void N(tCenterName NombreCentro, tPartyName NombrePartido, tListC *ListC){
  28. tItemC tempItemC;
  29. tPosC tempPosC;
  30. tempPosC = findItemC(NombreCentro,*ListC);
  31. if(tempPosC != NULLC){
  32. tempItemC = getItemC(tempPosC,*ListC);
  33. tPosL tempPosL;
  34. tempPosL = findItem(NombrePartido,tempItemC.partyList);
  35. if (tempPosL == LNULL){
  36. tItemL tempItemL;
  37. strcpy(tempItemL.partyName,NombrePartido);
  38. tempItemL.numVotes = 0;
  39. if(insertItem(tempItemL,&tempItemC.partyList) == 1){
  40. updateListC(tempItemC.partyList,tempPosC,ListC);
  41. printf("* New: center %s party %s\n",NombreCentro,NombrePartido);
  42. } else{
  43. printf("+ Error: New not possible\n");
  44. }
  45. } else{
  46. printf("+ Error: New not possible\n");
  47. }
  48. } else{
  49. printf("+ Error: New not possible\n");
  50. }
  51. }
  52.  
  53. void V(tCenterName NombreCentro, tPartyName NombrePartido, tListC *ListC){
  54. tPosL tempPosL;
  55. tNumVotes tempNullVotes, tempValidVotes;
  56. tPosC tempPosC;
  57. tempPosC = findItemC(NombreCentro,*ListC);
  58. if(tempPosC != NULLC){
  59. tItemC tempItemC;
  60. tempItemC = getItemC(tempPosC,*ListC);
  61. tempNullVotes = tempItemC.nullVotes;
  62. tempValidVotes = tempItemC.validVotes;
  63. tempPosL = findItem(NombrePartido,tempItemC.partyList);
  64. if(tempPosL != LNULL){
  65. tItemL TempItem;
  66. TempItem = getItem(tempPosL,tempItemC.partyList);
  67. tNumVotes TempVotes;
  68. TempVotes = TempItem.numVotes + 1;
  69. updateVotes(TempVotes,tempPosL,&tempItemC.partyList);
  70. tempValidVotes = tempValidVotes + 1;
  71. updateValidVotesC(tempValidVotes,tempPosC,ListC);
  72. printf("* Vote: center %s party %s numvotes %d\n",NombreCentro,NombrePartido,TempVotes);
  73. }else{
  74. tempNullVotes = tempNullVotes + 1;
  75. updateNullVotesC(tempNullVotes,tempPosC,ListC);
  76. printf("+ Error: Vote not possible. Party %s not found in center %s. NULLVOTE\n",NombrePartido,
  77. NombreCentro);
  78. }
  79. } else{
  80. printf("+ Error: Vote not possible\n");
  81. }
  82. }
  83.  
  84. void R(tListC *ListC){
  85. tItemC tempItemC;
  86. tPosC primero,ultimo;
  87. primero = firstC(*ListC);
  88. ultimo = lastC(*ListC);
  89. while (primero != NULLC){
  90. tempItemC = getItemC(primero,*ListC);
  91. if(tempItemC.validVotes == 0){
  92. printf("* Remove: center %s\n", tempItemC.centerName);
  93. deleteList(&tempItemC.partyList);
  94. deleteAtPositionC(primero,ListC);
  95. primero = firstC(*ListC);
  96. } else{
  97. primero = nextC(primero,*ListC);
  98. }
  99. }
  100. if (primero == ultimo){
  101. printf("+ Remove: no centers removed\n");
  102. }
  103. }
  104.  
  105. void S(tListC *ListC){
  106. tNumVotes totalValidVotes = 0;
  107. float porcentajePartido, porcentajeTotal;
  108. tItemC tempItemC;
  109. for(tPosC pos1 = firstC(*ListC); pos1 != NULLC; pos1 = nextC(pos1,*ListC)){
  110. tempItemC = getItemC(pos1,*ListC);
  111. totalValidVotes = tempItemC.validVotes;
  112. printf("Center %s\n",tempItemC.centerName);
  113. tNumVotes centerTotalVotes = 0;
  114. tPosL primero;
  115. primero = first(tempItemC.partyList);
  116. while(primero != LNULL) {
  117. tItemL TempItem;
  118. TempItem = getItem(primero,tempItemC.partyList);
  119. if (totalValidVotes == 0){
  120. porcentajePartido = 0;
  121. } else{
  122. porcentajePartido = (float) 100 * TempItem.numVotes/(float) totalValidVotes;
  123. }
  124. printf("Party %s numvotes %d (%.2f%%)\n",TempItem.partyName,TempItem.numVotes,porcentajePartido);
  125. primero = next(primero,tempItemC.partyList);
  126. }
  127. printf("Null votes %d\n",tempItemC.nullVotes);
  128. centerTotalVotes = tempItemC.nullVotes + tempItemC.validVotes;
  129. if(tempItemC.totalvoters == 0){
  130. porcentajeTotal = 100;
  131. } else{
  132. porcentajeTotal = (float) 100 * centerTotalVotes/tempItemC.totalvoters;
  133. }
  134. printf("Participation: %d votes from %d voters (%.2f%%)\n",centerTotalVotes,tempItemC.totalvoters,
  135. porcentajeTotal);
  136. }
  137. }
  138.  
  139. void W(float PorcentajeMinimo,tListC *ListC){
  140. if (isEmptyListC(*ListC) == true){
  141. printf("+ Error: ShowWinners not possible\n");
  142. } else{
  143. for (tPosC pos = firstC(*ListC); pos != NULLC; pos = nextC(pos,*ListC)){
  144. tItemC tempItemC;
  145. tempItemC = getItemC(pos,*ListC);
  146. tNumVotes tempNumVotes;
  147. tempNumVotes = 0;
  148. tPartyName tempPartyName;
  149. for (tPosL tempPos = first(tempItemC.partyList); tempPos != LNULL; tempPos = next(tempPos,
  150. tempItemC.partyList)){
  151. tItemL tempItemL;
  152. tempItemL = getItem(tempPos,tempItemC.partyList);
  153. if (tempItemL.numVotes > tempNumVotes){
  154. tempNumVotes = tempItemL.numVotes;
  155. strcpy(tempPartyName,tempItemL.partyName);
  156. }
  157. }
  158. float tempPorcentaje;
  159. tempPorcentaje = (float) 100 * tempNumVotes/(float) tempItemC.totalvoters;
  160. if (tempPorcentaje < PorcentajeMinimo){
  161. printf("Winner of center %s: *none*\n",tempItemC.centerName);
  162. } else{
  163. printf("Winner of center %s: %s (%.2f%%)\n",tempItemC.centerName,tempPartyName,tempPorcentaje);
  164. }
  165. }
  166. }
  167. }
  168.  
  169. void processCommand(char commandNumber[CODE_LENGTH+1], char command,
  170. char param1[NAME_LENGTH_LIMIT+1], char param2[NAME_LENGTH_LIMIT+1],tListC *TempListC) {
  171.  
  172. switch(command) {
  173. case 'C': {
  174. printf("********************\n");
  175. printf("%s %c: center %s totalvoters %s\n\n",commandNumber,command,param1,param2);
  176. C(param1,atoi(param2),TempListC);
  177. break;
  178. }
  179. case 'N': {
  180. printf("********************\n");
  181. printf("%s %c: center %s party %s\n\n",commandNumber, command, param1, param2);
  182. N(param1,param2,TempListC);
  183. break;
  184. }
  185. case 'V': {
  186. printf("********************\n");
  187. printf("%s %c: center %s party %s\n\n",commandNumber, command, param1, param2);
  188. V(param1,param2,TempListC);
  189. break;
  190. }
  191. case 'R': {
  192. printf("********************\n");
  193. printf("%s %c\n\n",commandNumber,command);
  194. R(TempListC);
  195. break;
  196. }
  197. case 'S': {
  198. printf("********************\n");
  199. printf("%s %c\n\n",commandNumber,command);
  200. S(TempListC);
  201. break;
  202. }
  203. case 'W':{
  204. printf("********************\n");
  205. printf("%s %c: threshold %s\n\n",commandNumber,command,param1);
  206. W(atof(param1),TempListC);
  207. break;
  208. }
  209. default: {
  210. break;
  211. }
  212. }
  213. }
  214.  
  215. void readTasks(char *filename,tListC *TempListC) {
  216. FILE *df;
  217. char commandNumber[CODE_LENGTH+1], command, param1[NAME_LENGTH_LIMIT+1], param2[NAME_LENGTH_LIMIT+1];
  218.  
  219. df = fopen(filename, "r");
  220. if (df != NULL) {
  221. while (!feof(df)) {
  222. char format[16];
  223. sprintf(format, "%%%is %%c ", CODE_LENGTH);
  224. fscanf(df, format, commandNumber, &command);
  225. if (command == 'S' || command == 'R') {
  226. param1[0] = '\0';
  227. param2[0] = '\0';
  228. } else if (command == 'W') {
  229. param2[0] = '\0';
  230. fscanf(df, "%5s", param1);
  231. } else {
  232. sprintf(format, "%%%is %%%is", NAME_LENGTH_LIMIT, NAME_LENGTH_LIMIT);
  233. fscanf(df, format, param1, param2);
  234. }
  235. processCommand(commandNumber, command, param1, param2, TempListC);
  236. }
  237. fclose(df);
  238. } else {
  239. printf("Cannot open file %s.\n", filename);
  240. }
  241. }
  242.  
  243. int main(int nargs, char **args) {
  244.  
  245. char *filename = "create.txt";
  246.  
  247. if (nargs > 1) {
  248. filename = args[1];
  249. } else {
  250. #ifdef INPUT_FILE
  251. filename = INPUT_FILE;
  252. #endif
  253. }
  254.  
  255. tListC *ListaCentros = malloc(sizeof(*ListaCentros));
  256. createEmptyListC(ListaCentros);
  257. readTasks(filename,ListaCentros);
  258.  
  259. return 0;
  260. }
  261.  
  262.  
  263. ///////////////////
  264.  
  265. #ifndef PARTY_LIST_H
  266. #define PARTY_LIST_H
  267.  
  268. #include "types.h"
  269.  
  270. #include <stdio.h>
  271. #include <stdlib.h>
  272. #include <string.h>
  273. #include <stdbool.h>
  274. #define LNULL NULL
  275.  
  276. typedef struct tNode *tPosL;
  277. struct tNode{
  278. tItemL data;
  279. tPosL sig;
  280. };
  281.  
  282. typedef tPosL tList;
  283.  
  284. /* Write your code here... */
  285.  
  286. void createEmptyList (tList*);
  287. /*{Objetivo: Crea una lista vacía.
  288. * Salidas: Lista inicializada.
  289. * Postcondición: La lista queda inicializada y no contiene elementos.}*/
  290. bool insertItem(tItemL, tList*);
  291. /*{Objetivo: Inserta un elemento de forma ordenada en función del campo partyname. Devuelve un valor true si el
  292. * elemento fue insertado y false en case contrario
  293. * Entradas: El elemento y la lista de partidos.
  294. * Salidas: Verdadero y la lista con el elemento si se pudo insertar, falso y la lista sin el elemento si no se pudo.
  295. * Postcondición: Las posiciones de los elementos de la lista posteriores al insertado pueden cambiar de valor.}*/
  296. bool copyList(tList, tList*);
  297. /*{Objetivo: Copia una lista en otra
  298. * Entradas: La lista de partidos en la que se quiere copiar y la lista de partidos a copiar.
  299. * Salidas: Verdadero y la lista copiada si se pudo copiar, falso y la lista sin copiar si no se pudo copiar.
  300. * Precondición: La lista que se quiere copiar existe.}*/
  301. void updateVotes(tNumVotes, tPosL, tList*);
  302. /*{Objetivo: Modifica el número de votos del elemento situado en la posición indicada de la lista.
  303. * Entradas: La cantidad de votos, la posición en la que actualizarlos y la lista de partidos.
  304. * Salidas: La lista de partidos con los votos de la posición indicada actualizados.
  305. * Precondición: La posición indicada es una posición válida en la lista.}*/
  306. void deleteAtPosition(tPosL, tList*);
  307. /*{Objetivo: Elimina de la lista el elemento que ocupa la posición indicada.
  308. * Entradas: Posición del elemento a eliminar y la lista de partidos.
  309. * Salidas: La lista sin el elemento que se quería eliminar.
  310. * Precondición: La posición indicada es una posición válida en la lista.
  311. * Postcondición: Tanto la posición del elemento eliminado como aquellas de los elementos de la lista a continuación
  312. * del mismo pueden cambiar de valor.}*/
  313. void deleteList(tList*);
  314. /*{Objetivo: Elimina una lista.
  315. * Entradas: Lista de partidos a eliminar.
  316. * Precondición: La lista indicada existe.}*/
  317. tPosL findItem(tPartyName, tList);
  318. /*{Objetivo:Devuelve la posición del primer elemento de la lista cuyo nombre de partido se corresponda con el indicado
  319. * (o LNULL si no existe tal elemento).
  320. * Entradas: Nombre del partido a buscar y la lista de partidos.
  321. * Salidas: Posición del elemento que se busca (LNULL si no existe).}*/
  322. bool isEmptyList(tList);
  323. /*{Objetivo: Determina si la lista está vacía.
  324. * Entradas: La lista de partidos.
  325. * Salidas: Verdadero si la lista está vacía, falso si no lo está.
  326. * Precondición: La lista existe.}*/
  327. tItemL getItem(tPosL, tList);
  328. /*{Objetivo: Devuelve el contenido del elemento de la lista que ocupa la posición indicada.
  329. * Entradas: La posición del elemento a buscar y la lista de partidos.
  330. * Salidas: El contenido del elemento buscado
  331. * Precondición: La posición indicada es una posición válida en la lista.}*/
  332. tPosL first(tList);
  333. /*{Objetivo: Devuelve la posición del primer elemento de la lista.
  334. * Entradas: La lista de partidos
  335. * Salidas: La posición del primer elemento de la lista.
  336. * Precondición: La lista no está vacía.}*/
  337. tPosL last(tList);
  338. /*{Objetivo: Devuelve la posición del último elemento de la lista.
  339. * Entradas: La lista de partidos.
  340. * Salidas: La posición del último elemento de la lista.
  341. * Precondición: La lista no está vacía.}*/
  342. tPosL previous(tPosL, tList);
  343. /*{Objetivo: Devuelve la posición en la lista del elemento anterior al de la posición indicada (o LNULL si la posición
  344. * no tiene anterior).
  345. * Entradas: La posición del elemento posterior al buscado y la lista de partidos.
  346. * Salidas: La posición del elemento anterior al de la posición indicada o LNULL si no existe una posición anterior.
  347. * Precondición: La posición indicada es una posición válida en la lista.}*/
  348. tPosL next(tPosL, tList);
  349. /*{Objetivo: Devuelve la posición en la lista del elemento siguiente al de la posición indicada (o LNULL si la posición
  350. * no tiene siguiente).
  351. * Entradas: La posición del elemento anterior al buscado y la lista de partidos.
  352. * Salidas: La posición del elemento posterior al de la posición indicada o LNULL si no existe una posición posterior.
  353. * Precondición: La posición indicada es una posición válida en la lista.}*/
  354.  
  355. #endif
  356.  
  357. /////////////////////////////////
  358.  
  359. #include "party_list.h"
  360.  
  361. /* Write your code here... */
  362.  
  363. void createEmptyList (tList *List){
  364. *List = LNULL;
  365. }
  366.  
  367. bool isEmptyList(tList List){
  368. if (List == LNULL){
  369. return true;
  370. }
  371. }
  372.  
  373. tPosL first(tList List){
  374. return List;
  375. }
  376.  
  377. tPosL next(tPosL pos,tList List){
  378. return pos->sig;
  379. }
  380.  
  381. tPosL previous(tPosL pos, tList List){
  382. tPosL pos1;
  383. if (pos == List){
  384. return LNULL;
  385. } else {
  386. pos1 = List;
  387. while(pos1->sig != pos){
  388. pos1 = next(pos1,List);
  389. } return pos1;
  390. }
  391. }
  392.  
  393. tPosL last(tList List){
  394. tPosL pos;
  395. pos = List;
  396. while (pos->sig != LNULL){
  397. pos = next(pos,List);
  398. } return pos;
  399. }
  400.  
  401. tItemL getItem(tPosL pos, tList List){
  402. return pos->data;
  403. }
  404.  
  405. void updateVotes(tNumVotes nVote, tPosL pos, tList *List){
  406. pos->data.numVotes = nVote;
  407. }
  408.  
  409. tPosL findItem(tPartyName NameParty, tList List) {
  410. tPosL pos;
  411. pos = List;
  412. while ((pos != LNULL) && (strcmp(pos->data.partyName,NameParty) != 0)){
  413. pos = next(pos,List);
  414. }
  415. if(pos != LNULL && strcmp(pos->data.partyName,NameParty) == 0){
  416. return pos;
  417. } else{
  418. return LNULL;
  419. }
  420. }
  421.  
  422. void deleteList(tList *List){
  423. tPosL pos;
  424. while (*List != LNULL){
  425. pos = *List;
  426. *List = (*List)->sig;
  427. free(pos);
  428. }
  429. }
  430. bool createNode(tPosL *pos){
  431. *pos = malloc(sizeof(**pos));
  432. return *pos != LNULL;
  433. }
  434.  
  435. bool insertItem(tItemL Item, tList *List){
  436. tPosL pos,pos1;
  437. if(!createNode(&pos)){
  438. return false;
  439. } else{
  440. pos->data = Item;
  441. pos->sig = LNULL;
  442. if(*List == LNULL){
  443. *List = pos;
  444. } else if(strcmp(Item.partyName, (*List)->data.partyName) < 0){
  445. pos->sig = *List;
  446. *List = pos;
  447. } else{
  448. tPosL pos2;
  449. pos2 = *List;
  450. while((pos2->sig != LNULL) && (strcmp(pos2->sig->data.partyName, Item.partyName) < 0)){
  451. pos2 = pos2->sig;
  452. }
  453. pos1 = pos2;
  454. pos->sig = pos1->sig;
  455. pos1->sig = pos;
  456. }
  457. return true;
  458. }
  459. }
  460.  
  461. void deleteAtPosition(tPosL pos, tList *List) {
  462. tPosL pos1;
  463. if(pos == *List){ //borrar elemento primera posición
  464. *List = (*List)->sig;
  465. } else if(pos->sig == LNULL){ //borrar elemento última posición
  466. for(pos1 = *List; pos1->sig != pos; pos1 = pos1->sig){
  467. }
  468. pos1->sig = LNULL;
  469. } else{ //borrar elemento posición intermedia
  470. pos1 = pos->sig;
  471. pos->data = pos1->data;
  472. pos->sig = pos1->sig;
  473. pos = pos1;
  474. }
  475. free(pos);
  476. }
  477.  
  478. bool copyList(tList List, tList *List1){
  479. tPosL pos,pos1,pos2;
  480. bool temp;
  481. temp = true;
  482. createEmptyList(List1);
  483. if(!isEmptyList((List))){
  484. pos = List;
  485. while ((pos != LNULL) && (createNode(&pos2))){
  486. pos2->data = pos->data;
  487. pos2->sig = LNULL;
  488. if(pos == List){
  489. *List1 = pos2;
  490. pos1 = pos2;
  491. } else{
  492. pos1->sig = pos2;
  493. pos1 = pos2;
  494. }
  495. pos = pos->sig;
  496. }
  497. if(pos != LNULL){
  498. temp = false;
  499. }
  500. }
  501. return temp;
  502. }
  503.  
  504. //////////////////////////////
  505.  
  506. #ifndef CENTER_LIST_H
  507. #define CENTER_LIST_H
  508.  
  509. #include "types.h"
  510. #include "party_list.h"
  511.  
  512. #include <stdbool.h>
  513. #include <stdio.h>
  514. #include <stdlib.h>
  515. #include <string.h>
  516. #define NULLC -1
  517. #define MAX 10
  518.  
  519. typedef struct tItemC {
  520. tCenterName centerName;
  521. tNumVotes totalvoters;
  522. tNumVotes validVotes;
  523. tNumVotes nullVotes;
  524. tList partyList;
  525. } tItemC;
  526.  
  527.  
  528. typedef int tPosC;
  529. typedef struct {
  530. tItemC data[MAX];
  531. tPosC lastPos;
  532. }tListC;
  533.  
  534. /* Write your code here... */
  535.  
  536. bool insertItemC(tItemC, tListC*);
  537. /*{Objetivo: Inserta un elemento de forma ordenada en función del campo centername. Devuelve un valor true si el
  538. * elemento fue insertado; false en caso contrario.
  539. * Entradas: El elemento y la lista de centros.
  540. * Salidas: Verdadero y la lista con el elemento si se pudo insertar, falso y la lista sin el elemento si no se pudo.
  541. * Postcondición:Las posiciones de los elementos de la lista posteriores al insertado pueden cambiar de valor.}*/
  542. void updateListC (tList, tPosC, tListC*);
  543. /*{Objetivo: Modifica la lista de partidos del elemento situado en la posición indicada.
  544. * Entradas: La lista de partidos, la posición del centro y la lista de centros.
  545. * Salidas: La lista de partidos actualizada en el centro de la posición indicada.
  546. * Precondición: La posición indicada es una posición válida en la lista.}*/
  547. void updateValidVotesC (tNumVotes, tPosC, tListC*);
  548. /*{Objetivo: Modifica el número de votos válidos del elemento situado en la posición indicada de la lista.
  549. * Entradas: La cantidad de votos, la posición del elemento a actualizar y la lista de centros.
  550. * Salidas: La lista de centros con el número de votos actualizado en el centro indicado.
  551. * Precondición: La posición indicada es una posición válida en la lista.}*/
  552. void updateNullVotesC (tNumVotes, tPosC, tListC*);
  553. /*{Objetivo: Modifica el número de votos nulos del elemento situado en la posición indicada.
  554. * Entradas: La cantidad de votos, la posición del elemento a actualizar y la lista de centros.
  555. * Salidas: La lista de centros con el número de votos actualizado en el centro indicado.
  556. * Precondición: La posición indicada es una posición válida en la lista.}*/
  557. tPosC findItemC (tCenterName, tListC);
  558. /*{Objetivo: Devuelve la posición del primer elemento de la lista cuyo nombre de centro se corresponda con el indicado
  559. * (o NULLC si no existe tal elemento).
  560. * Entradas: El nombre del centro y la lista de centros.
  561. * Salidas: La posición del elemento que se busca (NULLC si no existe).}*/
  562. tPosC firstC(tListC);
  563. /*{Objetivo: Devuelve la posición del primer elemento de la lista.
  564. * Entradas: La lista de centros.
  565. * Salidas: La posición del primer elemento de la lista.
  566. * Precondición: La lista no está vacía.}*/
  567. tPosC lastC(tListC);
  568. /*{Objetivo: Devuelve la posición del último elemento de la lista.
  569. * Entradas: La lista de centros.
  570. * Salidas: La posición del último oelemento de la lista.
  571. * Precondición: La lista no está vacía.}*/
  572. tPosC nextC(tPosC, tListC);
  573. /*{Objetivo: Devuelve la posición en la lista del elemento siguiente al de la posición indicada (o NULLC si la posición
  574. * no tiene siguiente).
  575. * Entradas: La posición del elemento anterior al buscado y la lista de centros.
  576. * Salidas: La posición del elemento posterior al de la posición indicada o NULLC si no existe una posición posterior.
  577. * Precondición: La posición indicada es una posición válida en la lista.}*/
  578. bool copyListC(tListC, tListC*);
  579. /*{Objetivo: Copia una lista en otra.
  580. * Entradas: La lista de centros en la que se quiere copiar y la lista de centros a copiar.
  581. * Salidas: Verdadero y la lista copiada si se pudo copiar, falso y la lista sin copiar si no se pudo copiar.
  582. * Precondición: La lista que se quiere copiar existe.}*/
  583. void deleteAtPositionC(tPosC, tListC*);
  584. /*{Objetivo: Elimina de la lista el elemento que ocupa la posición indicada.
  585. * Entradas: Posición del elemento a eliminar y la lista de centros.
  586. * Salidas: La lista sin el elemento que se quería eliminar.
  587. * Precondición: La posición indicada es una posición válida en la lista.
  588. * Postcondición: Tanto la posición del elemento eliminado como aquellas de los elementos de la lista a continuación
  589. * del mismo pueden cambiar de valor.}*/
  590. tPosC previousC(tPosC, tListC);
  591. /*{Objetivo: Devuelve la posición en la lista del elemento anterior al de la posición indicada (o NULLC si la posición
  592. * no tiene anterior).
  593. * Entradas: La posición del elemento posterior al buscado y la lista de centros.
  594. * Salidas: La posición del elemento anterior al de la posición indicada o NULLC si no existe una posición anterior.
  595. * Precondición: La posición indicada es una posición válida en la lista.}*/
  596. void createEmptyListC(tListC*);
  597. /*{Objetivo: Crea una lista vacía.
  598. * Salidas: Lista inicializada.
  599. * Postcondición: La lista queda inicializada y no contiene elementos.}*/
  600. bool isEmptyListC(tListC);
  601. /*{Objetivo: Determina si la lista está vacía.
  602. * Entradas: La lista de centros.
  603. * Salidas: Verdadero si la lista está vacía, falso si no lo está.
  604. * Precondición: La lista existe.}*/
  605. tItemC getItemC(tPosC, tListC);
  606. /*{Objetivo: Devuelve el contenido del elemento de la lista que ocupa la posición indicada.
  607. * Entradas: La posición del elemento a buscar y la lista de centros.
  608. * Salidas: El contenido del elemento buscado.
  609. * Precondición: La posición indicada es una posición válida en la lista.}*/
  610.  
  611. #endif
  612.  
  613. ////////////////////////////////////
  614.  
  615. #include "types.h"
  616. #include "party_list.h"
  617. #include "center_list.h"
  618.  
  619. /* Write your code here... */
  620.  
  621. bool insertItemC(tItemC ItemC,tListC *ListC){
  622. if(ListC->lastPos == MAX - 1){
  623. return false;
  624. } else{
  625. if(isEmptyListC(*ListC) || strcmp(ItemC.centerName, ListC->data[ListC->lastPos].centerName) > 0){
  626. ListC->lastPos++;
  627. ListC->data[ListC->lastPos] = ItemC;
  628. } else{
  629. ListC->lastPos++;
  630. tPosC primero;
  631. primero = firstC(*ListC);
  632. if(strcmp(ItemC.centerName,ListC->data[primero].centerName) < 0){
  633. tPosC pos;
  634. pos = ListC->lastPos;
  635. while ((pos > 0) && strcmp(ItemC.centerName,ListC->data[pos-1].centerName) < 0){
  636. ListC->data[pos] = ListC->data[pos-1];
  637. pos--;
  638. } ListC->data[pos] = ItemC;
  639. }else{
  640. for(tPosC pos = ListC->lastPos; pos >= 0 && strcmp(ItemC.centerName, ListC->data[pos-1].centerName) < 0;
  641. pos--){
  642. ListC->data[pos] = ListC->data[pos-1];
  643. ListC->data[pos-1] = ItemC;
  644. }
  645. }
  646. } return true;
  647. }
  648. }
  649.  
  650. tPosC firstC(tListC ListC){
  651. return 0;
  652. }
  653.  
  654. tPosC lastC(tListC ListC){
  655. return ListC.lastPos;
  656. }
  657.  
  658. tPosC nextC(tPosC pos, tListC ListC){
  659. if (pos == lastC(ListC)){
  660. return NULLC;
  661. } else{
  662. return ++pos;
  663. }
  664. }
  665.  
  666. bool copyListC(tListC ListC, tListC *ListC1){
  667. tPosC pos;
  668. for(pos = 0; pos == ListC.lastPos; pos++){
  669. ListC1->data[pos] = ListC.data[pos];
  670. }
  671. ListC1->lastPos = ListC.lastPos;
  672. return true;
  673. }
  674.  
  675. void deleteAtPositionC(tPosC pos, tListC *ListC){
  676. while (pos != lastC(*ListC)){
  677. ListC->data[pos] = ListC->data[nextC(pos,*ListC)];
  678. pos = nextC(pos,*ListC);
  679. }
  680. ListC->lastPos--;
  681. }
  682.  
  683. tPosC previousC(tPosC pos, tListC ListC){
  684. if(pos == firstC(ListC)){
  685. return NULLC;
  686. } else{
  687. pos = pos - 1;
  688. }
  689. return pos;
  690. }
  691.  
  692. void createEmptyListC(tListC *ListC){
  693. ListC->lastPos = NULLC;
  694. }
  695.  
  696. bool isEmptyListC(tListC ListC){
  697. if(ListC.lastPos == NULLC){
  698. return true;
  699. } else{
  700. return false;
  701. }
  702. }
  703.  
  704. void updateValidVotesC (tNumVotes ValidVotes, tPosC pos, tListC *ListC){
  705. ListC->data[pos].validVotes = ValidVotes;
  706. }
  707.  
  708. void updateNullVotesC (tNumVotes NullVotes, tPosC pos, tListC *ListC){
  709. ListC->data[pos].nullVotes = NullVotes;
  710. }
  711.  
  712. tPosC findItemC (tCenterName NombreCentro, tListC ListC){
  713. tPosC pos;
  714. if(ListC.lastPos == NULLC){
  715. return NULLC;
  716. } else{
  717. pos = firstC(ListC);
  718. while((pos < ListC.lastPos) && (strcmp(ListC.data[pos].centerName, NombreCentro) != 0)){
  719. pos = nextC(pos,ListC);
  720. }
  721. if(strcmp(ListC.data[pos].centerName,NombreCentro) == 0){
  722. return pos;
  723. } else{
  724. return NULLC;
  725. }
  726. }
  727. }
  728.  
  729. void updateListC (tList Lista, tPosC pos, tListC *ListC){
  730. ListC->data[pos].partyList = Lista;
  731. }
  732.  
  733. tItemC getItemC(tPosC pos, tListC ListC){
  734. return ListC.data[pos];
  735. }
  736.  
  737. ////////////////////////
  738.  
  739. #ifndef TYPES_H
  740. #define TYPES_H
  741.  
  742. #define NAME_LENGTH_LIMIT 32
  743.  
  744. typedef char tPartyName[NAME_LENGTH_LIMIT];
  745. typedef char tCenterName[NAME_LENGTH_LIMIT];
  746. typedef int tNumVotes;
  747.  
  748. typedef struct tItemL {
  749. tPartyName partyName;
  750. tNumVotes numVotes;
  751. } tItemL;
  752.  
  753. #endif //TYPES_H
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement