static void *coalesce(void *bp) { bool prev_alloc = GET_ALLOC(FTRP(PREV_BLKP(bp))); bool next_alloc = GET_ALLOC(HDRP(NEXT_BLKP(bp))); size_t size = GET_SIZE(HDRP(bp)); if (prev_alloc && next_alloc) { LLadd(bp);/* Case 1 */ return (bp); } else if (prev_alloc && !next_alloc) { /* Case 2 */ LLrem(NEXT_BLKP(bp)); size += GET_SIZE(HDRP(NEXT_BLKP(bp))); PUT(HDRP(bp), PACK(size, 0)); PUT(FTRP(bp), PACK(size, 0)); } else if (!prev_alloc && next_alloc) { /* Case 3 */ LLrem(PREV_BLKP(bp)); size += GET_SIZE(HDRP(PREV_BLKP(bp))); PUT(FTRP(bp), PACK(size, 0)); PUT(HDRP(PREV_BLKP(bp)), PACK(size, 0)); bp = PREV_BLKP(bp); } else { /* Case 4 */ LLrem(PREV_BLKP(bp)); LLrem(NEXT_BLKP(bp)); size += GET_SIZE(HDRP(PREV_BLKP(bp))) + GET_SIZE(FTRP(NEXT_BLKP(bp))); PUT(HDRP(PREV_BLKP(bp)), PACK(size, 0)); PUT(FTRP(NEXT_BLKP(bp)), PACK(size, 0)); bp = PREV_BLKP(bp); } LLadd(bp); return (bp); }
int main() { LL *head = NULL; int i = 0; for (i = 0; i < 3; i++) { LLadd(&head, i); } LLtraverse(head); LLreverse(head, &head); printf("\n"); LLtraverse(head); return 0; }