Advertisement
Guest User

PQueue4

a guest
Feb 9th, 2016
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.01 KB | None | 0 0
  1. #include <QCoreApplication>
  2. #include <stdio.h>
  3. #define STATUS_OK               (0)  /* Successfully completed. */
  4. #define STATUS_ERR_INVALID     (-1)  /* Bad argument value. E.g. null pointer */
  5. #define STATUS_ERR_NOMEM       (-2)  /* No memory to complete operation. */
  6. #define STATUS_ERR_NODATA      (-3)  /* No data to return/process. */
  7. #define STATUS_ERR_SINGULAR (-0x10)  /* The matrix is singular (degenerative) */
  8. typedef struct _PrQueue PrQueue;
  9. struct _PrQueue
  10. {
  11.     void * p_data;
  12.     int n_priority;
  13.     size_t n_max_size;
  14. };
  15. int prQueueCreate(size_t n_capacity, PrQueue ** pp_queue)
  16. {
  17.     if(n_capacity == 0)
  18.         return STATUS_ERR_NOMEM;
  19.     *pp_queue = (PrQueue *) malloc(sizeof(PrQueue)*n_capacity);
  20.     for( size_t j = 0; j< n_capacity; j++)
  21.     {
  22.         (*pp_queue)[j].p_data = NULL;
  23.         (*pp_queue)[j].n_priority = -1;
  24.         (*pp_queue)[j].n_max_size = n_capacity;
  25.     }
  26.     if(!pp_queue)
  27.         return STATUS_ERR_INVALID;
  28.     return STATUS_OK;
  29. }
  30.  
  31. int prQueuePush(PrQueue * p_queue, int n_priority, void * p_item)
  32. {
  33.     if(!p_item )
  34.         return STATUS_ERR_INVALID;
  35.  
  36.     if(!((*p_queue).p_data))
  37.     {
  38.         (*p_queue).n_priority = n_priority;
  39.         (*p_queue).p_data = p_item;
  40.     }
  41.     else
  42.     {
  43.         size_t n_count  = 0;
  44.         while((*p_queue).p_data)
  45.         {
  46.             n_count++;
  47.             if((*(p_queue)).n_max_size  <=  n_count )
  48.                 return STATUS_ERR_NOMEM;
  49.             else
  50.                 p_queue++;
  51.         }
  52.         (*p_queue).n_priority = n_priority;
  53.         (*p_queue).p_data = p_item;
  54.     }
  55.     (*(p_queue+1)).p_data = NULL;
  56.     (*(p_queue+1)).n_priority = -1;
  57.  
  58.     return STATUS_OK;
  59. }
  60.  
  61. int prQueuePeek(PrQueue * p_queue, int * n_priority, void ** pp_item)
  62. {
  63.     if(!pp_item)
  64.         return STATUS_ERR_INVALID;
  65.     int n_count = 0;
  66.     int n_min_priority = (*p_queue).n_priority;
  67.     while( (*p_queue).p_data )
  68.     {
  69.         n_count++;
  70.         if ( (*p_queue).n_priority < n_min_priority )
  71.             n_min_priority = (*p_queue).n_priority;
  72.         p_queue++;
  73.     }
  74.     if(n_count <= 0 )
  75.         return STATUS_ERR_NODATA;
  76.     while((*(--p_queue)).n_priority != n_min_priority )
  77.     {}
  78.     *n_priority = n_min_priority;
  79.     *pp_item = (*p_queue).p_data;
  80.  
  81.     return STATUS_OK;
  82. }
  83.  
  84. int prQueuePop(PrQueue * p_queue, int *n_priority, void **pp_item)
  85. {
  86.     PrQueue * p_tmp = p_queue;
  87.     PrQueue * p_current = p_queue;
  88.     if(!pp_item)
  89.         return STATUS_ERR_INVALID;
  90.     size_t n_count = 0;
  91.     int n_min_priority = (*p_queue).n_priority;
  92.     while( (*p_queue).p_data )
  93.     {
  94.         n_count++;
  95.         if ( (*p_queue).n_priority < n_min_priority )
  96.             n_min_priority = (*p_queue).n_priority;
  97.         p_queue++;
  98.     }
  99.     if(n_count <= 0 )
  100.         return STATUS_ERR_NODATA;
  101.     while((*(--p_queue)).n_priority != n_min_priority )
  102.     {}
  103.     *n_priority = n_min_priority;
  104.     *pp_item = (*p_queue).p_data;
  105.  
  106.     p_current = p_queue;
  107.     p_queue = p_tmp;
  108.     n_count=0;
  109.     while( (*p_queue).p_data )
  110.     {
  111.         n_count++;
  112.         p_queue++;
  113.     }
  114.     p_queue = p_current;
  115.     while( n_count > 1  )
  116.     {
  117.         if((*(p_queue+1)).p_data)
  118.         {
  119.             (*p_queue).n_priority = (*(p_queue+1)).n_priority;
  120.             (*p_queue).p_data = (*(p_queue+1)).p_data;
  121.             p_queue++;
  122.         }
  123.         n_count--;
  124.     }
  125.     (*p_queue).p_data = NULL;
  126.     (*p_queue).n_priority = -1;
  127.     return STATUS_OK;
  128. }
  129.  
  130. void prQueueRelease(PrQueue * p_queue)
  131. {
  132.     while( (*p_queue).p_data )
  133.     {
  134.         (*p_queue).p_data = NULL;
  135.         (*p_queue).n_priority = -1;
  136.         p_queue++;
  137.     }
  138. }
  139.  
  140. int main(int argc, char *argv[])
  141. {
  142.     QCoreApplication a(argc, argv);
  143.     PrQueue* pr_queue;
  144.     prQueueCreate(4,&pr_queue);
  145.     printf("state1 %d \n",prQueuePush(pr_queue,7,(void *)NULL));
  146.     prQueuePush(pr_queue,4,(int*)12);
  147.     prQueuePush(pr_queue,1,(int*)13);
  148.     prQueuePush(pr_queue,2,(int*)15);
  149.     prQueuePush(pr_queue,0,(int*)156);
  150.     printf("state2 %d \n",prQueuePush(pr_queue,7,(int*)152));
  151.     for( int i = 0; i < 4; i++)
  152.     {
  153.         printf("%d \t",pr_queue[i].n_priority);
  154.         printf("%d \t",int(pr_queue[i].p_data));
  155.         printf("%d \n",pr_queue[i].n_max_size);
  156.     }
  157.     printf("\n");
  158.     PrQueue *pr_queue_del;
  159.     prQueueCreate(1,&pr_queue_del);
  160.     prQueuePop(pr_queue,&pr_queue_del[0].n_priority,&pr_queue_del[0].p_data);
  161.     prQueuePop(pr_queue,&pr_queue_del[0].n_priority,&pr_queue_del[0].p_data);
  162.     prQueuePop(pr_queue,&pr_queue_del[0].n_priority,&pr_queue_del[0].p_data);
  163.     prQueuePop(pr_queue,&pr_queue_del[0].n_priority,&pr_queue_del[0].p_data);
  164.     printf(" state3 -  %d \n",prQueuePop(pr_queue,&pr_queue_del[3].n_priority,&pr_queue_del[0].p_data));
  165.     for( int i = 0; i < 4; i++)
  166.     {
  167.         printf("%d \t",pr_queue[i].n_priority);
  168.         printf("%d \t",int(pr_queue[i].p_data));
  169.         printf("%d \n",pr_queue[i].n_max_size);
  170.     }
  171.     printf("\n");
  172.     prQueueRelease(pr_queue);
  173.     prQueueRelease(pr_queue_del);
  174.     return a.exec();
  175. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement