Facebook
From Gracious Hog, 5 Years ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 243
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4.  
  5.  
  6. int left(int i);
  7. int right(int i);
  8. int parent(int i);
  9.  
  10.  
  11. void kopiec_przywroc(int*k,int n,int i);
  12. void kopiec_buduj(int* k,int n);
  13. int kopiec_usun_max(int* k,int* n);
  14. int kopiec_wstaw(int* k, int* n,int i);
  15.  
  16.  
  17. void main(){
  18.         char w='\0';
  19.  
  20.         int a,n,i,*tab=NULL;
  21.        
  22.                        
  23.                         while(1){      
  24.                                 printf("Kopce\n");
  25.  
  26.                 printf("w-wstaw do kopca\n");
  27.                 printf("u-usun wezel\n");
  28.                 printf("b-buduj kopiec\n");
  29.        
  30.                 printf("q-wyjscie\n");
  31.                 printf("Co chcesz zrobic:");
  32.                         fflush(stdin);
  33.                         scanf("%c",&w);
  34.         switch(w){
  35.                
  36.                 case 'b':
  37.                         printf("Podaj ilosc elementow z ktorych chcesz zbudowac kopiec:");
  38.                         fflush(stdin);
  39.                         scanf("%d",&n);
  40.                         if(n<=0){
  41.                                 printf("Blad");
  42.                                 break;
  43.                         }
  44.                         tab=(int*)malloc(n*sizeof(int));
  45.                         for(i=0;i<n;i++){
  46.                                 scanf("%d",&a);
  47.                                 *(tab+i)=a;
  48.                         }
  49.                         kopiec_buduj(tab,n);
  50.                         for(i=0;i<n;i++)
  51.                                 printf("%d;",*(tab+i));
  52.                                
  53.                         break;
  54.                 case 'u':
  55.                        
  56.                         kopiec_usun_max(tab,&n);
  57.                         for(i=0;i<n;i++)
  58.                                 printf("%d;",*(tab+i));
  59.  
  60.                         break;
  61.                 case 'w':
  62.                         printf("Podaj wartosc elementu do wstawienia:");
  63.                         fflush(stdin);
  64.                         scanf("%d",&a)
  65.                         kopiec_wstaw(tab,&n,a);
  66.                         for(i=0;i<n;i++)
  67.                                 printf("%d;",*(tab+i));
  68.                         break;
  69.                 case 'q':
  70.                         free(tab);
  71.                         break;
  72.                 default:
  73.                         printf("Błedne polecenie\n");
  74.  
  75.         }
  76.         getch();
  77.         system("cls");
  78.                         }
  79.        
  80. }
  81.  
  82. int left(int i){
  83.         return 2*i+1;
  84. }
  85. int right(int i){
  86.         return 2*i+2;
  87. }
  88. int parent(int i){
  89.         return (i-1)/2;
  90. }
  91.  
  92.  
  93. void kopiec_przywroc(int* k,int n,int i){
  94.         int l,r,max,tmp;
  95.         l=left(i);
  96.         r=right(i);
  97.         if(l<n && *(k+l)>*(k+i)){
  98.                 max=l;
  99.         }else{
  100.                 max=i;
  101.         }
  102.         if(r<n && *(k+r)>*(k+max)){
  103.                 max=r;
  104.         }
  105.         if(max!=i){
  106.                 tmp=*(k+max);
  107.                 *(k+max)=*(k+i);
  108.                 *(k+i)=tmp;
  109.                 kopiec_przywroc(k,n,max);
  110.                
  111.         }
  112. }
  113. void kopiec_buduj(int* k,int n){
  114.         int i=(n-1)/2;
  115.         while(i>=0){
  116.                 kopiec_przywroc(k,n,i);
  117.                 i--;
  118.         }
  119. }
  120.  
  121. int kopiec_usun_max(int* k,int* n){
  122.         int max=*k;
  123.         *k=*(k+*n);
  124.         *n=*n-1;
  125.         kopiec_przywroc(k,n,0);
  126.  
  127. }
  128. int kopiec_wstaw(int* k, int* n,int key){
  129.         int i;
  130.         *n=*n+1;
  131.         i=*n;
  132.         while(i>0 && *(k+parent(i))<key){
  133.                 *(k+i)=*(k+parent(i))
  134.                 i=parent(i);
  135.         }
  136.         *(k+i)=key
  137.  
  138.  
  139. }