Advertisement
Guest User

HEAP A I B tacno

a guest
Dec 14th, 2018
112
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.  
  83.     printf("EMPTY.\n");
  84.     return 0;
  85. } // end is_empty
  86.  
  87. void up_heap(heap_t *heap, long index)
  88. {
  89.     entry_t *ent=heap->entries;
  90.     entry_t tmp=ent[index];
  91.     while((index>=2)&&(strcmp(ent[index/2].songtitle,tmp.songtitle)<0))
  92.     {
  93.         ent[index]=ent[index/2];
  94.         index=index/2;
  95.     }
  96.     ent[index]=tmp;
  97. } // end up_heap
  98.  
  99. void insert_entry(heap_t *heap, char songtitle[], char interpreter[])
  100. {
  101.     if(!heap)
  102.     {
  103.         fprintf(stderr, "ALLOCATE ERROR.\n");
  104.         return;
  105.     }
  106.     strcpy(heap->entries[heap->next].interpreter, interpreter);
  107.     strcpy(heap->entries[heap->next].songtitle, songtitle);
  108.  
  109.     up_heap(heap, heap->next);
  110.     heap->next++;
  111. } // end insert_entry
  112.  
  113. long search_entry(heap_t *heap, char songtitle[], char interpreter[])
  114. {
  115.     long i;
  116.     if(!heap)
  117.         return 0;
  118.     for(i=0;i<heap->size;i++)
  119.     {
  120.         if(!strcmp(heap->entries[i].songtitle,songtitle)&&!strcmp(heap->entries[i].interpreter,interpreter))
  121.         {
  122.             printf("FOUND ENTRY @ %p\n", &heap->entries[i]);
  123.             return i;
  124.         }
  125.     }
  126.     return 0;
  127. } // end search_entry
  128.  
  129. void print_entry(heap_t *heap, long index)
  130. {
  131.     if(!heap)
  132.         return;
  133.     printf("INDEX: %ld INTERPRETER: %s SONGTITLE: %s\n", index, heap->entries[index].interpreter, heap->entries[index].songtitle);
  134. } // end print_entry
  135.  
  136. void print(heap_t *heap)
  137. {
  138.     long i;
  139.     if(!heap)
  140.         return;
  141.     for(i=0;i<heap->size;i++)
  142.         print_entry(heap, i);
  143. } // end print
  144.  
  145. long count_entries(heap_t *heap)
  146. {
  147.     long i, count=0;
  148.     if(!heap)
  149.         return 0;
  150.     for(i=0;i<heap->size;i++)
  151.         if(heap->entries[i].interpreter[0] && heap->entries[i].songtitle[0])
  152.             count++;
  153.     return count;
  154. } // end count_entries
  155.  
  156. long count_entries_with_songtitle(heap_t *heap, char songtitle[])
  157. {
  158.     long i, count=0;
  159.     if(!heap)
  160.         return 0;
  161.     for(i=0;i<heap->size;i++)
  162.     {
  163.         if(!strcmp(heap->entries[i].songtitle, songtitle))
  164.             count++;
  165.     }
  166.     return count;
  167. } // end count_entries_with_songtitle
  168.  
  169. void rename_entry(heap_t *heap, char oldtitle[], char oldinterpreter[], char newtitle[], char newinterpreter[])
  170. {
  171.     long i=search_entry(heap, oldtitle, oldinterpreter);
  172.     if(!i)
  173.         return;
  174.     strcpy(heap->entries[i].interpreter,newinterpreter);
  175.     strcpy(heap->entries[i].songtitle, newtitle);
  176.  
  177.     up_heap(heap,i);
  178. } // end rename
  179.  
  180. int main()
  181. {
  182.     long c=0, size=0, index=0;
  183.     char songtitle[255], interpreter[255];
  184.     char newsongtitle[255], newinterpreter[255];
  185.     heap_t *myheap=0;
  186.     do
  187.     {
  188.         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");
  189.         scanf("%ld", &c);
  190.         switch(c)
  191.         {
  192.             case 1:
  193.                 printf("SIZE: ");
  194.                 scanf("%ld", &size);
  195.                 myheap=create_heap(size);
  196.                 break;
  197.             case 2:
  198.                 delete_heap(myheap);
  199.                 myheap=0;
  200.                 break;
  201.             case 3:
  202.                 printf("INDEX: ");
  203.                 scanf("%ld", &index);
  204.                 printf("INTERPRETER: ");
  205.                 scanf("%s", interpreter);
  206.                 printf("SONGTITLE: ");
  207.                 scanf("%s", songtitle);
  208.                 compare(myheap, index, songtitle, interpreter);
  209.                 break;
  210.             case 4:
  211.                 printf("INDEX: ");
  212.                 scanf("%ld", &index);
  213.                 is_empty(myheap, index);
  214.                 break;
  215.             case 5:
  216.                 printf("INTERPRETER: ");
  217.                 scanf("%s", interpreter);
  218.                 printf("SONGTITLE: ");
  219.                 scanf("%s", songtitle);
  220.                 insert_entry(myheap, songtitle, interpreter);
  221.                 break;
  222.             case 6:
  223.                 printf("INTERPRETER: ");
  224.                 scanf("%s", interpreter);
  225.                 printf("SONGTITLE: ");
  226.                 scanf("%s", songtitle);
  227.                 search_entry(myheap, songtitle, interpreter);
  228.                 break;
  229.             case 7:
  230.                 print(myheap);
  231.                 break;
  232.             case 8:
  233.                 printf("%ld ENTRIES.\n", count_entries(myheap));
  234.                 break;
  235.             case 9:
  236.                 printf("SONGTITLE: ");
  237.                 scanf("%s", songtitle);
  238.                 printf("%ld ENTRIES WITH SONGTITLE %s\n", count_entries_with_songtitle(myheap, songtitle), songtitle);
  239.                 break;
  240.             case 10:
  241.                 printf("INTERPRETER: ");
  242.                 scanf("%s", interpreter);
  243.                 printf("SONGTITLE: ");
  244.                 scanf("%s", songtitle);
  245.                 printf("NEW INTERPRETER: ");
  246.                 scanf("%s", newinterpreter);
  247.                 printf("NEW SONGTITLE: ");
  248.                 scanf("%s", newsongtitle);
  249.                 rename_entry(myheap, songtitle, interpreter, newsongtitle, newinterpreter);
  250.                 break;
  251.         }
  252.     } while(c!=0);
  253.     return 0;
  254. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement