- #include <stdio.h> 
- #include <stdlib.h> 
-   
- typedef struct snake snake; 
- struct snake { 
-     int x; /* x coordinate */ 
-     int y; /* y coordinate */ 
-     snake *previous; 
-     snake *next; 
- }; 
-   
- snake *initSnake(void) { 
-     snake *pointer, *tmp1, *tmp2 = NULL; 
-     /* three iterations, so the snake will have a length of three */ 
-     for( int i = 0; i<3; i++) { 
-         if(NULL == (tmp1 = (snake*)malloc(sizeof(snake)))) { 
-             return NULL; 
-         } 
-         /* coordinates */ 
-         tmp1->x = 20; 
-         tmp1->y = 10 + i; 
-         /* first previous points to NULL */ 
-         tmp1->previous = tmp2; 
-         if (tmp2) 
-            tmp2 -> next = tmp1;  
-         /* temporarily store last pointer to be used for next previous pointer */ 
-         tmp2 = tmp1; 
-         if(0 == i) { 
-             /* store first pointer so it can be returned */ 
-             pointer = tmp1; 
-         } 
-   
-     } 
-     /* the last next pointer has to point to NULL */ 
-     tmp1->next = NULL; 
-     /* now return the pointer to the first element in list */ 
-     return pointer; 
- } 
-   
-   
- int main() { 
-     /* pointer to first element in list */ 
-     snake *head = NULL; 
-   
-     if(NULL == (head = initSnake() ) ) { 
-         fprintf(stderr, "Not enough memory!\n"); 
-         return EXIT_FAILURE; 
-     } 
-     /* here everything works fine */ 
-     printf("%d\n", head->y); 
-     printf("%d\n", head->previous); 
-     /* when trying to acces the content of the next element, the program crashes... */ 
-     printf("%d\n", head->next->x); 
-     /* pause */ 
-     getchar(); 
- } 
-   
				I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCnR5cGVkZWYgc3RydWN0IHNuYWtlIHNuYWtlOwpzdHJ1Y3Qgc25ha2UgewogICAgaW50IHg7IC8qIHggY29vcmRpbmF0ZSAqLwogICAgaW50IHk7IC8qIHkgY29vcmRpbmF0ZSAqLwogICAgc25ha2UgKnByZXZpb3VzOwogICAgc25ha2UgKm5leHQ7Cn07CgpzbmFrZSAqaW5pdFNuYWtlKHZvaWQpIHsKICAgIHNuYWtlICpwb2ludGVyLCAqdG1wMSwgKnRtcDIgPSBOVUxMOwogICAgLyogdGhyZWUgaXRlcmF0aW9ucywgc28gdGhlIHNuYWtlIHdpbGwgaGF2ZSBhIGxlbmd0aCBvZiB0aHJlZSAqLwogICAgZm9yKCBpbnQgaSA9IDA7IGk8MzsgaSsrKSB7CiAgICAgICAgaWYoTlVMTCA9PSAodG1wMSA9IChzbmFrZSopbWFsbG9jKHNpemVvZihzbmFrZSkpKSkgewogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICB9CiAgICAgICAgLyogY29vcmRpbmF0ZXMgKi8KICAgICAgICB0bXAxLT54ID0gMjA7CiAgICAgICAgdG1wMS0+eSA9IDEwICsgaTsKICAgICAgICAvKiBmaXJzdCBwcmV2aW91cyBwb2ludHMgdG8gTlVMTCAqLwogICAgICAgIHRtcDEtPnByZXZpb3VzID0gdG1wMjsKICAgICAgICBpZiAodG1wMikKICAgICAgICAgICB0bXAyIC0+IG5leHQgPSB0bXAxOyAKICAgICAgICAvKiB0ZW1wb3JhcmlseSBzdG9yZSBsYXN0IHBvaW50ZXIgdG8gYmUgdXNlZCBmb3IgbmV4dCBwcmV2aW91cyBwb2ludGVyICovCiAgICAgICAgdG1wMiA9IHRtcDE7CiAgICAgICAgaWYoMCA9PSBpKSB7CiAgICAgICAgICAgIC8qIHN0b3JlIGZpcnN0IHBvaW50ZXIgc28gaXQgY2FuIGJlIHJldHVybmVkICovCiAgICAgICAgICAgIHBvaW50ZXIgPSB0bXAxOwogICAgICAgIH0KCiAgICB9CiAgICAvKiB0aGUgbGFzdCBuZXh0IHBvaW50ZXIgaGFzIHRvIHBvaW50IHRvIE5VTEwgKi8KICAgIHRtcDEtPm5leHQgPSBOVUxMOwogICAgLyogbm93IHJldHVybiB0aGUgcG9pbnRlciB0byB0aGUgZmlyc3QgZWxlbWVudCBpbiBsaXN0ICovCiAgICByZXR1cm4gcG9pbnRlcjsKfQoKCmludCBtYWluKCkgewogICAgLyogcG9pbnRlciB0byBmaXJzdCBlbGVtZW50IGluIGxpc3QgKi8KICAgIHNuYWtlICpoZWFkID0gTlVMTDsKCiAgICBpZihOVUxMID09IChoZWFkID0gaW5pdFNuYWtlKCkgKSApIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk5vdCBlbm91Z2ggbWVtb3J5IVxuIik7CiAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKICAgIH0KICAgIC8qIGhlcmUgZXZlcnl0aGluZyB3b3JrcyBmaW5lICovCiAgICBwcmludGYoIiVkXG4iLCBoZWFkLT55KTsKICAgIHByaW50ZigiJWRcbiIsIGhlYWQtPnByZXZpb3VzKTsKICAgIC8qIHdoZW4gdHJ5aW5nIHRvIGFjY2VzIHRoZSBjb250ZW50IG9mIHRoZSBuZXh0IGVsZW1lbnQsIHRoZSBwcm9ncmFtIGNyYXNoZXMuLi4gKi8KICAgIHByaW50ZigiJWRcbiIsIGhlYWQtPm5leHQtPngpOwogICAgLyogcGF1c2UgKi8KICAgIGdldGNoYXIoKTsKfQo=