宏实现链表


#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值