#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Node {
char * value;
struct Node * prev;
struct Node * next;
} ;
// allocate node with 10-char buffer
struct Node* createNode( const char * value)
{
struct Node
* newNode
= malloc ( sizeof ( struct Node
) ) ;
newNode-> value[ 9 ] = '\0 ' ; // safety null termination
newNode-> prev = NULL;
newNode-> next = NULL;
return newNode;
}
// print list
void printList( struct Node * head)
{
struct Node * curr = head;
while ( curr)
{
printf ( "%s <-> " , curr
-> value
) ; curr = curr-> next;
}
}
////////////////////////////////////////////////////
// insert at end
void pushBack( struct Node ** head, const char * value)
{
struct Node * n = createNode( value) ;
if ( * head == NULL)
{
* head = n;
return ;
}
struct Node * curr = * head;
while ( curr-> next)
curr = curr-> next;
curr-> next = n;
n-> prev = curr;
}
////////////////////////////////////////////////////////
// insert after
void insertAfter( struct Node ** head, const char * target, const char * value)
{
struct Node * curr = * head;
while ( curr)
{
if ( strcmp ( curr
-> value
, target
) == 0 ) {
struct Node * n = createNode( value) ;
n-> next = curr-> next;
n-> prev = curr;
if ( curr-> next)
curr-> next-> prev = n;
curr-> next = n;
return ;
}
curr = curr-> next;
}
}
/////////////////////////////////////////////////////////
// insert before
void insertBefore( struct Node ** head, const char * target, const char * value)
{
struct Node * curr = * head;
while ( curr)
{
if ( strcmp ( curr
-> value
, target
) == 0 ) {
struct Node * n = createNode( value) ;
n-> next = curr;
n-> prev = curr-> prev;
if ( curr-> prev)
curr-> prev-> next = n;
else
* head = n;
curr-> prev = n;
return ;
}
curr = curr-> next;
}
}
// delete after
void deleteAfter( struct Node ** head, const char * target)
{
struct Node * curr = * head;
while ( curr)
{
if ( strcmp ( curr
-> value
, target
) == 0 && curr
-> next
) {
struct Node * del = curr-> next;
curr-> next = del-> next;
if ( del-> next)
del-> next-> prev = curr;
free ( del
-> value
) ; // FREE STRING return ;
}
curr = curr-> next;
}
}
// delete before
void deleteBefore( struct Node ** head, const char * target)
{
struct Node * curr = * head;
while ( curr)
{
if ( strcmp ( curr
-> value
, target
) == 0 && curr
-> prev
) {
struct Node * del = curr-> prev;
if ( del-> prev)
{
del-> prev-> next = curr;
curr-> prev = del-> prev;
}
else
{
* head = curr;
curr-> prev = NULL;
}
free ( del
-> value
) ; // FREE STRING return ;
}
curr = curr-> next;
}
}
// reverse list
void reverseList( struct Node ** head)
{
struct Node * curr = * head;
struct Node * temp = NULL;
while ( curr)
{
temp = curr-> prev;
curr-> prev = curr-> next;
curr-> next = temp;
curr = curr-> prev;
}
if ( temp)
* head = temp-> prev;
}
// FREE ENTIRE LIST (IMPORTANT)
void freeList( struct Node ** head)
{
struct Node * curr = * head;
struct Node * next = NULL;
while ( curr)
{
next = curr-> next;
curr = next;
}
* head = NULL;
}
// demo
int main( )
{
struct Node * head = NULL;
pushBack( & head, "A" ) ;
pushBack( & head, "B" ) ;
pushBack( & head, "C" ) ;
pushBack( & head, "D" ) ;
printList( head) ;
insertAfter( & head, "B" , "X" ) ;
printList( head) ;
insertBefore( & head, "C" , "Y" ) ;
printList( head) ;
deleteAfter( & head, "A" ) ;
printList( head) ;
deleteBefore( & head, "D" ) ;
printList( head) ;
reverseList( & head) ;
printList( head) ;
freeList( & head) ; // CLEAN MEMORY
return 0 ;
}
CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCnN0cnVjdCBOb2RlIHsKICAgIGNoYXIgKnZhbHVlOwogICAgc3RydWN0IE5vZGUgKnByZXY7CiAgICBzdHJ1Y3QgTm9kZSAqbmV4dDsKfTsKCi8vIGFsbG9jYXRlIG5vZGUgd2l0aCAxMC1jaGFyIGJ1ZmZlcgpzdHJ1Y3QgTm9kZSogY3JlYXRlTm9kZShjb25zdCBjaGFyICp2YWx1ZSkKewogICAgc3RydWN0IE5vZGUgKm5ld05vZGUgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBOb2RlKSk7CgogICAgbmV3Tm9kZS0+dmFsdWUgPSBtYWxsb2MoMTApOyAKICAgIHN0cm5jcHkobmV3Tm9kZS0+dmFsdWUsIHZhbHVlLCA5KTsKICAgIG5ld05vZGUtPnZhbHVlWzldID0gJ1wwJzsgICAgICAvLyBzYWZldHkgbnVsbCB0ZXJtaW5hdGlvbgogICAgbmV3Tm9kZS0+cHJldiA9IE5VTEw7CiAgICBuZXdOb2RlLT5uZXh0ID0gTlVMTDsKICAgIHJldHVybiBuZXdOb2RlOwp9CgovLyBwcmludCBsaXN0CnZvaWQgcHJpbnRMaXN0KHN0cnVjdCBOb2RlICpoZWFkKQp7CiAgICBzdHJ1Y3QgTm9kZSAqY3VyciA9IGhlYWQ7CgogICAgcHJpbnRmKCJOVUxMIDwtPiAiKTsKICAgIHdoaWxlIChjdXJyKQogICAgewogICAgICAgIHByaW50ZigiJXMgPC0+ICIsIGN1cnItPnZhbHVlKTsKICAgICAgICBjdXJyID0gY3Vyci0+bmV4dDsKICAgIH0KICAgIHByaW50ZigiTlVMTFxuIik7Cn0KLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyBpbnNlcnQgYXQgZW5kCnZvaWQgcHVzaEJhY2soc3RydWN0IE5vZGUgKipoZWFkLCBjb25zdCBjaGFyICp2YWx1ZSkKewogICAgc3RydWN0IE5vZGUgKm4gPSBjcmVhdGVOb2RlKHZhbHVlKTsKCiAgICBpZiAoKmhlYWQgPT0gTlVMTCkKICAgIHsKICAgICAgICAqaGVhZCA9IG47CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHN0cnVjdCBOb2RlICpjdXJyID0gKmhlYWQ7CiAgICB3aGlsZSAoY3Vyci0+bmV4dCkKICAgICAgICBjdXJyID0gY3Vyci0+bmV4dDsKCiAgICBjdXJyLT5uZXh0ID0gbjsKICAgIG4tPnByZXYgPSBjdXJyOwp9Ci8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIGluc2VydCBhZnRlcgp2b2lkIGluc2VydEFmdGVyKHN0cnVjdCBOb2RlICoqaGVhZCwgY29uc3QgY2hhciAqdGFyZ2V0LCBjb25zdCBjaGFyICp2YWx1ZSkKewogICAgc3RydWN0IE5vZGUgKmN1cnIgPSAqaGVhZDsKCiAgICB3aGlsZSAoY3VycikKICAgIHsKICAgICAgICBpZiAoc3RyY21wKGN1cnItPnZhbHVlLCB0YXJnZXQpID09IDApCiAgICAgICAgewogICAgICAgICAgICBzdHJ1Y3QgTm9kZSAqbiA9IGNyZWF0ZU5vZGUodmFsdWUpOwoKICAgICAgICAgICAgbi0+bmV4dCA9IGN1cnItPm5leHQ7CiAgICAgICAgICAgIG4tPnByZXYgPSBjdXJyOwoKICAgICAgICAgICAgaWYgKGN1cnItPm5leHQpCiAgICAgICAgICAgICAgICBjdXJyLT5uZXh0LT5wcmV2ID0gbjsKCiAgICAgICAgICAgIGN1cnItPm5leHQgPSBuOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGN1cnIgPSBjdXJyLT5uZXh0OwogICAgfQp9Ci8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyBpbnNlcnQgYmVmb3JlCnZvaWQgaW5zZXJ0QmVmb3JlKHN0cnVjdCBOb2RlICoqaGVhZCwgY29uc3QgY2hhciAqdGFyZ2V0LCBjb25zdCBjaGFyICp2YWx1ZSkKewogICAgc3RydWN0IE5vZGUgKmN1cnIgPSAqaGVhZDsKCiAgICB3aGlsZSAoY3VycikKICAgIHsKICAgICAgICBpZiAoc3RyY21wKGN1cnItPnZhbHVlLCB0YXJnZXQpID09IDApCiAgICAgICAgewogICAgICAgICAgICBzdHJ1Y3QgTm9kZSAqbiA9IGNyZWF0ZU5vZGUodmFsdWUpOwoKICAgICAgICAgICAgbi0+bmV4dCA9IGN1cnI7CiAgICAgICAgICAgIG4tPnByZXYgPSBjdXJyLT5wcmV2OwoKICAgICAgICAgICAgaWYgKGN1cnItPnByZXYpCiAgICAgICAgICAgICAgICBjdXJyLT5wcmV2LT5uZXh0ID0gbjsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgKmhlYWQgPSBuOwoKICAgICAgICAgICAgY3Vyci0+cHJldiA9IG47CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY3VyciA9IGN1cnItPm5leHQ7CiAgICB9Cn0KCi8vIGRlbGV0ZSBhZnRlcgp2b2lkIGRlbGV0ZUFmdGVyKHN0cnVjdCBOb2RlICoqaGVhZCwgY29uc3QgY2hhciAqdGFyZ2V0KQp7CiAgICBzdHJ1Y3QgTm9kZSAqY3VyciA9ICpoZWFkOwoKICAgIHdoaWxlIChjdXJyKQogICAgewogICAgICAgIGlmIChzdHJjbXAoY3Vyci0+dmFsdWUsIHRhcmdldCkgPT0gMCAmJiBjdXJyLT5uZXh0KQogICAgICAgIHsKICAgICAgICAgICAgc3RydWN0IE5vZGUgKmRlbCA9IGN1cnItPm5leHQ7CgogICAgICAgICAgICBjdXJyLT5uZXh0ID0gZGVsLT5uZXh0OwogICAgICAgICAgICBpZiAoZGVsLT5uZXh0KQogICAgICAgICAgICAgICAgZGVsLT5uZXh0LT5wcmV2ID0gY3VycjsKCiAgICAgICAgICAgIGZyZWUoZGVsLT52YWx1ZSk7ICAvLyBGUkVFIFNUUklORwogICAgICAgICAgICBmcmVlKGRlbCk7ICAgICAgICAgLy8gRlJFRSBOT0RFCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY3VyciA9IGN1cnItPm5leHQ7CiAgICB9Cn0KCi8vIGRlbGV0ZSBiZWZvcmUKdm9pZCBkZWxldGVCZWZvcmUoc3RydWN0IE5vZGUgKipoZWFkLCBjb25zdCBjaGFyICp0YXJnZXQpCnsKICAgIHN0cnVjdCBOb2RlICpjdXJyID0gKmhlYWQ7CgogICAgd2hpbGUgKGN1cnIpCiAgICB7CiAgICAgICAgaWYgKHN0cmNtcChjdXJyLT52YWx1ZSwgdGFyZ2V0KSA9PSAwICYmIGN1cnItPnByZXYpCiAgICAgICAgewogICAgICAgICAgICBzdHJ1Y3QgTm9kZSAqZGVsID0gY3Vyci0+cHJldjsKCiAgICAgICAgICAgIGlmIChkZWwtPnByZXYpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRlbC0+cHJldi0+bmV4dCA9IGN1cnI7CiAgICAgICAgICAgICAgICBjdXJyLT5wcmV2ID0gZGVsLT5wcmV2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgKmhlYWQgPSBjdXJyOwogICAgICAgICAgICAgICAgY3Vyci0+cHJldiA9IE5VTEw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZyZWUoZGVsLT52YWx1ZSk7ICAvLyBGUkVFIFNUUklORwogICAgICAgICAgICBmcmVlKGRlbCk7ICAgICAgICAgLy8gRlJFRSBOT0RFCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY3VyciA9IGN1cnItPm5leHQ7CiAgICB9Cn0KCi8vIHJldmVyc2UgbGlzdAp2b2lkIHJldmVyc2VMaXN0KHN0cnVjdCBOb2RlICoqaGVhZCkKewogICAgc3RydWN0IE5vZGUgKmN1cnIgPSAqaGVhZDsKICAgIHN0cnVjdCBOb2RlICp0ZW1wID0gTlVMTDsKCiAgICB3aGlsZSAoY3VycikKICAgIHsKICAgICAgICB0ZW1wID0gY3Vyci0+cHJldjsKICAgICAgICBjdXJyLT5wcmV2ID0gY3Vyci0+bmV4dDsKICAgICAgICBjdXJyLT5uZXh0ID0gdGVtcDsKICAgICAgICBjdXJyID0gY3Vyci0+cHJldjsKICAgIH0KCiAgICBpZiAodGVtcCkKICAgICAgICAqaGVhZCA9IHRlbXAtPnByZXY7Cn0KCi8vIEZSRUUgRU5USVJFIExJU1QgKElNUE9SVEFOVCkKdm9pZCBmcmVlTGlzdChzdHJ1Y3QgTm9kZSAqKmhlYWQpCnsKICAgIHN0cnVjdCBOb2RlICpjdXJyID0gKmhlYWQ7CiAgICBzdHJ1Y3QgTm9kZSAqbmV4dCA9IE5VTEw7CgogICAgd2hpbGUgKGN1cnIpCiAgICB7CiAgICAgICAgbmV4dCA9IGN1cnItPm5leHQ7CiAgICAgICAgZnJlZShjdXJyLT52YWx1ZSk7CiAgICAgICAgZnJlZShjdXJyKTsKICAgICAgICBjdXJyID0gbmV4dDsKICAgIH0KCiAgICAqaGVhZCA9IE5VTEw7Cn0KCi8vIGRlbW8KaW50IG1haW4oKQp7CiAgICBzdHJ1Y3QgTm9kZSAqaGVhZCA9IE5VTEw7CgogICAgcHVzaEJhY2soJmhlYWQsICJBIik7CiAgICBwdXNoQmFjaygmaGVhZCwgIkIiKTsKICAgIHB1c2hCYWNrKCZoZWFkLCAiQyIpOwogICAgcHVzaEJhY2soJmhlYWQsICJEIik7CgogICAgcHJpbnRMaXN0KGhlYWQpOwoKICAgIGluc2VydEFmdGVyKCZoZWFkLCAiQiIsICJYIik7CiAgICBwcmludExpc3QoaGVhZCk7CgogICAgaW5zZXJ0QmVmb3JlKCZoZWFkLCAiQyIsICJZIik7CiAgICBwcmludExpc3QoaGVhZCk7CgogICAgZGVsZXRlQWZ0ZXIoJmhlYWQsICJBIik7CiAgICBwcmludExpc3QoaGVhZCk7CgogICAgZGVsZXRlQmVmb3JlKCZoZWFkLCAiRCIpOwogICAgcHJpbnRMaXN0KGhlYWQpOwoKICAgIHJldmVyc2VMaXN0KCZoZWFkKTsKICAgIHByaW50TGlzdChoZWFkKTsKCiAgICBmcmVlTGlzdCgmaGVhZCk7ICAgLy8gQ0xFQU4gTUVNT1JZCgogICAgcmV0dXJuIDA7Cn0=