sys-queue.h源码——参考实现stack

原文链接http://blog.csdn.net/immcss/article/details/6408848

  "stack.h" 

  #ifndef MICRO_STACK_H 

  #define MICRO_STACK_H 

  #include <string.h> 

  #include <stdlib.h> 

  #define STACK_NODE(name) name##__node 

  #define STACK_TEMPLATE(name,type) / 

  struct STACK_NODE(name) / 

  { / 

  type data; / 

  STACK_NODE(name) *next; / 

  }; / 

  typedef struct / 

  { / 

  STACK_NODE(name) *top; / 

  }name 

  #define STACK_INIT(stack) / 

  do{(stack)->top=NULL;}while(0) 

  #define STACK_IS_EMPTY(stack) / 

  ((stack)->top==NULL) 

  #define STACK_GET_TOP(stack) / 

  ((stack)->top->data) 

  #define STACK_POP(stack,node) / 

  do{ / 

  if((stack)->top==NULL) break; / 

  (node)=(stack)->top; / 

  (stack)->top=(stack)->top->next; / 

  }while(0) 

  #define STACK_PUSH(stack,node) / 

  do{ / 

  if((node)==NULL) break; / 

  (node)->next=(stack)->top; / 

  (stack)->top=(node); / 

  }while(0) 

  #define STACK_NEW_NODE(name,node,value) / 

  do{ / 

  (node) = (struct STACK_NODE(name)*) / 

  malloc(sizeof(struct STACK_NODE(name))); / 

  if((node)) (node)->data = http://blog.soso.com/qz.q/value; / 

  }while(0) 

  #define STACK_DEL_NODE(node) / 

  do{ / 

  free((node)); / 

  (node) = NULL; / 

  }while(0) 

  #endif 

  用法示例: 

  #include <stdio.h> 

  #include "stack.h" 

  int main() 

  { 

  STACK_TEMPLATE(istack,int);/* typedef stack<int> istack; */ 

  istack stack1; 

  struct STACK_NODE(istack) *p=NULL; 

  STACK_INIT(&stack1); 

  STACK_NEW_NODE(istack,p,10); 

  STACK_PUSH(&stack1,p); 

  printf("%d/n",STACK_GET_TOP(&stack1)); 

  STACK_NEW_NODE(istack,p,20); 

  STACK_PUSH(&stack1,p); 

  printf("%d/n",STACK_GET_TOP(&stack1)); 

  STACK_NEW_NODE(istack,p,30); 

  STACK_PUSH(&stack1,p); 

  printf("%d/n",STACK_GET_TOP(&stack1)); 

  while(!STACK_IS_EMPTY(&stack1)) 

  { 

  STACK_POP(&stack1,p); 

  printf("%d/n",p->data); 

  STACK_DEL_NODE(p); 

  }; 

  return 0; 

  } 


sys/queue.h的代码

