Beispiel #1
0
unsigned int ABPEvenCount (PtABPNode proot)
{
    PtABPNode node = proot;
    PtQueue queue;
    unsigned int count = 0;

    if (proot == NULL) {
        Error = ABP_EMPTY;
        return -1;
    }

    if ((queue = QueueCreate(sizeof(PtABPNode))) == NULL) {
        Error = NO_MEM;
        return -1;
    }

    QueueEnqueue(queue, &node);
    
    while (!QueueIsEmpty(queue)) {
        QueueDequeue(queue, &node);
        if (!(node->Elem & 1))
            count++;

        if (node->PtLeft != NULL)
            QueueEnqueue(queue, &(node->PtLeft));
        if (node->PtRight != NULL)
            QueueEnqueue(queue, &(node->PtRight));
    }

    QueueDestroy(&queue);
    Error = OK;
    return count;
}
void queue_app_test(void)
{
	  unsigned int iloop = 0;
	  int data = 0;
    SqQueue sq;
    
    QueueCreate(&sq);
    
    for(iloop=0; iloop < 16; iloop++)
    {
    	#ifdef USE_LINE_QUEUE
        QueueEnterL(&sq, iloop*8);
      #else //USE_CIRCLE_QUEUE
        QueueEnterC(&sq, iloop*8);     
      #endif
        printf("queue get valid data len is %d \n", QueueGetTag(&sq));  //队列长度          
    }
    
  #ifdef USE_LINE_QUEUE
    while(QueueDeleteL(&sq, &data) != -1)
  #else //USE_CIRCLE_QUEUE
    while(QueueDeleteC(&sq, &data) != -1)
  #endif      
    {
        printf("queue get data value is %d \n", data);
        printf("queue get remain data len is %d \n", QueueGetTag(&sq));        
    }
    
    QueueDestroy(&sq);
    
    return;
}
Beispiel #3
0
static void test_basics(void)
{
    Queue *q = QueueNew(free);

    assert_int_equal(0, QueueCount(q));
    assert_true(QueueIsEmpty(q));


    QueueEnqueue(q, xstrdup("hello"));
    assert_int_equal(1, QueueCount(q));
    assert_false(QueueIsEmpty(q));
    assert_string_equal("hello", QueueHead(q));


    QueueEnqueue(q, xstrdup("world"));
    assert_int_equal(2, QueueCount(q));
    assert_string_equal("hello", QueueHead(q));


    char *head = QueueDequeue(q);
    assert_string_equal("hello", head);
    free(head);


    assert_string_equal("world", QueueHead(q));
    head = QueueDequeue(q);
    assert_string_equal("world", head);
    free(head);


    QueueDestroy(q);
}
Beispiel #4
0
ADTErr SafeQueueDestroy(SafeQueue* _queue)
{
	ADTErr error;
	if(NULL == _queue)
	{
		return ERR_NOT_INITIALIZED;
	}	
	
	/* destroying semaphores */
	error = SemDestroy(&_queue->m_prodSem);
	if (error != ERR_OK)
	{
		return error;
	}
	error = SemDestroy(&_queue->m_consSem);
	if (error != ERR_OK)
	{
		return error;
	}
	if (SUCCESS != pthread_mutex_destroy(&_queue->m_mutex))
	{
		return ERR_MUTEX_DESTROY_FAILED; 
	}

	/* destroying queue */
	QueueDestroy(_queue->m_queue);
	free(_queue);
	
	return ERR_OK;
}
Beispiel #5
0
int main(int argc, char *argv[])
{
    void *p = NULL;
    long msg = 0;
    void *pMsg = NULL;

    p = QueueCreate(10);
    if (NULL == p)
    {
        printf("Create queue failed.\n");
        return -1;
    }

    msg = 90;
    while (msg--)
    {
        if (QueuePush(p, (void *)msg) < 0)
        {
            printf("----------Queue is full now-----------\n");
            break;
        }

        printf("Push ok. [msg: %ld, size: %d]\n", msg, QueueGetSize(p));
    }
    
    msg = 15;
    while (msg--)
    {
        if (QueuePopPush(p, (void *)msg, &pMsg) < 0)
        {
            printf("----------QueuePopPush failed-----------\n");
            break;
        }

        printf("PopPush ok. [msgPop: %ld, msgPush: %ld, size: %d]\n",
            (long)pMsg, msg, QueueGetSize(p));
    }
    
    msg = 60;
    while (msg--)
    {
        if (QueuePop(p, &pMsg) < 0)
        {
            printf("----------Queue is empty now-----------\n");
            break;
        }

        printf("Pop ok. [msg: %ld, size: %d]\n", (long)pMsg, QueueGetSize(p));
    }

    QueueDestroy(p);
    system("pause");

    return 0;
}
Beispiel #6
0
static void test_destroy(void)
{
    Queue *q = QueueNew(free);

    QueueEnqueue(q, xstrdup("1"));
    QueueEnqueue(q, xstrdup("2"));
    QueueEnqueue(q, xstrdup("3"));

    assert_int_equal(3, QueueCount(q));

    QueueDestroy(q);
}
Beispiel #7
0
int QueueCreate(Queue_t * queue, int data_len)
{
	if (queue->head != NULL)
		QueueDestroy(queue);
	pthread_mutex_init(&queue->token, NULL);
	queue->data_len = data_len;
	queue->head = NULL;
	queue->tail = NULL;
	queue->data_len = 0;
	queue->queue_length = 0;
	return 0;
}
Beispiel #8
0
/*****************************************************************************
 * Destroy: destroy adjust video thread output method
 *****************************************************************************
 * Terminate an output method created by adjustCreateOutputMethod
 *****************************************************************************/
