struct transaction * mergeSortedArrays(struct transaction *A, int ALen, struct transaction *B, int BLen) {
	if (A == NULL || B == NULL)
		return NULL;
	else
	{
		int Astatements = 0, Bstatements = 0, result = -1, Cstatements = 0;
		struct transaction C[30];
		while (Astatements < ALen && Bstatements < BLen)
		{
			result = comparision(A[Astatements].date, B[Bstatements].date);
			if (result == 0)
			{
				C[Cstatements] = A[Astatements];
				Cstatements++;
				Astatements++;
				C[Cstatements] = B[Bstatements];
				Bstatements++;
				Cstatements++;

			}
			else if (result == 1)
			{
				C[Cstatements] = B[Bstatements];
				Bstatements++;
				Cstatements++;
			}
			else
			{
				C[Cstatements] = A[Astatements];
				Astatements++;
				Cstatements++;
			}
		}
		if (Astatements == ALen && Bstatements < BLen)
		{
			while (Bstatements < BLen)
			{
				C[Cstatements] = B[Bstatements];
				Bstatements++;
				Cstatements++;
			}
		}
		else if (Astatements < ALen && Bstatements == BLen)
		{
			while (Astatements < ALen)
			{
				C[Cstatements] = A[Astatements];
				Astatements++;
				Cstatements++;
			}
		}
		return C;
	}
}
Ejemplo n.º 2
0
/*
 * list_add_sorted()
 *
 * dodaje do listy dany element. przy okazji mo¿e te¿ skopiowaæ zawarto¶æ.
 * je¶li poda siê jako ostatni parametr funkcjê porównuj±c± zawarto¶æ
 * elementów, mo¿e posortowaæ od razu.
 *
 *	- list - wska¼nik do listy,
 *	- data - wska¼nik do elementu,
 *	- alloc_size - rozmiar elementu, je¶li chcemy go skopiowaæ.
 *
 * zwraca wska¼nik zaalokowanego elementu lub NULL w przpadku b³êdu.
 */
void *list_add_sorted(list_t *list, void *data, int alloc_size, int (*comparision)(void *, void *))
{
	if (!list) {
		errno = EFAULT;
		return NULL;
	}

	list_t newlist = (list_t)malloc(sizeof(struct list));

	newlist->data = data;
	newlist->next = NULL;

	if (alloc_size) {
		newlist->data = malloc(alloc_size);
		memcpy(newlist->data, data, alloc_size);
	}

	list_t tmp;
	if (!(tmp = *list)) {
		*list = newlist;
	} else {
		if (!comparision) {
			while (tmp->next)
				tmp = tmp->next;
			tmp->next = newlist;
		} else {
			list_t prev = NULL;

			while (comparision(newlist->data, tmp->data) > 0) {
				prev = tmp;
				tmp = tmp->next;
				if (!tmp)
					break;
			}

			if (!prev) {
				tmp = *list;
				*list = newlist;
				newlist->next = tmp;
			} else {
				prev->next = newlist;
				newlist->next = tmp;
			}
		}
	}

	return newlist->data;
}