单链表的最装逼写法

include <stdio.h>
#include <stdint.h>
#include <stdlib.h>

#define STAILQ_ENTRY(type)   \
struct {                     \
  struct type *stqe_next;    \
}

struct mbuf {
  uint32_t           magic;   /* mbuf magic (const) */
  STAILQ_ENTRY(mbuf) next;    /* next mbuf */
  uint8_t            *pos;    /* read marker */
  uint8_t            *last;   /* write marker */
  uint8_t            *start;  /* start of buffer (const) */
  uint8_t            *end;    /* end of buffer (const) */
};

#define STAILQ_HEAD(name, type)       \
struct name {                         \
  struct type *stqh_first;            \
  struct type **stqh_last;            \
}

STAILQ_HEAD(mhdr, mbuf);

#define STAILQ_NEXT(elm, field)    ((elm)->field.stqe_next)

#define STAILQ_INSERT_TAIL(head, elm, field) do {  \
  STAILQ_NEXT((elm), field) = NULL;                \
  *(head)->stqh_last = (elm);                      \
  (head)->stqh_last = &STAILQ_NEXT((elm), field);  \
} while (0)

int main(void)
{
  struct mhdr *mhdr = malloc(sizeof(struct mhdr));
  mhdr->stqh_first = NULL;
  mhdr->stqh_last  = &mhdr->stqh_first;

  int i;
  for (i = 0; i < 16; i++) {
    struct mbuf *mbuf = malloc(sizeof(struct mbuf));
    STAILQ_INSERT_TAIL(mhdr, mbuf, next);
    printf("%p ", mbuf);
  }
  printf("\n");

  for (i = 0; i < 16; i++) {
    struct mbuf *mbuf = mhdr->stqh_first;
    printf("%p ", mbuf);
    mhdr->stqh_first = mhdr->stqh_first->next.stqe_next;
  }
  printf("\n");

  return 0;
}

输出结果:

[jabari@hbase-rs2-test ~]$ gcc a.c 
[jabari@hbase-rs2-test ~]$ ./a.out 
0x1804030 0x1804070 0x18040b0 0x18040f0 0x1804130 0x1804170 0x18041b0 0x18041f0 0x1804230 0x1804270 0x18042b0 0x18042f0 0x1804330 0x1804370 0x18043b0 0x18043f0 
0x1804030 0x1804070 0x18040b0 0x18040f0 0x1804130 0x1804170 0x18041b0 0x18041f0 0x1804230 0x1804270 0x18042b0 0x18042f0 0x1804330 0x1804370 0x18043b0 0x18043f0

 

转载于:https://www.cnblogs.com/superise/p/4185363.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值