Advertisement
Guest User

Queue

a guest
Feb 9th, 2016
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.60 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.     int n_status = prQueuePeek(p_queue,n_priority,pp_item);
  87.     if( n_status != STATUS_OK )
  88.         return n_status;
  89.     size_t n_count=0;
  90.     PrQueue * p_tmp = p_queue;
  91.     while( (*p_queue).p_data )
  92.     {
  93.         n_count++;
  94.         p_queue++;
  95.     }
  96.     p_queue = p_tmp;
  97.     while( n_count > 1 )
  98.     {
  99.         (*p_queue).n_priority = (*(p_queue+1)).n_priority;
  100.         (*p_queue).p_data = (*(p_queue+1)).p_data;
  101.         p_queue++;
  102.         n_count--;
  103.     }
  104.     if( n_count <= 1 )
  105.     {
  106.         printf("%d  - \n",(*p_queue).p_data);
  107.     }
  108.     else
  109.     {
  110.         (*p_queue).p_data = NULL;
  111.         (*p_queue).n_priority = -1;
  112.     }
  113.  
  114.     return STATUS_OK;
  115. }
  116.  
  117. void prQueueRelease(PrQueue * p_queue)
  118. {
  119.     while( (*p_queue).p_data )
  120.     {
  121.         (*p_queue).p_data = NULL;
  122.         (*p_queue).n_priority = -1;
  123.         p_queue++;
  124.     }
  125. }
  126.  
  127. int main(int argc, char *argv[])
  128. {
  129.     QCoreApplication a(argc, argv);
  130.     PrQueue* pr_queue;
  131.     prQueueCreate(4,&pr_queue);
  132.     printf("state1 %d \n",prQueuePush(pr_queue,7,(void *)NULL));
  133.     prQueuePush(pr_queue,0,(int*)12);
  134.     prQueuePush(pr_queue,1,(int*)13);
  135.     prQueuePush(pr_queue,2,(int*)15);
  136.     prQueuePush(pr_queue,3,(int*)156);
  137.     printf("state2 %d \n",prQueuePush(pr_queue,7,(int*)152));
  138.     for( int i = 0; i < 4; i++)
  139.     {
  140.         printf("%d \t",pr_queue[i].n_priority);
  141.         printf("%d \t",int(pr_queue[i].p_data));
  142.         printf("%d \n",pr_queue[i].n_max_size);
  143.     }
  144.     printf("\n");
  145.     PrQueue *pr_queue_del;
  146.     prQueueCreate(4,&pr_queue_del);
  147.     prQueuePop(pr_queue,&pr_queue_del[0].n_priority,&pr_queue_del[0].p_data);
  148.     prQueuePop(pr_queue,&pr_queue_del[1].n_priority,&pr_queue_del[1].p_data);
  149.     prQueuePop(pr_queue,&pr_queue_del[2].n_priority,&pr_queue_del[2].p_data);
  150.     prQueuePop(pr_queue,&pr_queue_del[3].n_priority,&pr_queue_del[3].p_data);
  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.     printf("remove - %d  \t %d \n",pr_queue_del[0].n_priority,int(pr_queue_del[0].p_data));
  159.     printf("\n");
  160.     prQueueRelease(pr_queue);
  161.     prQueueRelease(pr_queue_del);
  162.     return a.exec();
  163. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement