#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Node {
char * data;
struct Node * prev;
struct Node * next;
} ;
// Create node
struct Node* createNode( const char * data) {
struct Node
* newNode
= ( struct Node
* ) malloc ( sizeof ( struct Node
) ) ; if ( ! newNode) return NULL;
newNode
-> data
= ( char * ) malloc ( 10 ) ; newNode-> data[ 9 ] = '\0 ' ;
newNode-> prev = NULL;
newNode-> next = NULL;
return newNode;
}
// Insert at end (helper)
void insertEnd( struct Node ** head, const char * data) {
struct Node * newNode = createNode( data) ;
if ( * head == NULL) {
* head = newNode;
return ;
}
struct Node * temp = * head;
while ( temp-> next)
temp = temp-> next;
temp-> next = newNode;
newNode-> prev = temp;
}
// Insert after a given value
void insertAfter( struct Node ** head, const char * target, const char * data) {
struct Node * temp = * head;
while ( temp
&& strcmp ( temp
-> data
, target
) != 0 ) temp = temp-> next;
if ( ! temp) return ;
struct Node * newNode = createNode( data) ;
newNode-> next = temp-> next;
newNode-> prev = temp;
if ( temp-> next)
temp-> next-> prev = newNode;
temp-> next = newNode;
}
// Insert before a given value
void insertBefore( struct Node ** head, const char * target, const char * data) {
struct Node * temp = * head;
while ( temp
&& strcmp ( temp
-> data
, target
) != 0 ) temp = temp-> next;
if ( ! temp) return ;
struct Node * newNode = createNode( data) ;
newNode-> next = temp;
newNode-> prev = temp-> prev;
if ( temp-> prev)
temp-> prev-> next = newNode;
else
* head = newNode; // updating head
temp-> prev = newNode;
}
// Delete node by value
void deleteNode( struct Node ** head, const char * target) {
struct Node * temp = * head;
while ( temp
&& strcmp ( temp
-> data
, target
) != 0 ) temp = temp-> next;
if ( ! temp) return ;
if ( temp-> prev)
temp-> prev-> next = temp-> next;
else
* head = temp-> next;
if ( temp-> next)
temp-> next-> prev = temp-> prev;
}
// Reverse DLL
void reverse( struct Node ** head) {
struct Node * temp = NULL;
struct Node * current = * head;
while ( current) {
temp = current-> prev;
current-> prev = current-> next;
current-> next = temp;
current = current-> prev;
}
if ( temp)
* head = temp-> prev;
}
// Print list
void printList( struct Node * head) {
while ( head) {
printf ( "%s <-> " , head
-> data
) ; head = head-> next;
}
}
// Free memory
void freeList( struct Node ** head) {
struct Node * temp;
while ( * head) {
temp = * head;
* head = ( * head) -> next;
}
}
int main( ) {
struct Node * head = NULL;
printf ( "==== CREATE LIST ====\n " ) ; insertEnd( & head, "A" ) ;
insertEnd( & head, "B" ) ;
insertEnd( & head, "C" ) ;
printList( head) ;
printf ( "\n ==== INSERT AFTER B ====\n " ) ; insertAfter( & head, "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, "A" , "HEAD" ) ;
printList( head) ;
printf ( "\n ==== REVERSE LIST ====\n " ) ; reverse( & head) ;
printList( head) ;
printf ( "\n ==== CLEANUP ====\n " ) ; freeList( & head) ;
return 0 ;
}
CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCnN0cnVjdCBOb2RlIHsKICAgIGNoYXIgKmRhdGE7CiAgICBzdHJ1Y3QgTm9kZSAqcHJldjsKICAgIHN0cnVjdCBOb2RlICpuZXh0Owp9OwoKLy8gQ3JlYXRlIG5vZGUKc3RydWN0IE5vZGUqIGNyZWF0ZU5vZGUoY29uc3QgY2hhciAqZGF0YSkgewogICAgc3RydWN0IE5vZGUgKm5ld05vZGUgPSAoc3RydWN0IE5vZGUqKW1hbGxvYyhzaXplb2Yoc3RydWN0IE5vZGUpKTsKICAgIGlmICghbmV3Tm9kZSkgcmV0dXJuIE5VTEw7CgogICAgbmV3Tm9kZS0+ZGF0YSA9IChjaGFyKiltYWxsb2MoMTApOwogICAgc3RybmNweShuZXdOb2RlLT5kYXRhLCBkYXRhLCA5KTsKICAgIG5ld05vZGUtPmRhdGFbOV0gPSAnXDAnOwoKICAgIG5ld05vZGUtPnByZXYgPSBOVUxMOwogICAgbmV3Tm9kZS0+bmV4dCA9IE5VTEw7CgogICAgcmV0dXJuIG5ld05vZGU7Cn0KCi8vIEluc2VydCBhdCBlbmQgKGhlbHBlcikKdm9pZCBpbnNlcnRFbmQoc3RydWN0IE5vZGUgKipoZWFkLCBjb25zdCBjaGFyICpkYXRhKSB7CiAgICBzdHJ1Y3QgTm9kZSAqbmV3Tm9kZSA9IGNyZWF0ZU5vZGUoZGF0YSk7CgogICAgaWYgKCpoZWFkID09IE5VTEwpIHsKICAgICAgICAqaGVhZCA9IG5ld05vZGU7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHN0cnVjdCBOb2RlICp0ZW1wID0gKmhlYWQ7CiAgICB3aGlsZSAodGVtcC0+bmV4dCkKICAgICAgICB0ZW1wID0gdGVtcC0+bmV4dDsKCiAgICB0ZW1wLT5uZXh0ID0gbmV3Tm9kZTsKICAgIG5ld05vZGUtPnByZXYgPSB0ZW1wOwp9CgovLyBJbnNlcnQgYWZ0ZXIgYSBnaXZlbiB2YWx1ZQp2b2lkIGluc2VydEFmdGVyKHN0cnVjdCBOb2RlICoqaGVhZCwgY29uc3QgY2hhciAqdGFyZ2V0LCBjb25zdCBjaGFyICpkYXRhKSB7CiAgICBzdHJ1Y3QgTm9kZSAqdGVtcCA9ICpoZWFkOwoKICAgIHdoaWxlICh0ZW1wICYmIHN0cmNtcCh0ZW1wLT5kYXRhLCB0YXJnZXQpICE9IDApCiAgICAgICAgdGVtcCA9IHRlbXAtPm5leHQ7CgogICAgaWYgKCF0ZW1wKSByZXR1cm47CgogICAgc3RydWN0IE5vZGUgKm5ld05vZGUgPSBjcmVhdGVOb2RlKGRhdGEpOwoKICAgIG5ld05vZGUtPm5leHQgPSB0ZW1wLT5uZXh0OwogICAgbmV3Tm9kZS0+cHJldiA9IHRlbXA7CgogICAgaWYgKHRlbXAtPm5leHQpCiAgICAgICAgdGVtcC0+bmV4dC0+cHJldiA9IG5ld05vZGU7CgogICAgdGVtcC0+bmV4dCA9IG5ld05vZGU7Cn0KCi8vIEluc2VydCBiZWZvcmUgYSBnaXZlbiB2YWx1ZQp2b2lkIGluc2VydEJlZm9yZShzdHJ1Y3QgTm9kZSAqKmhlYWQsIGNvbnN0IGNoYXIgKnRhcmdldCwgY29uc3QgY2hhciAqZGF0YSkgewogICAgc3RydWN0IE5vZGUgKnRlbXAgPSAqaGVhZDsKCiAgICB3aGlsZSAodGVtcCAmJiBzdHJjbXAodGVtcC0+ZGF0YSwgdGFyZ2V0KSAhPSAwKQogICAgICAgIHRlbXAgPSB0ZW1wLT5uZXh0OwoKICAgIGlmICghdGVtcCkgcmV0dXJuOwoKICAgIHN0cnVjdCBOb2RlICpuZXdOb2RlID0gY3JlYXRlTm9kZShkYXRhKTsKCiAgICBuZXdOb2RlLT5uZXh0ID0gdGVtcDsKICAgIG5ld05vZGUtPnByZXYgPSB0ZW1wLT5wcmV2OwoKICAgIGlmICh0ZW1wLT5wcmV2KQogICAgICAgIHRlbXAtPnByZXYtPm5leHQgPSBuZXdOb2RlOwogICAgZWxzZQogICAgICAgICpoZWFkID0gbmV3Tm9kZTsgICAvLyB1cGRhdGluZyBoZWFkCgogICAgdGVtcC0+cHJldiA9IG5ld05vZGU7Cn0KCi8vIERlbGV0ZSBub2RlIGJ5IHZhbHVlCnZvaWQgZGVsZXRlTm9kZShzdHJ1Y3QgTm9kZSAqKmhlYWQsIGNvbnN0IGNoYXIgKnRhcmdldCkgewogICAgc3RydWN0IE5vZGUgKnRlbXAgPSAqaGVhZDsKCiAgICB3aGlsZSAodGVtcCAmJiBzdHJjbXAodGVtcC0+ZGF0YSwgdGFyZ2V0KSAhPSAwKQogICAgICAgIHRlbXAgPSB0ZW1wLT5uZXh0OwoKICAgIGlmICghdGVtcCkgcmV0dXJuOwoKICAgIGlmICh0ZW1wLT5wcmV2KQogICAgICAgIHRlbXAtPnByZXYtPm5leHQgPSB0ZW1wLT5uZXh0OwogICAgZWxzZQogICAgICAgICpoZWFkID0gdGVtcC0+bmV4dDsKCiAgICBpZiAodGVtcC0+bmV4dCkKICAgICAgICB0ZW1wLT5uZXh0LT5wcmV2ID0gdGVtcC0+cHJldjsKCiAgICBmcmVlKHRlbXAtPmRhdGEpOwogICAgZnJlZSh0ZW1wKTsKfQoKLy8gUmV2ZXJzZSBETEwKdm9pZCByZXZlcnNlKHN0cnVjdCBOb2RlICoqaGVhZCkgewogICAgc3RydWN0IE5vZGUgKnRlbXAgPSBOVUxMOwogICAgc3RydWN0IE5vZGUgKmN1cnJlbnQgPSAqaGVhZDsKCiAgICB3aGlsZSAoY3VycmVudCkgewogICAgICAgIHRlbXAgPSBjdXJyZW50LT5wcmV2OwogICAgICAgIGN1cnJlbnQtPnByZXYgPSBjdXJyZW50LT5uZXh0OwogICAgICAgIGN1cnJlbnQtPm5leHQgPSB0ZW1wOwogICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5wcmV2OwogICAgfQoKICAgIGlmICh0ZW1wKQogICAgICAgICpoZWFkID0gdGVtcC0+cHJldjsKfQoKLy8gUHJpbnQgbGlzdAp2b2lkIHByaW50TGlzdChzdHJ1Y3QgTm9kZSAqaGVhZCkgewogICAgcHJpbnRmKCJMaXN0OiAiKTsKICAgIHdoaWxlIChoZWFkKSB7CiAgICAgICAgcHJpbnRmKCIlcyA8LT4gIiwgaGVhZC0+ZGF0YSk7CiAgICAgICAgaGVhZCA9IGhlYWQtPm5leHQ7CiAgICB9CiAgICBwcmludGYoIk5VTExcbiIpOwp9CgovLyBGcmVlIG1lbW9yeQp2b2lkIGZyZWVMaXN0KHN0cnVjdCBOb2RlICoqaGVhZCkgewogICAgc3RydWN0IE5vZGUgKnRlbXA7CgogICAgd2hpbGUgKCpoZWFkKSB7CiAgICAgICAgdGVtcCA9ICpoZWFkOwogICAgICAgICpoZWFkID0gKCpoZWFkKS0+bmV4dDsKICAgICAgICBmcmVlKHRlbXAtPmRhdGEpOwogICAgICAgIGZyZWUodGVtcCk7CiAgICB9Cn0KCmludCBtYWluKCkgewogICAgc3RydWN0IE5vZGUgKmhlYWQgPSBOVUxMOwoKICAgIHByaW50ZigiPT09PSBDUkVBVEUgTElTVCA9PT09XG4iKTsKICAgIGluc2VydEVuZCgmaGVhZCwgIkEiKTsKICAgIGluc2VydEVuZCgmaGVhZCwgIkIiKTsKICAgIGluc2VydEVuZCgmaGVhZCwgIkMiKTsKICAgIHByaW50TGlzdChoZWFkKTsKCiAgICBwcmludGYoIlxuPT09PSBJTlNFUlQgQUZURVIgQiA9PT09XG4iKTsKICAgIGluc2VydEFmdGVyKCZoZWFkLCAiQiIsICJYIik7CiAgICBwcmludExpc3QoaGVhZCk7CgogICAgcHJpbnRmKCJcbj09PT0gSU5TRVJUIEJFRk9SRSBCID09PT1cbiIpOwogICAgaW5zZXJ0QmVmb3JlKCZoZWFkLCAiQiIsICJZIik7CiAgICBwcmludExpc3QoaGVhZCk7CgogICAgcHJpbnRmKCJcbj09PT0gREVMRVRFIE5PREUgQiA9PT09XG4iKTsKICAgIGRlbGV0ZU5vZGUoJmhlYWQsICJCIik7CiAgICBwcmludExpc3QoaGVhZCk7CgogICAgcHJpbnRmKCJcbj09PT0gSU5TRVJUIEFUIEhFQUQgKGJlZm9yZSBBKSA9PT09XG4iKTsKICAgIGluc2VydEJlZm9yZSgmaGVhZCwgIkEiLCAiSEVBRCIpOwogICAgcHJpbnRMaXN0KGhlYWQpOwoKICAgIHByaW50ZigiXG49PT09IFJFVkVSU0UgTElTVCA9PT09XG4iKTsKICAgIHJldmVyc2UoJmhlYWQpOwogICAgcHJpbnRMaXN0KGhlYWQpOwoKICAgIHByaW50ZigiXG49PT09IENMRUFOVVAgPT09PVxuIik7CiAgICBmcmVlTGlzdCgmaGVhZCk7CgogICAgcmV0dXJuIDA7Cn0=