#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=