Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <QCoreApplication>
- #include <stdio.h>
- #define STATUS_OK (0) /* Successfully completed. */
- #define STATUS_ERR_INVALID (-1) /* Bad argument value. E.g. null pointer */
- #define STATUS_ERR_NOMEM (-2) /* No memory to complete operation. */
- #define STATUS_ERR_NODATA (-3) /* No data to return/process. */
- #define STATUS_ERR_SINGULAR (-0x10) /* The matrix is singular (degenerative) */
- typedef struct _PrQueue PrQueue;
- struct _PrQueue
- {
- void * p_data;
- int n_priority;
- size_t n_max_size;
- };
- int prQueueCreate(size_t n_capacity, PrQueue ** pp_queue)
- {
- if(n_capacity == 0)
- return STATUS_ERR_NOMEM;
- *pp_queue = (PrQueue *) malloc(sizeof(PrQueue)*n_capacity);
- for( size_t j = 0; j< n_capacity; j++)
- {
- (*pp_queue)[j].p_data = NULL;
- (*pp_queue)[j].n_priority = -1;
- (*pp_queue)[j].n_max_size = n_capacity;
- }
- if(!pp_queue)
- return STATUS_ERR_INVALID;
- return STATUS_OK;
- }
- int prQueuePush(PrQueue * p_queue, int n_priority, void * p_item)
- {
- if(!p_item )
- return STATUS_ERR_INVALID;
- if(!((*p_queue).p_data))
- {
- (*p_queue).n_priority = n_priority;
- (*p_queue).p_data = p_item;
- }
- else
- {
- size_t n_count = 0;
- while((*p_queue).p_data)
- {
- n_count++;
- if((*(p_queue)).n_max_size <= n_count )
- return STATUS_ERR_NOMEM;
- else
- p_queue++;
- }
- (*p_queue).n_priority = n_priority;
- (*p_queue).p_data = p_item;
- }
- (*(p_queue+1)).p_data = NULL;
- (*(p_queue+1)).n_priority = -1;
- return STATUS_OK;
- }
- int prQueuePeek(PrQueue * p_queue, int * n_priority, void ** pp_item)
- {
- if(!pp_item)
- return STATUS_ERR_INVALID;
- int n_count = 0;
- int n_min_priority = (*p_queue).n_priority;
- while( (*p_queue).p_data )
- {
- n_count++;
- if ( (*p_queue).n_priority < n_min_priority )
- n_min_priority = (*p_queue).n_priority;
- p_queue++;
- }
- if(n_count <= 0 )
- return STATUS_ERR_NODATA;
- while((*(--p_queue)).n_priority != n_min_priority )
- {}
- *n_priority = n_min_priority;
- *pp_item = (*p_queue).p_data;
- return STATUS_OK;
- }
- int prQueuePop(PrQueue * p_queue, int *n_priority, void **pp_item)
- {
- int n_status = prQueuePeek(p_queue,n_priority,pp_item);
- if( n_status != STATUS_OK )
- return n_status;
- size_t n_count=0;
- PrQueue * p_tmp = p_queue;
- while( (*p_queue).p_data )
- {
- n_count++;
- p_queue++;
- }
- p_queue = p_tmp;
- while( n_count > 1 )
- {
- (*p_queue).n_priority = (*(p_queue+1)).n_priority;
- (*p_queue).p_data = (*(p_queue+1)).p_data;
- p_queue++;
- n_count--;
- }
- if( n_count <= 1 )
- {
- printf("%d - \n",(*p_queue).p_data);
- }
- else
- {
- (*p_queue).p_data = NULL;
- (*p_queue).n_priority = -1;
- }
- return STATUS_OK;
- }
- void prQueueRelease(PrQueue * p_queue)
- {
- while( (*p_queue).p_data )
- {
- (*p_queue).p_data = NULL;
- (*p_queue).n_priority = -1;
- p_queue++;
- }
- }
- int main(int argc, char *argv[])
- {
- QCoreApplication a(argc, argv);
- PrQueue* pr_queue;
- prQueueCreate(4,&pr_queue);
- printf("state1 %d \n",prQueuePush(pr_queue,7,(void *)NULL));
- prQueuePush(pr_queue,0,(int*)12);
- prQueuePush(pr_queue,1,(int*)13);
- prQueuePush(pr_queue,2,(int*)15);
- prQueuePush(pr_queue,3,(int*)156);
- printf("state2 %d \n",prQueuePush(pr_queue,7,(int*)152));
- for( int i = 0; i < 4; i++)
- {
- printf("%d \t",pr_queue[i].n_priority);
- printf("%d \t",int(pr_queue[i].p_data));
- printf("%d \n",pr_queue[i].n_max_size);
- }
- printf("\n");
- PrQueue *pr_queue_del;
- prQueueCreate(4,&pr_queue_del);
- prQueuePop(pr_queue,&pr_queue_del[0].n_priority,&pr_queue_del[0].p_data);
- prQueuePop(pr_queue,&pr_queue_del[1].n_priority,&pr_queue_del[1].p_data);
- prQueuePop(pr_queue,&pr_queue_del[2].n_priority,&pr_queue_del[2].p_data);
- prQueuePop(pr_queue,&pr_queue_del[3].n_priority,&pr_queue_del[3].p_data);
- for( int i = 0; i < 4; i++)
- {
- printf("%d \t",pr_queue[i].n_priority);
- printf("%d \t",int(pr_queue[i].p_data));
- printf("%d \n",pr_queue[i].n_max_size);
- }
- printf("\n");
- printf("remove - %d \t %d \n",pr_queue_del[0].n_priority,int(pr_queue_del[0].p_data));
- printf("\n");
- prQueueRelease(pr_queue);
- prQueueRelease(pr_queue_del);
- return a.exec();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement