#include<stdio.h>
#include<stdlib.h>
#define QNODE(type) \
struct { \
struct type *next; \
struct type **prev; \
}
#define QNODE_INIT(node, field) \
do { \
(node)->field.next = (node); \
(node)->field.prev = \
&(node)->field.next; \
} while ( /* */ 0 );
#define QFIRST(head, field) \
((head)->field.next)
#define QNEXT(node, field) \
((node)->field.next)
#define QEMPTY(head, field) \
((head)->field.next == (head))
#define QFOREACH(head, var, field) \
for ((var) = (head)->field.next; \
(var) != (head); \
(var) = (var)->field.next)
#define QINSERT_BEFORE(loc, node, field) \
do { \
*(loc)->field.prev = (node); \
(node)->field.prev = \
(loc)->field.prev; \
(loc)->field.prev = \
&((node)->field.next); \
(node)->field.next = (loc); \
} while (/* */0)
#define QINSERT_AFTER(loc, node, field) \
do { \
((loc)->field.next)->field.prev = \
&(node)->field.next; \
(node)->field.next = (loc)->field.next; \
(loc)->field.next = (node); \
(node)->field.prev = &(loc)->field.next; \
} while ( /* */ 0)
#define QREMOVE(node, field) \
do { \
*((node)->field.prev) = (node)->field.next; \
((node)->field.next)->field.prev = \
(node)->field.prev; \
(node)->field.next = (node); \
(node)->field.prev = &((node)->field.next); \
} while ( /* */ 0)
typedef struct wth
{
int state;
QNODE(wth) alist;
} wth;
int main()
{
wth* node;
wth* head;
wth* loc;
wth* var;
int x;
head=(wth*)malloc(sizeof(wth));
node=head;
loc=head;
QNODE_INIT(loc, alist);
int i;
for(i=0;i<5;i++)
{
scanf("%d",&x);
loc=(wth*)malloc(sizeof(wth));
QNODE_INIT(loc, alist);
loc->state=x;
//QINSERT_AFTER(node, loc, alist);//头插
QINSERT_BEFORE(node, loc, alist);//尾插
}
QFOREACH(head, var, alist)
printf("%d\n",var->state);
return 0;
}