Advertisement
Guest User

Untitled

a guest
Oct 23rd, 2016
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.82 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <string.h>
  5. #pragma warning (disable:4996)
  6.  
  7. #define LCHILD(x) 2 * x + 1
  8. #define RCHILD(x) 2 * x + 2
  9. #define PARENT(x) (x - 1) / 2
  10.  
  11. typedef struct node {
  12. int hodnota;
  13. char meno[1000];
  14. } node;
  15.  
  16. typedef struct maxHeap {
  17. int size;
  18. node *elem;
  19. } maxHeap;
  20.  
  21. maxHeap *tree = NULL;
  22.  
  23. void initMaxHeap() {
  24. int size = 1000000;
  25. tree = malloc(sizeof(maxHeap));
  26. tree->size = 0;
  27. tree->elem = malloc(size * sizeof(node));
  28. return;
  29. }
  30.  
  31. void swap(node *n1, node *n2) {
  32. node temp = *n1;
  33. *n1 = *n2;
  34. *n2 = temp;
  35. }
  36.  
  37. void heapify(int i) {
  38. int largest = (LCHILD(i) < tree->size && tree->elem[LCHILD(i)].hodnota > tree->elem[i].hodnota) ? LCHILD(i) : i;
  39. if (RCHILD(i) < tree->size && tree->elem[RCHILD(i)].hodnota > tree->elem[largest].hodnota) {
  40. largest = RCHILD(i);
  41. }
  42. if (largest != i) {
  43. swap(&(tree->elem[i]), &(tree->elem[largest]));
  44. heapify(largest);
  45. }
  46. }
  47.  
  48. void vloz(char *meno, int data) {
  49. node *nd = (node *)malloc(sizeof(node));
  50. nd->hodnota = data;
  51. strcpy(nd->meno, meno);
  52. int i = (tree->size)++;
  53. while (i && nd->hodnota > tree->elem[PARENT(i)].hodnota) {
  54. tree->elem[i] = tree->elem[PARENT(i)];
  55. i = PARENT(i);
  56. }
  57. tree->elem[i] = *nd;
  58. }
  59.  
  60. void deleteNode() {
  61. if (tree->size) {
  62. printf("%s\n", tree->elem[0].meno);
  63. tree->elem[0] = tree->elem[--(tree->size)];
  64. tree->elem = realloc(tree->elem, tree->size * sizeof(node));
  65. heapify(0);
  66. }
  67. else {
  68. free(tree->elem);
  69. }
  70. return;
  71. }
  72.  
  73. void *vyber_najvyssie() {
  74. deleteNode();
  75. return 0;
  76. }
  77.  
  78. int main() {
  79. char buf[1000];
  80. int x;
  81. initMaxHeap();
  82. while (scanf("%s", buf) > 0) {
  83. if (!strcmp(buf, "vyber"))
  84. vyber_najvyssie();
  85. else {
  86. scanf("%s %d", buf, &x);
  87. vloz(buf, x);
  88. }
  89. if (tree->size == 0) {
  90. initMaxHeap();
  91. }
  92. }
  93. return 0;
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement