宏函数实现队列

队列demon——待完善

#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef void *QUEUE[2];

/* Private macros. */
#define QUEUE_NEXT(q)       (*(QUEUE **) &((*(q))[0]))
#define QUEUE_PREV(q)       (*(QUEUE **) &((*(q))[1]))
#define QUEUE_PREV_NEXT(q)  (QUEUE_NEXT(QUEUE_PREV(q)))
#define QUEUE_NEXT_PREV(q)  (QUEUE_PREV(QUEUE_NEXT(q)))

/*得到一个队列的首地址 */
#define QUEUE_DATA(ptr, type, field)                                          \
  ((type *) ((char *) (ptr) - offsetof(type, field)))

/* Important note: mutating the list while QUEUE_FOREACH is
 * iterating over its elements results in undefined behavior.
 *///遍历
#define QUEUE_FOREACH(q, h)                                                   \
  for ((q) = QUEUE_NEXT(h); (q) != (h); (q) = QUEUE_NEXT(q))

//判断是否为空 1-空 0-非空
#define QUEUE_EMPTY(q)                                                        \
  ((const QUEUE *) (q) == (const QUEUE *) QUEUE_NEXT(q))

#define QUEUE_HEAD(q)                                                         \
  (QUEUE_NEXT(q))

//初始化一个队列
#define QUEUE_INIT(q)                                                         \
  do {                                                                        \
    QUEUE_NEXT(q) = (q);                                                      \
    QUEUE_PREV(q) = (q);                                                      \
  }                                                                           \
  while (0)

//添加一个节点
#define QUEUE_ADD(h, n)                                                       \
  do {                                                                        \
    QUEUE_PREV_NEXT(h) = QUEUE_NEXT(n);                                       \
    QUEUE_NEXT_PREV(n) = QUEUE_PREV(h);                                       \
    QUEUE_PREV(h) = QUEUE_PREV(n);                                            \
    QUEUE_PREV_NEXT(h) = (h);                                                 \
  }                                                                           \
  while (0)

#define QUEUE_SPLIT(h, q, n)                                                  \
  do {                                                                        \
    QUEUE_PREV(n) = QUEUE_PREV(h);                                            \
    QUEUE_PREV_NEXT(n) = (n);                                                 \
    QUEUE_NEXT(n) = (q);                                                      \
    QUEUE_PREV(h) = QUEUE_PREV(q);                                            \
    QUEUE_PREV_NEXT(h) = (h);                                                 \
    QUEUE_PREV(q) = (n);                                                      \
  }                                                                           \
  while (0)

#define QUEUE_MOVE(h, n)                                                      \
  do {                                                                        \
    if (QUEUE_EMPTY(h))                                                       \
      QUEUE_INIT(n);                                                          \
    else {                                                                    \
      QUEUE* q = QUEUE_HEAD(h);                                               \
      QUEUE_SPLIT(h, q, n);                                                   \
    }                                                                         \
  }                                                                           \
  while (0)

//头部插入
#define QUEUE_INSERT_HEAD(h, q)                                               \
  do {                                                                        \
    QUEUE_NEXT(q) = QUEUE_NEXT(h);                                            \
    QUEUE_PREV(q) = (h);                                                      \
    QUEUE_NEXT_PREV(q) = (q);                                                 \
    QUEUE_NEXT(h) = (q);                                                      \
  }                                                                           \
  while (0)

//插入头
#define QUEUE_INSERT_TAIL(h, q)                                               \
  do {                                                                        \
    QUEUE_NEXT(q) = (h);                                                      \
    QUEUE_PREV(q) = QUEUE_PREV(h);                                            \
    QUEUE_PREV_NEXT(q) = (q);                                                 \
    QUEUE_PREV(h) = (q);                                                      \
  }                                                                           \
  while (0)

//
#define QUEUE_REMOVE(q)                                                       \
  do {                                                                        \
    QUEUE_PREV_NEXT(q) = QUEUE_NEXT(q);                                       \
    QUEUE_NEXT_PREV(q) = QUEUE_PREV(q);                                       \
  }                                                                           \
  while (0)

#define SIZE 20

#define STU_MALLOC(name,TYPEDEF)                     \
	do{                                              \
		name=(TYPEDEF *)malloc(sizeof(TYPEDEF));     \
		if(NULL==name)                               \
		{                                            \
			perror("malloc \n");                     \
			exit(EXIT_FAILURE);                      \
		}                                            \
		memset(name,'0',sizeof(TYPEDEF));            \
	}while(0);                                       
	
typedef struct student
{
	int age;
	int score;
	char name[SIZE];
	void *node[2];
}Student;

Student *init_stu(int a,int s,char *n)
{
    Student *stu;
   	STU_MALLOC(stu,Student);
	stu->age=a;
	stu->score=s;
	strcpy(stu->name,n);
	return stu;
}


int main()
{
/*****************
**初始化消息队列
*****************/	
	QUEUE msg;
	QUEUE_INIT(&msg);

//插入
	Student *stu=init_stu(18,85,"甲");
	QUEUE_INIT(&stu->node);//初始化结构体的指向

	QUEUE_INSERT_TAIL(&msg,&stu->node);//将stu加入到msg队列

	Student *stu1=init_stu(18,85,"乙");
	QUEUE_INIT(&stu1->node);//初始化结构体的指向
	
	QUEUE_INSERT_TAIL(&msg,&stu1->node);//将stu加入到msg队列

	Student *stu2=init_stu(18,85,"丙");
	QUEUE_INIT(&stu2->node);//初始化结构体的指向
	QUEUE_INSERT_TAIL(&msg,&stu2->node);//将stu加入到msg队列

	Student *stu3=init_stu(18,85,"丁");
	QUEUE_INIT(&stu3->node);//初始化结构体的指向
	
	QUEUE_INSERT_TAIL(&msg,&stu3->node);//将stu加入到msg队列

//	QUEUE_REMOVE(&msg);

//遍历
	QUEUE *q;
	QUEUE_FOREACH(q,&msg)
	{
		Student *stu3 = QUEUE_DATA(q, Student, node);
		printf("name is %s \n",stu3->name);
		if(0==strcmp(stu3->name,"甲"))
		{
			QUEUE_REMOVE(q);//出队操作
		}
	}

	QUEUE_FOREACH(q,&msg)
	{
		Student *stu3 = QUEUE_DATA(q, Student, node);
		printf("name is %s \n",stu3->name);
	}

//清空队列
	QUEUE n;
	QUEUE_MOVE(&msg,&n);

	if(1==QUEUE_EMPTY(&msg))
	{
		printf("队列为空\n");
	}

//遍历
	QUEUE_FOREACH(q,&msg)
	{
		Student *stu3 = QUEUE_DATA(q, Student, node);
		printf("name is %s \n",stu3->name);
	}
	return 0;
}

运行结果:
在这里插入图片描述

©️2020 CSDN 皮肤主题: 黑客帝国 设计师:上身试试 返回首页