EldiraSesto

HEAP LABI

Dec 3rd, 2019
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.03 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. typedef struct entry_s
  6. {
  7.     char songtitle[255], interpreter[255];
  8. } entry_t;
  9.  
  10. typedef struct heap_s
  11. {
  12.      entry_t *entries;
  13.      long size;
  14.      long next;
  15. } heap_t;
  16.  
  17. heap_t *create_heap(long size);
  18. void delete_heap(heap_t *heap);
  19. long compare(heap_t *heap, long index, char songtitle[], char interpreter[]);
  20. long is_empty(heap_t *heap, long index);
  21. void insert_entry(heap_t *heap, char songtitle[], char interpreter[]);
  22. long search_entry(heap_t *heap, char songtitle[], char interpreter[]);
  23. void print_entry(heap_t *heap, long index);
  24. void print(heap_t *heap);
  25. long count_entries(heap_t *heap);
  26. long count_entries_with_songtitle(heap_t *heap, char songtitle[]);
  27.  
  28. heap_t *create_heap(long size)
  29. {
  30.     heap_t *new_heap=calloc(1, sizeof(heap_t));
  31.     if(!new_heap)
  32.     {
  33.         fprintf(stderr, "ALLOCATE ERROR.\n");
  34.         return 0;
  35.     }
  36.     new_heap->entries=calloc(size, sizeof(entry_t));
  37.     if(!new_heap->entries)
  38.     {
  39.         free(new_heap);
  40.         fprintf(stderr, "ALLOCATE ERROR.\n");
  41.         return 0;
  42.     }
  43.     new_heap->size=size;
  44.     new_heap->next=0;
  45.     return new_heap;
  46. } // end create_heap
  47.  
  48. void delete_heap(heap_t *heap)
  49. {
  50.     if(!heap)
  51.         return;
  52.     free(heap->entries);
  53.     heap->entries=0;
  54.     free(heap);
  55. } // end delete_heap
  56.  
  57. long compare(heap_t *heap, long index, char songtitle[], char interpreter[])
  58. {
  59.     if(!heap)
  60.         return 0;
  61.     if(!strcmp(heap->entries[index].songtitle, songtitle) && !strcmp(heap->entries[index].interpreter, interpreter))
  62.     {
  63.         printf("COMPARE TRUE.\n");
  64.         return 1;
  65.     }
  66.     else
  67.     {
  68.         printf("COMPARE FALSE.\n");
  69.         return 0;
  70.     }
  71. } // end compare
  72.  
  73. long is_empty(heap_t *heap, long index)
  74. {
  75.     if(!heap)
  76.         return 0;
  77.     if(heap->entries[index].interpreter[0] && heap->entries[index].songtitle[0])
  78.     {
  79.         printf("NOT EMPTY.\n");
  80.         return 1;
  81.     }
  82.     printf("EMPTY.\n");
  83.     return 0;
  84. } // end is_empty
  85.  
  86. void up_heap(heap_t *heap, long index)
  87. {
  88.     entry_t *ent=heap->entries;
  89.     entry_t tmp=ent[index];
  90.     while((index>=1)&&(strcmp(ent[index/2].songtitle,tmp.songtitle)<0))
  91.     {
  92.         ent[index]=ent[index/2];
  93.         index=index/2;
  94.     }
  95.     ent[index]=tmp;
  96. } // end up_heap
  97.  
  98. void insert_entry(heap_t *heap, char songtitle[], char interpreter[])
  99. {
  100.     if(!heap)
  101.     {
  102.         fprintf(stderr, "ALLOCATE ERROR.\n");
  103.         return;
  104.     }
  105.     strcpy(heap->entries[heap->next].interpreter, interpreter);
  106.     strcpy(heap->entries[heap->next].songtitle, songtitle);
  107.  
  108.     up_heap(heap, heap->next);
  109.     heap->next++;
  110. } // end insert_entry
  111.  
  112. long search_entry(heap_t *heap, char songtitle[], char interpreter[])
  113. {
  114.     long i;
  115.     if(!heap)
  116.         return 0;
  117.     for(i=0;i<heap->size;i++)
  118.     {
  119.         if(!strcmp(heap->entries[i].songtitle,songtitle)&&!strcmp(heap->entries[i].interpreter,interpreter))
  120.         {
  121.             printf("FOUND ENTRY @ %p\n", &heap->entries[i]);
  122.             return i;
  123.         }
  124.     }
  125.     return 0;
  126. } // end search_entry
  127.  
  128. void print_entry(heap_t *heap, long index)
  129. {
  130.     if(!heap)
  131.         return;
  132.     printf("INDEX: %ld INTERPRETER: %s SONGTITLE: %s\n", index, heap->entries[index].interpreter, heap->entries[index].songtitle);
  133. } // end print_entry
  134.  
  135. void print(heap_t *heap)
  136. {
  137.     long i;
  138.     if(!heap)
  139.         return;
  140.     for(i=0;i<heap->size;i++)
  141.         print_entry(heap, i);
  142. } // end print
  143.  
  144. long count_entries(heap_t *heap)
  145. {
  146.     long i, count=0;
  147.     if(!heap)
  148.         return 0;
  149.     for(i=0;i<heap->size;i++)
  150.         if(heap->entries[i].interpreter[0] && heap->entries[i].songtitle[0])
  151.             count++;
  152.     return count;
  153. } // end count_entries
  154.  
  155. long count_entries_with_songtitle(heap_t *heap, char songtitle[])
  156. {
  157.     long i, count=0;
  158.     if(!heap)
  159.         return 0;
  160.     for(i=0;i<heap->size;i++)
  161.     {
  162.         if(!strcmp(heap->entries[i].songtitle, songtitle))
  163.             count++;
  164.     }
  165.     return count;
  166. } // end count_entries_with_songtitle
  167.  
  168. void rename_entry(heap_t *heap, char oldtitle[], char oldinterpreter[], char newtitle[], char newinterpreter[])
  169. {
  170.     long i=search_entry(heap, oldtitle, oldinterpreter);
  171.     if(!i)
  172.         return;
  173.     strcpy(heap->entries[i].interpreter,newinterpreter);
  174.     strcpy(heap->entries[i].songtitle, newtitle);
  175.  
  176.     up_heap(heap,i);
  177. } // end rename
  178.  
  179. int main()
  180. {
  181.     long c=0, size=0, index=0;
  182.     char songtitle[255], interpreter[255];
  183.     char newsongtitle[255], newinterpreter[255];
  184.     heap_t *myheap=0;
  185.     do
  186.     {
  187.         printf("1. CREATE HEAP\n2. DELETE HEAP\n3. COMPARE\n4. IS EMPTY\n5. INSERT ENTRY\n6. SEARCH ENTRY\n7. PRINT\n8. COUNT ENTRIES\n9. COUNT ENTRIES WITH INTERPRETER\n10. RENAME\n");
  188.         scanf("%ld", &c);
  189.         switch(c)
  190.         {
  191.             case 1:
  192.                 printf("SIZE: ");
  193.                 scanf("%ld", &size);
  194.                 myheap=create_heap(size);
  195.                 break;
  196.             case 2:
  197.                 delete_heap(myheap);
  198.                 myheap=0;
  199.                 break;
  200.             case 3:
  201.                 printf("INDEX: ");
  202.                 scanf("%ld", &index);
  203.                 printf("INTERPRETER: ");
  204.                 scanf("%s", interpreter);
  205.                 printf("SONGTITLE: ");
  206.                 scanf("%s", songtitle);
  207.                 compare(myheap, index, songtitle, interpreter);
  208.                 break;
  209.             case 4:
  210.                 printf("INDEX: ");
  211.                 scanf("%ld", &index);
  212.                 is_empty(myheap, index);
  213.                 break;
  214.             case 5:
  215.                 printf("INTERPRETER: ");
  216.                 scanf("%s", interpreter);
  217.                 printf("SONGTITLE: ");
  218.                 scanf("%s", songtitle);
  219.                 insert_entry(myheap, songtitle, interpreter);
  220.                 break;
  221.             case 6:
  222.                 printf("INTERPRETER: ");
  223.                 scanf("%s", interpreter);
  224.                 printf("SONGTITLE: ");
  225.                 scanf("%s", songtitle);
  226.                 search_entry(myheap, songtitle, interpreter);
  227.                 break;
  228.             case 7:
  229.                 print(myheap);
  230.                 break;
  231.             case 8:
  232.                 printf("%ld ENTRIES.\n", count_entries(myheap));
  233.                 break;
  234.             case 9:
  235.                 printf("SONGTITLE: ");
  236.                 scanf("%s", songtitle);
  237.                 printf("%ld ENTRIES WITH SONGTITLE %s\n", count_entries_with_songtitle(myheap, songtitle), songtitle);
  238.                 break;
  239.             case 10:
  240.                 printf("INTERPRETER: ");
  241.                 scanf("%s", interpreter);
  242.                 printf("SONGTITLE: ");
  243.                 scanf("%s", songtitle);
  244.                 printf("NEW INTERPRETER: ");
  245.                 scanf("%s", newinterpreter);
  246.                 printf("NEW SONGTITLE: ");
  247.                 scanf("%s", newsongtitle);
  248.                 rename_entry(myheap, songtitle, interpreter, newsongtitle, newinterpreter);
  249.                 break;
  250.         }
  251.     } while(c!=0);
  252.     return 0;
  253. }
Add Comment
Please, Sign In to add comment