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; } }
/* * 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; }