Exemplo n.º 1
0
/* A generic insertion sort */
void
insertionSort(void * arr, int numElems, size_t size,
              int (*compFunc)(void *, void *))
{
    for(int i = 1; i < numElems; i++)
    {
        void * elemMem = malloc(size);
        assert(elemMem != NULL);
        memcpy(elemMem, (char *)arr + i * size, size);

        int j = i - 1;
        while(j >= 0)
        {
            void * lMem = (char *)arr + j * size;
            void * rMem = (char *)arr + (j + 1) * size;

            if(compFunc(elemMem, lMem))
                memcpy(rMem, lMem, size);
            else
                break;

            j--;
        }

        void * dest = (char *)arr + (j + 1) * size;
        memcpy(dest, elemMem, size);
        free(elemMem);
    }
}
Exemplo n.º 2
0
static TActor *AIGetClosestActor(Vec2i from, int (*compFunc)(TActor *))
{
    // Search all the actors and find the closest one that
    // satisfies the condition
    TActor *closest = NULL;
    int minDistance = -1;
    for (int i = 0; i < (int)gActors.size; i++)
    {
        TActor *a = CArrayGet(&gActors, i);
        if (!a->isInUse || a->dead)
        {
            continue;
        }
        // Never target invulnerables or civilians
        if (a->flags & (FLAGS_INVULNERABLE | FLAGS_PENALTY))
        {
            continue;
        }
        if (compFunc(a))
        {
            int distance =
                CHEBYSHEV_DISTANCE(from.x, from.y, a->Pos.x, a->Pos.y);
            if (!closest || distance < minDistance)
            {
                minDistance = distance;
                closest = a;
            }
        }
    }
    return closest;
}
NODE* Search(LINKEDLIST * pList, COMPAREFUNC compFunc, void* pData)
{
	NODE *pStart = pList->pTop;
	while (pStart)
	{
		if (compFunc(pStart, pData) == true)
		{
			return pStart;
		}
		pStart = pStart->pNext;
	}
	return NULL;
}