Code:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

struct stNode {
 int data;
 unsigned long Way;
};

struct stNode *AppendData(int data, struct stNode* list);
void GoList(struct stNode *list);

int main(void) {

 struct stNode *l2 = AppendData(2, NULL);
 struct stNode *l1 = AppendData(1, l2);
 struct stNode *l3 = AppendData(3, l2);
 struct stNode *l4 = AppendData(4, l3);
 
 printf("front -> back....\n");
 GoList(l1);
 printf("back -> front....\n");
 GoList(l4);

 return 0;
}

struct stNode *AppendData(int data, struct stNode *list) {
 struct stNode *GetNew = malloc(sizeof(struct stNode));

 assert(GetNew);
 GetNew->Way = (unsigned long)list;
 GetNew->data = data;

 if(list != NULL)
  list->Way ^= (unsigned long)GetNew;

 return GetNew;
}

void GoList(struct stNode *list) {
 unsigned long prev = 0;

 while(list != NULL) {
  unsigned long next = prev ^ list->Way;
  printf("%d ", list->data);
  prev = (unsigned long)list;
  list = (struct stNode *)next;
 }

 printf("\n");
}