#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Node {
char * data;
struct Node * prev;
struct Node * next;
} ;
struct Node* createNode( const char * data) {
struct Node
* newNode
= ( struct Node
* ) malloc ( sizeof ( struct Node
) ) ; if ( ! newNode) return NULL;
newNode
-> data
= ( char * ) malloc ( 10 * sizeof ( char ) ) ; newNode-> data[ 9 ] = '\0 ' ;
newNode-> prev = NULL;
newNode-> next = NULL;
return newNode;
}
void insertAfter( struct Node * node, const char * data) {
if ( ! node) return ;
struct Node * newNode = createNode( data) ;
newNode-> next = node-> next;
newNode-> prev = node;
if ( node-> next)
node-> next-> prev = newNode;
node-> next = newNode;
}
void insertBefore( struct Node ** head, struct Node * node, const char * data) {
if ( ! node || ! head) return ;
struct Node * newNode = createNode( data) ;
newNode-> next = node;
newNode-> prev = node-> prev;
if ( node-> prev)
node-> prev-> next = newNode;
else
* head = newNode;
node-> prev = newNode;
}
void deleteNode( struct Node ** head, struct Node * node) {
if ( ! node || ! head || !* head) return ;
if ( node-> prev)
node-> prev-> next = node-> next;
else
* head = node-> next;
if ( node-> next)
node-> next-> prev = node-> prev;
}
void printList( struct Node * head) {
while ( head) {
printf ( "%s <-> " , head
-> data
) ; head = head-> next;
}
}
void freeList( struct Node * head) {
struct Node * tmp;
while ( head) {
tmp = head;
head = head-> next;
}
}
int main( ) {
printf ( "==== POPULATE LIST ====\n " ) ;
struct Node * head = createNode( "A" ) ;
struct Node * b = createNode( "B" ) ;
struct Node * c = createNode( "C" ) ;
head-> next = b;
b-> prev = head;
b-> next = c;
c-> prev = b;
printList( head) ;
printf ( "\n ==== INSERT AFTER B ====\n " ) ; insertAfter( b, "X" ) ;
printList( head) ;
printf ( "\n ==== INSERT BEFORE B ====\n " ) ; insertBefore( & head, b, "Y" ) ;
printList( head) ;
printf ( "\n ==== DELETE NODE B ====\n " ) ; deleteNode( & head, b) ;
printList( head) ;
printf ( "\n ==== INSERT AT HEAD (before A) ====\n " ) ; insertBefore( & head, head, "HEAD" ) ;
printList( head) ;
printf ( "\n ==== INSERT AFTER TAIL ====\n " ) ; struct Node * tail = head;
while ( tail-> next) tail = tail-> next;
insertAfter( tail, "TAIL+1" ) ;
printList( head) ;
printf ( "\n ==== CLEANUP MEMORY ====\n " ) ; freeList( head) ;
return 0 ;
}
CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCnN0cnVjdCBOb2RlIHsKICAgIGNoYXIgKmRhdGE7CiAgICBzdHJ1Y3QgTm9kZSAqcHJldjsKICAgIHN0cnVjdCBOb2RlICpuZXh0Owp9OwoKc3RydWN0IE5vZGUqIGNyZWF0ZU5vZGUoY29uc3QgY2hhciAqZGF0YSkgewogICAgc3RydWN0IE5vZGUgKm5ld05vZGUgPSAoc3RydWN0IE5vZGUqKW1hbGxvYyhzaXplb2Yoc3RydWN0IE5vZGUpKTsKICAgIGlmICghbmV3Tm9kZSkgcmV0dXJuIE5VTEw7CgogICAgbmV3Tm9kZS0+ZGF0YSA9IChjaGFyKiltYWxsb2MoMTAgKiBzaXplb2YoY2hhcikpOwogICAgc3RybmNweShuZXdOb2RlLT5kYXRhLCBkYXRhLCA5KTsKICAgIG5ld05vZGUtPmRhdGFbOV0gPSAnXDAnOwoKICAgIG5ld05vZGUtPnByZXYgPSBOVUxMOwogICAgbmV3Tm9kZS0+bmV4dCA9IE5VTEw7CgogICAgcmV0dXJuIG5ld05vZGU7Cn0KCnZvaWQgaW5zZXJ0QWZ0ZXIoc3RydWN0IE5vZGUgKm5vZGUsIGNvbnN0IGNoYXIgKmRhdGEpIHsKICAgIGlmICghbm9kZSkgcmV0dXJuOwoKICAgIHN0cnVjdCBOb2RlICpuZXdOb2RlID0gY3JlYXRlTm9kZShkYXRhKTsKCiAgICBuZXdOb2RlLT5uZXh0ID0gbm9kZS0+bmV4dDsKICAgIG5ld05vZGUtPnByZXYgPSBub2RlOwoKICAgIGlmIChub2RlLT5uZXh0KQogICAgICAgIG5vZGUtPm5leHQtPnByZXYgPSBuZXdOb2RlOwoKICAgIG5vZGUtPm5leHQgPSBuZXdOb2RlOwp9Cgp2b2lkIGluc2VydEJlZm9yZShzdHJ1Y3QgTm9kZSAqKmhlYWQsIHN0cnVjdCBOb2RlICpub2RlLCBjb25zdCBjaGFyICpkYXRhKSB7CiAgICBpZiAoIW5vZGUgfHwgIWhlYWQpIHJldHVybjsKCiAgICBzdHJ1Y3QgTm9kZSAqbmV3Tm9kZSA9IGNyZWF0ZU5vZGUoZGF0YSk7CgogICAgbmV3Tm9kZS0+bmV4dCA9IG5vZGU7CiAgICBuZXdOb2RlLT5wcmV2ID0gbm9kZS0+cHJldjsKCiAgICBpZiAobm9kZS0+cHJldikKICAgICAgICBub2RlLT5wcmV2LT5uZXh0ID0gbmV3Tm9kZTsKICAgIGVsc2UKICAgICAgICAqaGVhZCA9IG5ld05vZGU7CgogICAgbm9kZS0+cHJldiA9IG5ld05vZGU7Cn0KCnZvaWQgZGVsZXRlTm9kZShzdHJ1Y3QgTm9kZSAqKmhlYWQsIHN0cnVjdCBOb2RlICpub2RlKSB7CiAgICBpZiAoIW5vZGUgfHwgIWhlYWQgfHwgISpoZWFkKSByZXR1cm47CgogICAgaWYgKG5vZGUtPnByZXYpCiAgICAgICAgbm9kZS0+cHJldi0+bmV4dCA9IG5vZGUtPm5leHQ7CiAgICBlbHNlCiAgICAgICAgKmhlYWQgPSBub2RlLT5uZXh0OwoKICAgIGlmIChub2RlLT5uZXh0KQogICAgICAgIG5vZGUtPm5leHQtPnByZXYgPSBub2RlLT5wcmV2OwoKICAgIGZyZWUobm9kZS0+ZGF0YSk7CiAgICBmcmVlKG5vZGUpOwp9Cgp2b2lkIHByaW50TGlzdChzdHJ1Y3QgTm9kZSAqaGVhZCkgewogICAgcHJpbnRmKCJMaXN0OiAiKTsKICAgIHdoaWxlIChoZWFkKSB7CiAgICAgICAgcHJpbnRmKCIlcyA8LT4gIiwgaGVhZC0+ZGF0YSk7CiAgICAgICAgaGVhZCA9IGhlYWQtPm5leHQ7CiAgICB9CiAgICBwcmludGYoIk5VTExcbiIpOwp9Cgp2b2lkIGZyZWVMaXN0KHN0cnVjdCBOb2RlICpoZWFkKSB7CiAgICBzdHJ1Y3QgTm9kZSAqdG1wOwogICAgd2hpbGUgKGhlYWQpIHsKICAgICAgICB0bXAgPSBoZWFkOwogICAgICAgIGhlYWQgPSBoZWFkLT5uZXh0OwogICAgICAgIGZyZWUodG1wLT5kYXRhKTsKICAgICAgICBmcmVlKHRtcCk7CiAgICB9Cn0KCmludCBtYWluKCkgewoKICAgIHByaW50ZigiPT09PSBQT1BVTEFURSBMSVNUID09PT1cbiIpOwoKICAgIHN0cnVjdCBOb2RlICpoZWFkID0gY3JlYXRlTm9kZSgiQSIpOwogICAgc3RydWN0IE5vZGUgKmIgPSBjcmVhdGVOb2RlKCJCIik7CiAgICBzdHJ1Y3QgTm9kZSAqYyA9IGNyZWF0ZU5vZGUoIkMiKTsKCiAgICBoZWFkLT5uZXh0ID0gYjsKICAgIGItPnByZXYgPSBoZWFkOwoKICAgIGItPm5leHQgPSBjOwogICAgYy0+cHJldiA9IGI7CgogICAgcHJpbnRMaXN0KGhlYWQpOwoKICAgIHByaW50ZigiXG49PT09IElOU0VSVCBBRlRFUiBCID09PT1cbiIpOwogICAgaW5zZXJ0QWZ0ZXIoYiwgIlgiKTsKICAgIHByaW50TGlzdChoZWFkKTsKCiAgICBwcmludGYoIlxuPT09PSBJTlNFUlQgQkVGT1JFIEIgPT09PVxuIik7CiAgICBpbnNlcnRCZWZvcmUoJmhlYWQsIGIsICJZIik7CiAgICBwcmludExpc3QoaGVhZCk7CgogICAgcHJpbnRmKCJcbj09PT0gREVMRVRFIE5PREUgQiA9PT09XG4iKTsKICAgIGRlbGV0ZU5vZGUoJmhlYWQsIGIpOwogICAgcHJpbnRMaXN0KGhlYWQpOwoKICAgIHByaW50ZigiXG49PT09IElOU0VSVCBBVCBIRUFEIChiZWZvcmUgQSkgPT09PVxuIik7CiAgICBpbnNlcnRCZWZvcmUoJmhlYWQsIGhlYWQsICJIRUFEIik7CiAgICBwcmludExpc3QoaGVhZCk7CgogICAgcHJpbnRmKCJcbj09PT0gSU5TRVJUIEFGVEVSIFRBSUwgPT09PVxuIik7CiAgICBzdHJ1Y3QgTm9kZSAqdGFpbCA9IGhlYWQ7CiAgICB3aGlsZSAodGFpbC0+bmV4dCkgdGFpbCA9IHRhaWwtPm5leHQ7CiAgICBpbnNlcnRBZnRlcih0YWlsLCAiVEFJTCsxIik7CiAgICBwcmludExpc3QoaGVhZCk7CgogICAgcHJpbnRmKCJcbj09PT0gQ0xFQU5VUCBNRU1PUlkgPT09PVxuIik7CiAgICBmcmVlTGlzdChoZWFkKTsKCiAgICByZXR1cm4gMDsKfQ==