static void Destroy( vlc_object_t *p_this )
{
    filter_t *p_filter = (filter_t *)p_this;
    filter_sys_t *p_sys = p_filter->p_sys;

    BufferDestroy( &p_sys->input );
    BufferDestroy( &p_sys->output );
    QueueDestroy( &p_sys->atomic );
    QueueDestroy( &p_sys->pending );
    QueueDestroy( &p_sys->processed );
    do_ListDestroy( &p_sys->overlays );
    UnregisterCommand( p_filter );

    var_DelCallback( p_filter, "overlay-input", AdjustCallback, p_sys );
    var_DelCallback( p_filter, "overlay-output", AdjustCallback, p_sys );

    vlc_mutex_destroy( &p_sys->lock );
    free( p_sys->psz_inputfile );
    free( p_sys->psz_outputfile );
    free( p_sys );
}
Beispiel #9
0
void enet_slirp_stop(void) {
    int ret;
    
    if(slirp_inited) {
        Log_Printf(LOG_WARN, "Stopping SLIRP");
        slirp_inited=0;
        //slirp_exit(0);
        QueueDestroy(slirpq);
        SDL_DestroyMutex(slirp_mutex);
        SDL_WaitThread(tick_func_handle, &ret);
    }
}
CTAsyncWorkQueue::~CTAsyncWorkQueue()
{
    int size = 0;

    m_stopped = 1;

    if ((NULL != m_pEndQ) && (NULL != m_pRunQ))
    {
        while (1)
        {
            size = QueueGetSize(m_pEndQ) + QueueGetSize(m_pRunQ);
            if (0 == size)
            {
                break;
            }

            printf("QueueGetSize(m_pEndQ): %d, QueueGetSize(m_pRunQ): %d\n",
                QueueGetSize(m_pEndQ), QueueGetSize(m_pRunQ));
            usleep(100 * 1000);
        }
    }

    if (NULL == m_pThreadsGroup)
    {
        ThreadsGroupDestroy(m_pThreadsGroup, 1, 0);
        m_pThreadsGroup = NULL;
    }

    if (NULL == m_pRunQ)
    {
        QueueDestroy(m_pRunQ);
        m_pRunQ = NULL;
    }

    if (NULL == m_pEndQ)
    {
        QueueDestroy(m_pEndQ);
        m_pEndQ = NULL;
    }
}
Beispiel #11
0
///////////////////////////////////////////////////////////////////////////////
// ReqMgrDestroy
// 
// Description:
//	Destroys a request manager.
// 
// Inputs:
//	pReqMgr				- Pointer to a request manager.
//
// Outputs:
//	None.
// 
// Returns:
//	None.
// 
///////////////////////////////////////////////////////////////////////////////
void
ReqMgrDestroy(
	IN REQ_MGR* const pReqMgr )
{
	REQUEST_OBJECT	*pReq;

	ASSERT( pReqMgr );

	// Return all requests to the grow pool.
	if( pReqMgr->m_Initialized )
	{
		while( NULL != (pReq = (REQUEST_OBJECT*)QueueRemove( &pReqMgr->m_RequestQueue )) )
			GrowPoolPut( &pReqMgr->m_RequestPool, pReq );
	}

	QueueDestroy( &pReqMgr->m_RequestQueue );
	GrowPoolDestroy( &pReqMgr->m_RequestPool );

	pReqMgr->m_Initialized = FALSE;
}
void findSSShortestPath(graphT g, int v, int **distance) {
// int* findSSShortestPath(graphT g, int v) {
    queueT queue = QueueInit(n);
    // GraphPrint(g);
    // int* distance = malloc(sizeof(int) * n);
    int* parent = malloc(sizeof(int) * n);
    for (int i = 0; i < n; ++i) {
        // distance[i] = INT_MAX;
        (*distance)[i] = INT_MAX;
        parent[i] = UNDEFINED;
    }
    // distance[v] = 0;
    (*distance)[v] = 0;
    // printArray(distance, n);
    QueueEnqueue(queue, v);
    // printf("Enqueued %d\n", v);
    while (!QueueIsEmpty(queue)){
        int t = QueueDequeue(queue);
        // printf("Dequeued %d\n", t);
        // printf("Neighbor of %d: \n", t);
        for (int i = 0; i < GraphOutDegreeForVertex(g, t); ++i) {
            int w = g->alist[t]->list[i];
            // printf("    %d\n", w);
            if ((*distance)[w] == INT_MAX){
            // if (distance[w] == INT_MAX){
                parent[w] = t;
                // distance[w] = distance[t] + 1;
                (*distance)[w] = (*distance)[t] + 1;
                QueueEnqueue(queue, w);
                // printf("Enqueued %d\n", w);
            }
        }
    }
    // printArray(distance, n);
    QueueDestroy(queue);
    free(parent);
}
Beispiel #13
0
void ABPByLevel (PtABPNode proot) /* travessia por niveis - traversal by levels */
{
	PtABPNode Node = proot; PtQueue Queue;

	if (proot == NULL) { Error = ABP_EMPTY; return;	}	/* arvore vazia - empty tree */
	if ((Queue = QueueCreate (sizeof (PtABPNode))) == NULL) { Error = NO_MEM ; return; }

	QueueEnqueue (Queue, &Node);	/* armazenar a raiz - storing the root */

	while (!QueueIsEmpty (Queue))
	{
		QueueDequeue (Queue, &Node);	/* retirar o no - retrieve the node */
		printf ("%d ", Node->Elem);	/* imprimir o elemento - printing the element */

		/* armazenar a raiz da subarvore esquerda - storing the left subtree root */
		if (Node->PtLeft != NULL) QueueEnqueue (Queue, &Node->PtLeft);

		/* armazenar a raiz da subarvore direita - storing the right subtree root */
		if (Node->PtRight != NULL) QueueEnqueue (Queue, &Node->PtRight);
	}

	QueueDestroy (&Queue);	/* destruir a fila - releasing the queue */
    Error = OK;
}
Beispiel #14
0
int
main( int ac, char *av[] )
{
	pthread_t	th[5];
	int	i;
	M_t	*pM;
	int	Ret;
	void	*pRet;

	QueueInit( &Queue );

	/* 1. timeout */
	printf("### 1. 0s timed_wait timeout ###\n");
	pthread_create( &th[0], NULL, ThreadWait, (void*)0 );

	pRet = NULL;
	pthread_join( th[0], &pRet );
	ASSERT( (int)(intptr_t)(pRet) == ETIMEDOUT );

	/* 2. timeout */
	printf("### 2. 10s timed_wait timeout ###\n");
	pthread_create( &th[0], NULL, ThreadWait, (void*)(10*1000) );

	pRet = NULL;
	pthread_join( th[0], &pRet );
	ASSERT( (int)(intptr_t)(pRet) == ETIMEDOUT );

	/* 3. timeout */
	printf("### 3. 10s timed_wait receive and timeout###\n");
	pthread_create( &th[0], NULL, ThreadWait, (void*)(10*1000) );

	pM = M_Create( 3 );
	Ret = QueuePostEntry( &Queue, pM, m_Lnk );
	if( Ret < 0 )	goto err;

	pRet = NULL;
	pthread_join( th[0], &pRet );
	ASSERT( (int)(intptr_t)(pRet) == ETIMEDOUT );

	/* 4. one for-ever-wait thread */
	printf("### 4. one for_ever_wait thread ###\n");
	pthread_create( &th[0], NULL, ThreadWait, (void*)FOREVER );

	pM = M_Create( 4 );
	Ret = QueuePostEntry( &Queue, pM, m_Lnk );
	if( Ret < 0 )	goto err;

	sleep( 1 );

	/* 5. multi for-ever-wait threads */
	printf("### 5. multi for_ever_wait threads ###\n");
	pthread_create( &th[1], NULL, ThreadWait, (void*)FOREVER );
	pthread_create( &th[2], NULL, ThreadWait, (void*)FOREVER );
	pthread_create( &th[3], NULL, ThreadWait, (void*)FOREVER );
	pthread_create( &th[4], NULL, ThreadWait, (void*)FOREVER );

	pM = M_Create( 5 );
	Ret = QueuePostEntry( &Queue, pM, m_Lnk );
	if( Ret < 0 )	goto err;

	sleep( 1 );

	/* 6. suspend/resume */
	printf("### 6. suspend / count / resume###\n");
	QueueSuspend( &Queue );

	QueueMax(&Queue, 1 );
	pM = M_Create( 6 );
	Ret = QueuePostEntry( &Queue, pM, m_Lnk );
	printf("Posted to suspended Queue Ret=%d Cnt=%d Omitted=%d\n", 
				Ret, QueueCnt(&Queue), QueueOmitted(&Queue));
	pM = M_Create( 61 );
	Ret = QueuePostEntry( &Queue, pM, m_Lnk );
	printf("Posted to suspended Queue Ret=%d Cnt=%d Omitted=%d\n", 
				Ret, QueueCnt(&Queue), QueueOmitted(&Queue));
	pM = M_Create( 62 );
	Ret = QueuePostEntry( &Queue, pM, m_Lnk );
	printf("Posted to suspended Queue Ret=%d Cnt=%d Omitted=%d\n", 
				Ret, QueueCnt(&Queue), QueueOmitted(&Queue));
	sleep( 1 );
	printf("q_cnt=%d\n", QueueCnt( &Queue ) );

	printf("Resume Queue\n");
	QueueResume( &Queue );
	sleep( 1 );

	/* 7. Abort */
	printf("### 7. Abort ###\n");
	QueueAbort( &Queue, 9 );
	sleep( 10 );

	for( i = 0; i < 5; i++ ) {
		pRet = NULL;
		pthread_join( th[i], &pRet );
		ASSERT( (int)(intptr_t)(pRet) == SIGKILL );
	}

	QueueDestroy( &Queue );

	printf("=== OK ===\n");
	return( 0 );
err:
	printf("=== NG ===\n");
	return( -1 );
}
Beispiel #15
0
/***************************************************************
* Bank System Quit
****************************************************************/
int Bank_Sys_Term(void)
{
	QueueDestroy(&sq);
	QueueDestroy(&sq1);
	return 0;    
}
Beispiel #16
0
void serverKill( BalancedBTreeItem_t *node, IRCServer_t *server, bool unalloc )
{
    LinkedListItem_t       *listItem, *next;
    IRCChannel_t           *channel;
    BalancedBTreeItem_t    *item;

    if( server->enabled || server->enabledChanged ) {
        server->threadAbort = TRUE;
        thread_deregister( server->txThreadId );
        thread_deregister( server->threadId );
        server->threadAbort = FALSE;
    }

    if( unalloc ) {
        BalancedBTreeRemove( node->btree, node, LOCKED, FALSE );
    } else {
        server->enabled = FALSE;
    }

    if( server->txQueue ) {
        /* This *might* leak the contents of any queue entries? */
        QueueClear( server->txQueue, TRUE );
        QueueLock( server->txQueue );
        QueueDestroy( server->txQueue );
        server->txQueue = NULL;
    }

    if( server->channels ) {
        LinkedListLock( server->channels );
        BalancedBTreeLock( server->channelName );
        BalancedBTreeLock( server->channelNum );

        for( listItem = server->channels->head; listItem; listItem = next ) {
            next = listItem->next;
            channel = (IRCChannel_t *)listItem;

            regexpBotCmdRemove( server, channel );
            LinkedListRemove( server->channels, listItem, LOCKED );

            item = BalancedBTreeFind( server->channelName, 
                                      &channel->channel, LOCKED );
            if( item ) {
                BalancedBTreeRemove( server->channelName, item, LOCKED, 
                                     FALSE );
            }

            item = BalancedBTreeFind( server->channelNum, 
                                      &channel->channelId, LOCKED );
            if( item ) {
                BalancedBTreeRemove( server->channelNum, item, LOCKED, 
                                     FALSE );
            }

            ThreadAllNotifyChannel( channel );

            cursesMenuItemRemove( 2, MENU_CHANNELS, channel->menuText );
            free( channel->menuText );
            free( channel->channel );
            free( channel->fullspec );
            free( channel->url );
            free( channel );
        }

        LinkedListDestroy( server->channels );
        BalancedBTreeDestroy( server->channelName );
        BalancedBTreeDestroy( server->channelNum );
        server->channels = NULL;
        server->channelName = NULL;
        server->channelNum = NULL;
    }

    if( unalloc ) {
        free( server->server );
        free( server->password );
        free( server->nick );
        free( server->username );
        free( server->realname );
        free( server->nickserv );
        free( server->nickservmsg );
        free( server->ircInfo.Server );
    }

    LinkedListLock( server->floodList );
    for( listItem = server->floodList->head; listItem; listItem = next ) {
        next = listItem->next;

        LinkedListRemove( server->floodList, listItem, LOCKED );
        free( listItem );
    }
    LinkedListDestroy( server->floodList );
    server->floodList = NULL;

    ThreadAllNotifyServer( server );

    if( unalloc ) {
        cursesMenuItemRemove( 2, MENU_SERVERS, server->menuText );
        free( server->menuText );
        free( server->threadName );
        free( server->txThreadName );
        free( server );
        free( node );
    }
}
Beispiel #17
0
int main(void)
{
  QUEUE Queue = {0};

  CASHIER *Cashier = NULL;
  CASHIER EmptyCashier = {0};
  CUSTOMER Customer = {0};
  CUSTOMER EmptyCustomer = {0};

  int CustomerNumber = 0;
  int TotalItems = 0;
  int TotalItemsSold = 0;
  int SatisfiedCustomers = 0;
  long TotalWaitTime = 0;
  double Balance;

  int NumCashiers;
  unsigned long TempCashiers;
  long CurrentSecond;
  char Buff[10];
  char *endp;

  double p;

  int i;

  int NumCustomers = 0;

  srand((unsigned)time(NULL));

  /* get data from user */

  printf("Welcome to ShopSim!\n\n");
  printf("Your goal is to maximise profit.\n");
  printf("Income is number of items processed * %f.\n",
         PROFIT_PER_ITEM);
  printf("Customers wander in at random, on average %f"
         " per second.\n",
         CHANCE_OF_CUSTOMER);
  printf("Expenditure is %f per cashier.\n",
         CASHIER_WAGE);
  printf("You choose the number of cashiers.\n\n");
  printf("Dissatisfied customers cost you goodwill.\n");


  do
  {
    printf("How many cashiers today?\n");

    if(NULL == fgets(Buff, sizeof Buff, stdin))
    {
      printf("Program aborted.\n");
      exit(EXIT_FAILURE);
    }

    TempCashiers = strtoul(Buff, &endp, 10);

    /* On some platforms, unsigned long is longer than int,
     * so we use a temp to catch strtoul's value.
     */
    if(endp == Buff ||
       0 == TempCashiers ||
       TempCashiers > (unsigned long)INT_MAX)
    {
      printf("Ahem. %s? Try again!\n\n", Buff);
    }
    else
    {
      NumCashiers = (int)TempCashiers;
      Cashier = malloc(NumCashiers * sizeof *Cashier);
      if(NULL == Cashier)
      {
        printf("Hmm. Not enough RAM for "
               "that many cashiers. Try again.\n");
      }
    }
  } while(NULL == Cashier);

  for(i = 0; i < NumCashiers; i++)
  {
    Cashier[i] = EmptyCashier;
  }

  /* Run simulation from 9am till 5pm (28800 seconds) */

  assert(OPENING_TIME < CLOSING_TIME);

  for(CurrentSecond = OPENING_TIME;
      CurrentSecond < CLOSING_TIME;
      CurrentSecond++)
  {
    p = RandomP();
    if(p < CHANCE_OF_CUSTOMER)
    {
      Customer = EmptyCustomer;
      Customer.Index = CustomerNumber++;
      Customer.JoinedQueue = CurrentSecond;
      TotalItems += DoShopping(&Customer);

      /* Customer is now set up. Let's add
       * him to the queue.
       */
      if(QUEUE_SUCCESS !=
         QueueAdd(&Queue, 0, &Customer, sizeof Customer))
      {
        printf("Insufficient memory.\n");
        exit(EXIT_FAILURE);
      }
    }

    for(i = 0; i < NumCashiers; i++)
    {
      /* Deal with current customers */
      if(Cashier[i].TimeRemaining > 0)
      {
        --Cashier[i].TimeRemaining;
        if(0 == Cashier[i].TimeRemaining)
        {
          printf("%s: Cashier %d has served customer %d\n",
                 GetTime(CurrentSecond),
                 i,
                 Cashier[i].CustomerIndex);
        }
      }
      else
      {
        /* Deal with new customer, if any */
        if(QueueCount(&Queue) > 0)
        {
          QueueRemove(&Customer, &Queue);
          Cashier[i].TimeRemaining =
            (int)(Customer.NumItems * SECONDS_PER_ITEM);
          printf("Cashier %d busy for %d seconds\n",
            i, Cashier[i].TimeRemaining);
          Cashier[i].CustomerIndex = Customer.Index;
          TotalWaitTime += CurrentSecond;
          TotalWaitTime -= Customer.JoinedQueue;
          ++SatisfiedCustomers;
          ++Cashier[i].NumCustomersSeen;
          Cashier[i].NumItemsProcessed +=
            Customer.NumItems;
          TotalItemsSold += Customer.NumItems;
          printf("%s: Cashier %d is serving customer %d\n",
                 GetTime(CurrentSecond),
                 i,
                 Cashier[i].CustomerIndex);
          printf("Customer %d waiting time: %s\n",
                 Customer.Index,
                 GetTime(CurrentSecond -
                   Customer.JoinedQueue));
        }
      }
    }
  }

  printf("%s: Simulation ended.\n", GetTime(CurrentSecond));
  printf("Items sold     :%9d  ", TotalItemsSold);
  printf("Items picked up:%9d  ", TotalItems);
  printf("Difference     :%9d\n", TotalItems - TotalItemsSold);
  printf("Satisfied customers:%9d  ", SatisfiedCustomers);
  printf("Dissatisfied customers:%9d\n",
         CustomerNumber - SatisfiedCustomers);

  if(TotalWaitTime > 0)
  {
    printf("Average wait time "
           "(satisfied customers only): %s\n",
           GetTime((long)(TotalWaitTime /
           (double)SatisfiedCustomers)));
  }

  printf("\n\nCashier Report\n\n");
  for(i = 0; i < NumCashiers; i++)
  {
    printf("Cashier %2d saw %d customers ",
           i, Cashier[i].NumCustomersSeen);
    printf("and dealt with %d items.\n",
           Cashier[i].NumItemsProcessed);
  }

  Balance = TotalItemsSold * PROFIT_PER_ITEM;
  printf("Total profit      : %12.2f\n",
         Balance);
  printf("Less cashier wages: %12.2f\n",
         NumCashiers * CASHIER_WAGE);
  Balance -= NumCashiers * CASHIER_WAGE;

  printf("Balance           : %12.2f\n", Balance);

  printf("Goodwill Penalty  : %12.2f\n",
         (CustomerNumber - SatisfiedCustomers) *
         GOODWILL_PENALTY);

  Balance -= (CustomerNumber - SatisfiedCustomers) *
              GOODWILL_PENALTY;

  printf("End Balance       : %12.2f\n", Balance);

  printf("You %s.\n",
         Balance > 0 ?
         "win" : "lose");

  QueueDestroy(&Queue);

  free(Cashier);

  return 0;
}
Beispiel #18
0
int BFS(Graph *graph, BFSVertex *start, List *hops)
{
	Queue queue;
	AdjList *adjlist = NULL;
	AdjList *adjlist_Clear = NULL;
	BFSVertex *vertex_Clear = NULL;
	BFSVertex *vertex_Adj = NULL;
	ListElmt *element = NULL;
	ListElmt *member = NULL;

	for (element = ListHead(&GraphAdjLists(graph)); element != NULL; element = ListNext(element))
	{
		vertex_Clear = ((AdjList*)ListData(element))->vertex;
		if (graph->match(vertex_Clear, start))
		{
			vertex_Clear->color = gray;
			vertex_Clear->nHops = 0;
		}
		else
		{
			vertex_Clear->color = white;
			vertex_Clear->nHops = -1;
		}
	}

	QueueInit(&queue, NULL);
	if (GraphAdjList(graph, start, &adjlist_Clear) != 0)
	{
		QueueDestroy(&queue);
		return -1;
	}
	if (QueueEnqueue(&queue, adjlist_Clear) != 0)
	{
		QueueDestroy(&queue);
		return -1;
	}

	while (QueueSize(&queue) > 0)
	{
		adjlist = QueuePeek(&queue);
		for (member = ListHead(&adjlist->Adjacent); member != NULL; member = ListNext(member))
		{
			vertex_Adj = ListData(member);

			if (GraphAdjList(graph, vertex_Adj, &adjlist_Clear))
			{
				QueueDestroy(&queue);
				return -1;
			}
			vertex_Clear = adjlist_Clear->vertex;

			if (vertex_Clear->color == white)
			{
				vertex_Clear->color = gray;
				vertex_Clear->nHops = ((BFSVertex*)adjlist->vertex)->nHops + 1;

				if (QueueEnqueue(&queue, adjlist_Clear) != 0)
				{
					QueueDestroy(&queue);
					return -1;
				}
			}
		}
		if (QueueDequeue(&queue, (void**)&adjlist) == 0)
		{
			((BFSVertex*)adjlist->vertex)->color = black;
		}
		else
		{
			QueueDestroy(&queue);
			return -1;
		}
	}
	QueueDestroy(&queue);

	ListInit(hops, NULL);
	for (element = ListHead(&GraphAdjLists(graph)); element != NULL; element = ListNext(element))
	{
		vertex_Clear = ((AdjList*)ListData(element))->vertex;
		if (vertex_Clear->nHops != -1)
		{
			if (ListInsert_Next(hops, ListTail(hops), vertex_Clear) != 0)
			{
				ListDestory(hops);
				return -1;
			}
		}
	}

	return 0;
}