#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <assert.h>
struct TNode
{
int data;
struct TNode *next;
struct TNode *prev;
};
struct TList
{
struct TNode *head;
struct TNode *tail;
};
void ListInit(struct TList *L)
{
L->head = NULL;
L->tail = NULL;
}
int ListIsEmpty(struct TList *L)
{
return L->head == NULL;
}
void ListDisplayForward(struct TList* L)
{
int counter = 0;
struct TNode *curr = L->head;
printf("List (head-->tail): "); while (curr != NULL)
{
curr = curr->next;
counter++;
}
printf("Liczba wezlow listy: %d \n", counter
); }
void ListDisplayBackward(struct TList* L)
{
int counter = 0;
struct TNode *curr = L->tail;
printf("List (tail-->head): "); while (curr != NULL)
{
curr = curr->prev;
counter++;
}
printf("Liczba wezlow listy: %d \n", counter
); }
void ListInsertNodeTail(struct TList *L, struct TNode *p)
{
p->next = NULL;
if (L->head == NULL)
{
p->prev = NULL;
L->head = p;
}
else
{
L->tail->next = p;
p->prev = L->tail;
}
L->tail = p;
}
void ListInsertValueTail(struct TList *L, int k)
{
struct TNode
*node
= (struct TNode
*)malloc(sizeof(struct TNode
)); node->data = k;
ListInsertNodeTail(L, node);
}
struct TNode *ListDetachHead(struct TList *L)
{
struct TNode *temp = L->head;
if (L->head)
{
if (L->head->next == NULL)
L->tail = NULL;
else
L->head->next->prev = NULL;
L->head = L->head->next;
}
return temp;
}
void ListDeleteHead(struct TList *L)
{
}
void ListDelete(struct TList *L)
{
while (!ListIsEmpty(L))
ListDeleteHead(L);
}
void SwapNodePointers(struct TNode **A, struct TNode **B)
{
struct TNode *tmp = *A;
*A = *B;
*B = tmp;
}
void SwapListPointers(struct TList **A, struct TList **B)
{
struct TList *tmp = *A;
*A = *B;
*B = tmp;
}
int ListSplit(struct TList *L, struct TList *A, struct TList *B)
{
// prevNode trzeba zainicjalizowac nullem, coby się nie wysypać na początku
struct TNode *currNode, *prevNode = NULL;
ListInit(A);
ListInit(B);
while (currNode = ListDetachHead(L)) // "odłączamy głowę", dopóki nie zwróci nulla
{
// jeśli mamy początek nowej serii, to zamieniamy ze sobą wskaźniki do list,
// w ten sposób poniższy kod zapisujący do A będzie zapisywał naprzemiennie do list A, B
// (coby kod niżej był prostszy - jeden przypadek zamiast dwóch)
if (prevNode && prevNode->data > currNode->data)
SwapListPointers(&A, &B);
// zawsze zapisujemy do A, ale A nie zawsze wskazuje tę samą listę
ListInsertNodeTail(A, currNode);
// pamiętamy poprzednią wartość (węzeł z wartością), coby wykryć koniec aktualnej serii
prevNode = currNode;
}
return ListIsEmpty(B);
}
void ListMerge(struct TList* A, struct TList* B, struct TList *L)
{
struct TNode *tmpA, *tmpB, *prevA, *prevB;
tmpA = ListDetachHead(A); // akutalna wartość z A
tmpB = ListDetachHead(B); // akutalna wartość z B
ListInit(L);
while (tmpA && tmpB) // obie serie niepuste
{
// zapewnienie, że w A mamy serię z aktualnie niewiększą wartością,
// w razie potrzeby zamieniamy odpowiednie wskaźniki
// (coby kod niżej był prostszy - jeden przypadek zamiast dwóch)
if (tmpA->data > tmpB->data)
{
SwapNodePointers(&tmpA, &tmpB);
SwapNodePointers(&prevA, &prevB);
SwapListPointers(&A, &B);
}
// przepisanie aktualnej wartości z serii w A (czyli wartości niewiększej od tej z B)
ListInsertNodeTail(L, tmpA);
// i pobranie kolejnej
prevA = tmpA;
tmpA = ListDetachHead(A);
// sprawdzenie, czy była to ostatnia liczba z serii
if (!tmpA || tmpA->data < prevA->data)
{
// jeśli tak, przenosimy do końca aktualną serię z B (na pewno jest niepusta)
do
{
ListInsertNodeTail(L, tmpB);
prevB = tmpB;
tmpB = ListDetachHead(B);
} while (tmpB && prevB->data <= tmpB->data);
}
}
// w którejś z list (ale tylko jednej) mogły zostać jeszcze jakieś serie
// upewniamy się, że ewentualne "resztki" są w A (tu żaden Swap nie jest potrzebny, można nadpisać)
if (!tmpA)
tmpA = tmpB;
// przenosimy ewentualne "resztki"
while (tmpA)
{
ListInsertNodeTail(L, tmpA);
tmpA = ListDetachHead(A);
}
}
int main()
{
int k, n, m;
struct TList L, L1, L2;
ListInit(&L);
for (k = 1; k <= n; k++)
ListInsertValueTail
(&L
, rand() % m
);
ListDisplayForward(&L);
ListDisplayBackward(&L);
ListSplit(&L, &L1, &L2);
ListDisplayForward(&L1);
ListDisplayBackward(&L1);
ListDisplayForward(&L2);
ListDisplayBackward(&L2);
ListMerge(&L1, &L2, &L);
ListDisplayForward(&L);
ListDisplayBackward(&L);
ListDelete(&L);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHRpbWUuaD4KI2luY2x1ZGUgPGFzc2VydC5oPgoKc3RydWN0IFROb2RlCnsKCWludCBkYXRhOwoJc3RydWN0IFROb2RlICpuZXh0OwoJc3RydWN0IFROb2RlICpwcmV2Owp9OwoKc3RydWN0IFRMaXN0CnsKCXN0cnVjdCBUTm9kZSAqaGVhZDsKCXN0cnVjdCBUTm9kZSAqdGFpbDsKfTsKCnZvaWQgTGlzdEluaXQoc3RydWN0IFRMaXN0ICpMKQp7Cglhc3NlcnQoTCk7CglMLT5oZWFkID0gTlVMTDsKCUwtPnRhaWwgPSBOVUxMOwp9CgppbnQgTGlzdElzRW1wdHkoc3RydWN0IFRMaXN0ICpMKQp7Cglhc3NlcnQoTCk7CglyZXR1cm4gTC0+aGVhZCA9PSBOVUxMOwp9Cgp2b2lkIExpc3REaXNwbGF5Rm9yd2FyZChzdHJ1Y3QgVExpc3QqIEwpCnsKCWFzc2VydChMKTsKCWludCBjb3VudGVyID0gMDsKCXN0cnVjdCBUTm9kZSAqY3VyciA9IEwtPmhlYWQ7CglwcmludGYoIkxpc3QgKGhlYWQtLT50YWlsKTogIik7Cgl3aGlsZSAoY3VyciAhPSBOVUxMKQoJewoJCXByaW50ZigiJWQgLT4gIiwgY3Vyci0+ZGF0YSk7CgkJY3VyciA9IGN1cnItPm5leHQ7CgkJY291bnRlcisrOwoJfQoJcHJpbnRmKCJOVUxMIFxuIik7CglwcmludGYoIkxpY3piYSB3ZXpsb3cgbGlzdHk6ICVkIFxuIiwgY291bnRlcik7Cn0KCnZvaWQgTGlzdERpc3BsYXlCYWNrd2FyZChzdHJ1Y3QgVExpc3QqIEwpCnsKCWFzc2VydChMKTsKCWludCBjb3VudGVyID0gMDsKCXN0cnVjdCBUTm9kZSAqY3VyciA9IEwtPnRhaWw7CglwcmludGYoIkxpc3QgKHRhaWwtLT5oZWFkKTogIik7Cgl3aGlsZSAoY3VyciAhPSBOVUxMKQoJewoJCXByaW50ZigiJWQgLT4gIiwgY3Vyci0+ZGF0YSk7CgkJY3VyciA9IGN1cnItPnByZXY7CgkJY291bnRlcisrOwoJfQoJcHJpbnRmKCJOVUxMIFxuIik7CglwcmludGYoIkxpY3piYSB3ZXpsb3cgbGlzdHk6ICVkIFxuIiwgY291bnRlcik7Cn0KCnZvaWQgTGlzdEluc2VydE5vZGVUYWlsKHN0cnVjdCBUTGlzdCAqTCwgc3RydWN0IFROb2RlICpwKQp7Cglhc3NlcnQoTCk7Cglhc3NlcnQocCk7CglwLT5uZXh0ID0gTlVMTDsKCWlmIChMLT5oZWFkID09IE5VTEwpCgl7CgkJcC0+cHJldiA9IE5VTEw7CgkJTC0+aGVhZCA9IHA7Cgl9CgllbHNlCgl7CgkJTC0+dGFpbC0+bmV4dCA9IHA7CgkJcC0+cHJldiA9IEwtPnRhaWw7Cgl9CglMLT50YWlsID0gcDsKfQoKdm9pZCBMaXN0SW5zZXJ0VmFsdWVUYWlsKHN0cnVjdCBUTGlzdCAqTCwgaW50IGspCnsKCWFzc2VydChMKTsKCXN0cnVjdCBUTm9kZSAqbm9kZSA9IChzdHJ1Y3QgVE5vZGUgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBUTm9kZSkpOwoJYXNzZXJ0KG5vZGUpOwoJbm9kZS0+ZGF0YSA9IGs7CglMaXN0SW5zZXJ0Tm9kZVRhaWwoTCwgbm9kZSk7Cn0KCnN0cnVjdCBUTm9kZSAqTGlzdERldGFjaEhlYWQoc3RydWN0IFRMaXN0ICpMKQp7Cglhc3NlcnQoTCk7CglzdHJ1Y3QgVE5vZGUgKnRlbXAgPSBMLT5oZWFkOwoJaWYgKEwtPmhlYWQpCgl7CgkJaWYgKEwtPmhlYWQtPm5leHQgPT0gTlVMTCkKCQkJTC0+dGFpbCA9IE5VTEw7CgkJZWxzZQoJCQlMLT5oZWFkLT5uZXh0LT5wcmV2ID0gTlVMTDsKCQlMLT5oZWFkID0gTC0+aGVhZC0+bmV4dDsKCX0KCXJldHVybiB0ZW1wOwp9Cgp2b2lkIExpc3REZWxldGVIZWFkKHN0cnVjdCBUTGlzdCAqTCkKewoJYXNzZXJ0KEwpOwoJZnJlZShMaXN0RGV0YWNoSGVhZChMKSk7Cn0KCnZvaWQgTGlzdERlbGV0ZShzdHJ1Y3QgVExpc3QgKkwpCnsKCWFzc2VydChMKTsKCXdoaWxlICghTGlzdElzRW1wdHkoTCkpCgkJTGlzdERlbGV0ZUhlYWQoTCk7Cn0KCnZvaWQgU3dhcE5vZGVQb2ludGVycyhzdHJ1Y3QgVE5vZGUgKipBLCBzdHJ1Y3QgVE5vZGUgKipCKQp7Cglhc3NlcnQoQSk7Cglhc3NlcnQoQik7CglzdHJ1Y3QgVE5vZGUgKnRtcCA9ICpBOwoJKkEgPSAqQjsKCSpCID0gdG1wOwp9Cgp2b2lkIFN3YXBMaXN0UG9pbnRlcnMoc3RydWN0IFRMaXN0ICoqQSwgc3RydWN0IFRMaXN0ICoqQikKewoJYXNzZXJ0KEEpOwoJYXNzZXJ0KEIpOwoJc3RydWN0IFRMaXN0ICp0bXAgPSAqQTsKCSpBID0gKkI7CgkqQiA9IHRtcDsKfQoKaW50IExpc3RTcGxpdChzdHJ1Y3QgVExpc3QgKkwsIHN0cnVjdCBUTGlzdCAqQSwgc3RydWN0IFRMaXN0ICpCKQp7Cglhc3NlcnQoTCk7Cglhc3NlcnQoQSk7Cglhc3NlcnQoQik7CgkvLyBwcmV2Tm9kZSB0cnplYmEgemFpbmljamFsaXpvd2FjIG51bGxlbSwgY29ieSBzacSZIG5pZSB3eXN5cGHEhyBuYSBwb2N6xIV0a3UKCXN0cnVjdCBUTm9kZSAqY3Vyck5vZGUsICpwcmV2Tm9kZSA9IE5VTEw7CglMaXN0SW5pdChBKTsKCUxpc3RJbml0KEIpOwoJd2hpbGUgKGN1cnJOb2RlID0gTGlzdERldGFjaEhlYWQoTCkpIC8vICJvZMWCxIVjemFteSBnxYJvd8SZIiwgZG9ww7NraSBuaWUgendyw7NjaSBudWxsYQoJewoJCS8vIGplxZtsaSBtYW15IHBvY3rEhXRlayBub3dlaiBzZXJpaSwgdG8gemFtaWVuaWFteSB6ZSBzb2LEhSB3c2thxbpuaWtpIGRvIGxpc3QsCgkJLy8gdyB0ZW4gc3Bvc8OzYiBwb25pxbxzenkga29kIHphcGlzdWrEhWN5IGRvIEEgYsSZZHppZSB6YXBpc3l3YcWCIG5hcHJ6ZW1pZW5uaWUgZG8gbGlzdCBBLCBCCgkJLy8gIChjb2J5IGtvZCBuacW8ZWogYnnFgiBwcm9zdHN6eSAtIGplZGVuIHByenlwYWRlayB6YW1pYXN0IGR3w7NjaCkKCQlpZiAocHJldk5vZGUgJiYgcHJldk5vZGUtPmRhdGEgPiBjdXJyTm9kZS0+ZGF0YSkKCQkJU3dhcExpc3RQb2ludGVycygmQSwgJkIpOwoKCQkvLyB6YXdzemUgemFwaXN1amVteSBkbyBBLCBhbGUgQSBuaWUgemF3c3plIHdza2F6dWplIHTEmSBzYW3EhSBsaXN0xJkKCQlMaXN0SW5zZXJ0Tm9kZVRhaWwoQSwgY3Vyck5vZGUpOwoJCS8vIHBhbWnEmXRhbXkgcG9wcnplZG5pxIUgd2FydG/Fm8SHICh3xJl6ZcWCIHogd2FydG/Fm2NpxIUpLCBjb2J5IHd5a3J5xIcga29uaWVjIGFrdHVhbG5laiBzZXJpaQoJCXByZXZOb2RlID0gY3Vyck5vZGU7Cgl9CglyZXR1cm4gTGlzdElzRW1wdHkoQik7Cn0KCnZvaWQgTGlzdE1lcmdlKHN0cnVjdCBUTGlzdCogQSwgc3RydWN0IFRMaXN0KiBCLCBzdHJ1Y3QgVExpc3QgKkwpCnsKCWFzc2VydChMKTsKCWFzc2VydChBKTsKCWFzc2VydChCKTsKCXN0cnVjdCBUTm9kZSAqdG1wQSwgKnRtcEIsICpwcmV2QSwgKnByZXZCOwoJdG1wQSA9IExpc3REZXRhY2hIZWFkKEEpOyAvLyBha3V0YWxuYSB3YXJ0b8WbxIcgeiBBCgl0bXBCID0gTGlzdERldGFjaEhlYWQoQik7IC8vIGFrdXRhbG5hIHdhcnRvxZvEhyB6IEIKCUxpc3RJbml0KEwpOwoJd2hpbGUgKHRtcEEgJiYgdG1wQikgLy8gb2JpZSBzZXJpZSBuaWVwdXN0ZQoJewoJCS8vIHphcGV3bmllbmllLCDFvGUgdyBBIG1hbXkgc2VyacSZIHogYWt0dWFsbmllIG5pZXdpxJlrc3rEhSB3YXJ0b8WbY2nEhSwKCQkvLyB3IHJhemllIHBvdHJ6ZWJ5IHphbWllbmlhbXkgb2Rwb3dpZWRuaWUgd3NrYcW6bmlraQoJCS8vICAoY29ieSBrb2QgbmnFvGVqIGJ5xYIgcHJvc3RzenkgLSBqZWRlbiBwcnp5cGFkZWsgemFtaWFzdCBkd8OzY2gpCgkJaWYgKHRtcEEtPmRhdGEgPiB0bXBCLT5kYXRhKQoJCXsKCQkJU3dhcE5vZGVQb2ludGVycygmdG1wQSwgJnRtcEIpOwoJCQlTd2FwTm9kZVBvaW50ZXJzKCZwcmV2QSwgJnByZXZCKTsKCQkJU3dhcExpc3RQb2ludGVycygmQSwgJkIpOwoJCX0KCgkJLy8gcHJ6ZXBpc2FuaWUgYWt0dWFsbmVqIHdhcnRvxZtjaSB6IHNlcmlpIHcgQSAoY3p5bGkgd2FydG/Fm2NpIG5pZXdpxJlrc3plaiBvZCB0ZWogeiBCKQoJCUxpc3RJbnNlcnROb2RlVGFpbChMLCB0bXBBKTsKCQkvLyBpIHBvYnJhbmllIGtvbGVqbmVqCgkJcHJldkEgPSB0bXBBOwoJCXRtcEEgPSBMaXN0RGV0YWNoSGVhZChBKTsKCgkJLy8gc3ByYXdkemVuaWUsIGN6eSBiecWCYSB0byBvc3RhdG5pYSBsaWN6YmEgeiBzZXJpaQoJCWlmICghdG1wQSB8fCB0bXBBLT5kYXRhIDwgcHJldkEtPmRhdGEpCgkJewoJCQkvLyBqZcWbbGkgdGFrLCBwcnplbm9zaW15IGRvIGtvxYRjYSBha3R1YWxuxIUgc2VyacSZIHogQiAobmEgcGV3bm8gamVzdCBuaWVwdXN0YSkKCQkJZG8KCQkJewoJCQkJTGlzdEluc2VydE5vZGVUYWlsKEwsIHRtcEIpOwoJCQkJcHJldkIgPSB0bXBCOwoJCQkJdG1wQiA9IExpc3REZXRhY2hIZWFkKEIpOwoJCQl9IHdoaWxlICh0bXBCICYmIHByZXZCLT5kYXRhIDw9IHRtcEItPmRhdGEpOwoJCX0KCX0KCS8vIHcga3TDs3JlasWbIHogbGlzdCAoYWxlIHR5bGtvIGplZG5laikgbW9nxYJ5IHpvc3RhxIcgamVzemN6ZSBqYWtpZcWbIHNlcmllCgkvLyB1cGV3bmlhbXkgc2nEmSwgxbxlIGV3ZW50dWFsbmUgInJlc3p0a2kiIHPEhSB3IEEgKHR1IMW8YWRlbiBTd2FwIG5pZSBqZXN0IHBvdHJ6ZWJueSwgbW/FvG5hIG5hZHBpc2HEhykKCWlmICghdG1wQSkKCQl0bXBBID0gdG1wQjsKCS8vIHByemVub3NpbXkgZXdlbnR1YWxuZSAicmVzenRraSIKCXdoaWxlICh0bXBBKQoJewoJCUxpc3RJbnNlcnROb2RlVGFpbChMLCB0bXBBKTsKCQl0bXBBID0gTGlzdERldGFjaEhlYWQoQSk7Cgl9Cn0KCmludCBtYWluKCkKewoJaW50IGssIG4sIG07CglzdHJ1Y3QgVExpc3QgTCwgTDEsIEwyOwoJTGlzdEluaXQoJkwpOwoJc3JhbmQodGltZShOVUxMKSk7CglzY2FuZigiJWQgJWQiLCAmbiwgJm0pOwoJZm9yIChrID0gMTsgayA8PSBuOyBrKyspCgkJTGlzdEluc2VydFZhbHVlVGFpbCgmTCwgcmFuZCgpICUgbSk7CgoJcHJpbnRmKCJMaXN0IEwgXG4iKTsKCUxpc3REaXNwbGF5Rm9yd2FyZCgmTCk7CglMaXN0RGlzcGxheUJhY2t3YXJkKCZMKTsKCglMaXN0U3BsaXQoJkwsICZMMSwgJkwyKTsKCglwcmludGYoIlxuTGlzdCBMMSBcbiIpOwoJTGlzdERpc3BsYXlGb3J3YXJkKCZMMSk7CglMaXN0RGlzcGxheUJhY2t3YXJkKCZMMSk7CglwcmludGYoIlxuTGlzdCBMMiBcbiIpOwoJTGlzdERpc3BsYXlGb3J3YXJkKCZMMik7CglMaXN0RGlzcGxheUJhY2t3YXJkKCZMMik7CgoJTGlzdE1lcmdlKCZMMSwgJkwyLCAmTCk7CgoJcHJpbnRmKCJcbkxpc3QgTCBcbiIpOwoJTGlzdERpc3BsYXlGb3J3YXJkKCZMKTsKCUxpc3REaXNwbGF5QmFja3dhcmQoJkwpOwoKCUxpc3REZWxldGUoJkwpOwoKCXN5c3RlbSgiUEFVU0UiKTsKCXJldHVybiAwOwp9