/**      $NetBSD: queue.h,v 1.45.14.1 2007/07/18 20:13:24 liamjfoy Exp $ */
002	 
003	/**
004	 * Qemu version: Copy from netbsd, removed debug code, removed some of
005	 * the implementations.  Left in lists, tail queues and circular queues.
006	 */
007	 
008	/**
009	 * Copyright (c) 1991, 1993
010	 *      The Regents of the University of California.  All rights reserved.
011	 *
012	 * Redistribution and use in source and binary forms, with or without
013	 * modification, are permitted provided that the following conditions
014	 * are met:
015	 * 1. Redistributions of source code must retain the above copyright
016	 *    notice, this list of conditions and the following disclaimer.
017	 * 2. Redistributions in binary form must reproduce the above copyright
018	 *    notice, this list of conditions and the following disclaimer in the
019	 *    documentation and/or other materials provided with the distribution.
020	 * 3. Neither the name of the University nor the names of its contributors
021	 *    may be used to endorse or promote products derived from this software
022	 *    without specific prior written permission.
023	 *
024	 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
025	 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
026	 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
027	 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
028	 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
029	 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
030	 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
031	 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
032	 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
033	 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
034	 * SUCH DAMAGE.
035	 *
036	 *      @(#)queue.h     8.5 (Berkeley) 8/20/94
037	 */
038	 
039	#ifndef _SYS_QUEUE_H_
040	#define _SYS_QUEUE_H_
041	 
042	/**
043	 * This file defines three types of data structures:
044	 * lists, tail queues, and circular queues.
045	 *
046	 * A list is headed by a single forward pointer (or an array of forward
047	 * pointers for a hash table header). The elements are doubly linked
048	 * so that an arbitrary element can be removed without a need to
049	 * traverse the list. New elements can be added to the list before
050	 * or after an existing element or at the head of the list. A list
051	 * may only be traversed in the forward direction.
052	 *
053	 * A tail queue is headed by a pair of pointers, one to the head of the
054	 * list and the other to the tail of the list. The elements are doubly
055	 * linked so that an arbitrary element can be removed without a need to
056	 * traverse the list. New elements can be added to the list before or
057	 * after an existing element, at the head of the list, or at the end of
058	 * the list. A tail queue may be traversed in either direction.
059	 *
060	 * A circle queue is headed by a pair of pointers, one to the head of the
061	 * list and the other to the tail of the list. The elements are doubly
062	 * linked so that an arbitrary element can be removed without a need to
063	 * traverse the list. New elements can be added to the list before or after
064	 * an existing element, at the head of the list, or at the end of the list.
065	 * A circle queue may be traversed in either direction, but has a more
066	 * complex end of list detection.
067	 *
068	 * For details on the use of these macros, see the queue(3) manual page.
069	 */
070	 
071	/**
072	 * List definitions.
073	 */
074	#define LIST_HEAD(name, type)                                           \
075	struct name {                                                           \
076	        struct type *lh_first;  /** first element */                     \
077	}
078	 
079	#define LIST_HEAD_INITIALIZER(head)                                     \
080	        { NULL }
081	 
082	#define LIST_ENTRY(type)                                                \
083	struct {                                                                \
084	        struct type *le_next;   /** next element */                      \
085	        struct type **le_prev;  /** address of previous next element */  \
086	}
087	 
088	/**
089	 * List functions.
090	 */
091	#define LIST_INIT(head) do {                                            \
092	        (head)->lh_first = NULL;                                        \
093	} while (/**CONSTCOND*/0)
094	 
095	#define LIST_INSERT_AFTER(listelm, elm, field) do {                     \
096	        if (((elm)->field.le_next = (listelm)->field.le_next) != NULL)  \
097	                (listelm)->field.le_next->field.le_prev =               \
098	                    &(elm)->field.le_next;                              \
099	        (listelm)->field.le_next = (elm);                               \
100	        (elm)->field.le_prev = &(listelm)->field.le_next;               \
101	} while (/**CONSTCOND*/0)
102	 
103	#define LIST_INSERT_BEFORE(listelm, elm, field) do {                    \
104	        (elm)->field.le_prev = (listelm)->field.le_prev;                \
105	        (elm)->field.le_next = (listelm);                               \
106	        *(listelm)->field.le_prev = (elm);                              \
107	        (listelm)->field.le_prev = &(elm)->field.le_next;               \
108	} while (/**CONSTCOND*/0)
109	 
110	#define LIST_INSERT_HEAD(head, elm, field) do {                         \
111	        if (((elm)->field.le_next = (head)->lh_first) != NULL)          \
112	                (head)->lh_first->field.le_prev = &(elm)->field.le_next;\
113	        (head)->lh_first = (elm);                                       \
114	        (elm)->field.le_prev = &(head)->lh_first;                       \
115	} while (/**CONSTCOND*/0)
116	 
117	#define LIST_REMOVE(elm, field) do {                                    \
118	        if ((elm)->field.le_next != NULL)                               \
119	                (elm)->field.le_next->field.le_prev =                   \
120	                    (elm)->field.le_prev;                               \
121	        *(elm)->field.le_prev = (elm)->field.le_next;                   \
122	} while (/**CONSTCOND*/0)
123	 
124	#define LIST_FOREACH(var, head, field)                                  \
125	        for ((var) = ((head)->lh_first);                                \
126	                (var);                                                  \
127	                (var) = ((var)->field.le_next))
128	 
129	/**
130	 * List access methods.
131	 */
132	#define LIST_EMPTY(head)                ((head)->lh_first == NULL)
133	#define LIST_FIRST(head)                ((head)->lh_first)
134	#define LIST_NEXT(elm, field)           ((elm)->field.le_next)
135	 
136	 
137	/**
138	 * Tail queue definitions.
139	 */
140	#define _TAILQ_HEAD(name, type, qual)                                   \
141	struct name {                                                           \
142	        qual type *tqh_first;           /** first element */             \
143	        qual type *qual *tqh_last;      /** addr of last next element */ \
144	}
145	#define TAILQ_HEAD(name, type)  _TAILQ_HEAD(name, struct type,)
146	 
147	#define TAILQ_HEAD_INITIALIZER(head)                                    \
148	        { NULL, &(head).tqh_first }
149	 
150	#define _TAILQ_ENTRY(type, qual)                                        \
151	struct {                                                                \
152	        qual type *tqe_next;            /** next element */              \
153	        qual type *qual *tqe_prev;      /** address of previous next element */\
154	}
155	#define TAILQ_ENTRY(type)       _TAILQ_ENTRY(struct type,)
156	 
157	/**
158	 * Tail queue functions.
159	 */
160	#define TAILQ_INIT(head) do {                                           \
161	        (head)->tqh_first = NULL;                                       \
162	        (head)->tqh_last = &(head)->tqh_first;                          \
163	} while (/**CONSTCOND*/0)
164	 
165	#define TAILQ_INSERT_HEAD(head, elm, field) do {                        \
166	        if (((elm)->field.tqe_next = (head)->tqh_first) != NULL)        \
167	                (head)->tqh_first->field.tqe_prev =                     \
168	                    &(elm)->field.tqe_next;                             \
169	        else                                                            \
170	                (head)->tqh_last = &(elm)->field.tqe_next;              \
171	        (head)->tqh_first = (elm);                                      \
172	        (elm)->field.tqe_prev = &(head)->tqh_first;                     \
173	} while (/**CONSTCOND*/0)
174	 
175	#define TAILQ_INSERT_TAIL(head, elm, field) do {                        \
176	        (elm)->field.tqe_next = NULL;                                   \
177	        (elm)->field.tqe_prev = (head)->tqh_last;                       \
178	        *(head)->tqh_last = (elm);                                      \
179	        (head)->tqh_last = &(elm)->field.tqe_next;                      \
180	} while (/**CONSTCOND*/0)
181	 
182	#define TAILQ_INSERT_AFTER(head, listelm, elm, field) do {              \
183	        if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\
184	                (elm)->field.tqe_next->field.tqe_prev =                 \
185	                    &(elm)->field.tqe_next;                             \
186	        else                                                            \
187	                (head)->tqh_last = &(elm)->field.tqe_next;              \
188	        (listelm)->field.tqe_next = (elm);                              \
189	        (elm)->field.tqe_prev = &(listelm)->field.tqe_next;             \
190	} while (/**CONSTCOND*/0)
191	 
192	#define TAILQ_INSERT_BEFORE(listelm, elm, field) do {                   \
193	        (elm)->field.tqe_prev = (listelm)->field.tqe_prev;              \
194	        (elm)->field.tqe_next = (listelm);                              \
195	        *(listelm)->field.tqe_prev = (elm);                             \
196	        (listelm)->field.tqe_prev = &(elm)->field.tqe_next;             \
197	} while (/**CONSTCOND*/0)
198	 
199	#define TAILQ_REMOVE(head, elm, field) do {                             \
200	        if (((elm)->field.tqe_next) != NULL)                            \
201	                (elm)->field.tqe_next->field.tqe_prev =                 \
202	                    (elm)->field.tqe_prev;                              \
203	        else                                                            \
204	                (head)->tqh_last = (elm)->field.tqe_prev;               \
205	        *(elm)->field.tqe_prev = (elm)->field.tqe_next;                 \
206	} while (/**CONSTCOND*/0)
207	 
208	#define TAILQ_FOREACH(var, head, field)                                 \
209	        for ((var) = ((head)->tqh_first);                               \
210	                (var);                                                  \
211	                (var) = ((var)->field.tqe_next))
212	 
213	#define TAILQ_FOREACH_REVERSE(var, head, headname, field)               \
214	        for ((var) = (*(((struct headname *)((head)->tqh_last))->tqh_last));    \
215	                (var);                                                  \
216	                (var) = (*(((struct headname *)((var)->field.tqe_prev))->tqh_last)))
217	 
218	/**
219	 * Tail queue access methods.
220	 */
221	#define TAILQ_EMPTY(head)               ((head)->tqh_first == NULL)
222	#define TAILQ_FIRST(head)               ((head)->tqh_first)
223	#define TAILQ_NEXT(elm, field)          ((elm)->field.tqe_next)
224	 
225	#define TAILQ_LAST(head, headname) \
226	        (*(((struct headname *)((head)->tqh_last))->tqh_last))
227	#define TAILQ_PREV(elm, headname, field) \
228	        (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))
229	 
230	 
231	/**
232	 * Circular queue definitions.
233	 */
234	#define CIRCLEQ_HEAD(name, type)                                        \
235	struct name {                                                           \
236	        struct type *cqh_first;         /** first element */             \
237	        struct type *cqh_last;          /** last element */              \
238	}
239	 
240	#define CIRCLEQ_HEAD_INITIALIZER(head)                                  \
241	        { (void *)&head, (void *)&head }
242	 
243	#define CIRCLEQ_ENTRY(type)                                             \
244	struct {                                                                \
245	        struct type *cqe_next;          /** next element */              \
246	        struct type *cqe_prev;          /** previous element */          \
247	}
248	 
249	/**
250	 * Circular queue functions.
251	 */
252	#define CIRCLEQ_INIT(head) do {                                         \
253	        (head)->cqh_first = (void *)(head);                             \
254	        (head)->cqh_last = (void *)(head);                              \
255	} while (/**CONSTCOND*/0)
256	 
257	#define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do {            \
258	        (elm)->field.cqe_next = (listelm)->field.cqe_next;              \
259	        (elm)->field.cqe_prev = (listelm);                              \
260	        if ((listelm)->field.cqe_next == (void *)(head))                \
261	                (head)->cqh_last = (elm);                               \
262	        else                                                            \
263	                (listelm)->field.cqe_next->field.cqe_prev = (elm);      \
264	        (listelm)->field.cqe_next = (elm);                              \
265	} while (/**CONSTCOND*/0)
266	 
267	#define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do {           \
268	        (elm)->field.cqe_next = (listelm);                              \
269	        (elm)->field.cqe_prev = (listelm)->field.cqe_prev;              \
270	        if ((listelm)->field.cqe_prev == (void *)(head))                \
271	                (head)->cqh_first = (elm);                              \
272	        else                                                            \
273	                (listelm)->field.cqe_prev->field.cqe_next = (elm);      \
274	        (listelm)->field.cqe_prev = (elm);                              \
275	} while (/**CONSTCOND*/0)
276	 
277	#define CIRCLEQ_INSERT_HEAD(head, elm, field) do {                      \
278	        (elm)->field.cqe_next = (head)->cqh_first;                      \
279	        (elm)->field.cqe_prev = (void *)(head);                         \
280	        if ((head)->cqh_last == (void *)(head))                         \
281	                (head)->cqh_last = (elm);                               \
282	        else                                                            \
283	                (head)->cqh_first->field.cqe_prev = (elm);              \
284	        (head)->cqh_first = (elm);                                      \
285	} while (/**CONSTCOND*/0)
286	 
287	#define CIRCLEQ_INSERT_TAIL(head, elm, field) do {                      \
288	        (elm)->field.cqe_next = (void *)(head);                         \
289	        (elm)->field.cqe_prev = (head)->cqh_last;                       \
290	        if ((head)->cqh_first == (void *)(head))                        \
291	                (head)->cqh_first = (elm);                              \
292	        else                                                            \
293	                (head)->cqh_last->field.cqe_next = (elm);               \
294	        (head)->cqh_last = (elm);                                       \
295	} while (/**CONSTCOND*/0)
296	 
297	#define CIRCLEQ_REMOVE(head, elm, field) do {                           \
298	        if ((elm)->field.cqe_next == (void *)(head))                    \
299	                (head)->cqh_last = (elm)->field.cqe_prev;               \
300	        else                                                            \
301	                (elm)->field.cqe_next->field.cqe_prev =                 \
302	                    (elm)->field.cqe_prev;                              \
303	        if ((elm)->field.cqe_prev == (void *)(head))                    \
304	                (head)->cqh_first = (elm)->field.cqe_next;              \
305	        else                                                            \
306	                (elm)->field.cqe_prev->field.cqe_next =                 \
307	                    (elm)->field.cqe_next;                              \
308	} while (/**CONSTCOND*/0)
309	 
310	#define CIRCLEQ_FOREACH(var, head, field)                               \
311	        for ((var) = ((head)->cqh_first);                               \
312	                (var) != (const void *)(head);                          \
313	                (var) = ((var)->field.cqe_next))
314	 
315	#define CIRCLEQ_FOREACH_REVERSE(var, head, field)                       \
316	        for ((var) = ((head)->cqh_last);                                \
317	                (var) != (const void *)(head);                          \
318	                (var) = ((var)->field.cqe_prev))
319	 
320	/**
321	 * Circular queue access methods.
322	 */
323	#define CIRCLEQ_EMPTY(head)             ((head)->cqh_first == (void *)(head))
324	#define CIRCLEQ_FIRST(head)             ((head)->cqh_first)
325	#define CIRCLEQ_LAST(head)              ((head)->cqh_last)
326	#define CIRCLEQ_NEXT(elm, field)        ((elm)->field.cqe_next)
327	#define CIRCLEQ_PREV(elm, field)        ((elm)->field.cqe_prev)
328	 
329	#define CIRCLEQ_LOOP_NEXT(head, elm, field)                             \
330	        (((elm)->field.cqe_next == (void *)(head))                      \
331	            ? ((head)->cqh_first)                                       \
332	            : (elm->field.cqe_next))
333	#define CIRCLEQ_LOOP_PREV(head, elm, field)                             \
334	        (((elm)->field.cqe_prev == (void *)(head))                      \
335	            ? ((head)->cqh_last)                                        \
336	            : (elm->field.cqe_prev))
337	 
338	#endif  /** !_SYS_QUEUE_H_ */

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值