Chinaunix首页 | 论坛 | 博客
  • 博客访问: 945665
  • 博文数量: 116
  • 博客积分: 3923
  • 博客等级: 中校
  • 技术积分: 1337
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-23 01:22
文章分类

全部博文(116)

文章存档

2013年(1)

2012年(17)

2011年(69)

2009年(29)

分类: LINUX

2012-02-05 18:04:53

今后实现了一个栈的操作,本来打算用kernel的list,后来发现双指针有点奢侈,所以就自己单链表来实现,代码如下:

----------------------------------------------------------------------------------------
  1. /*
  2.  * file: main.c
  3.  * author: vincent.cws2008@gmail.com
  4.  * history:
  5.  * initial @ 2012-02-05
  6.  */

  7. #include <stdio.h>
  8. #include "stack.h"

  9. #define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0]))

  10. void main()
  11. {
  12.     int i;
  13.     stack_t sk;
  14.     int array[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

  15.     stack_init(&sk);
  16.     for (i=0; i < ARRAY_SIZE(array); i++)
  17.         stack_push(&sk, &(array[i]), sizeof(array[i]));

  18.     for (i=0; i < ARRAY_SIZE(array); i++)
  19.         printf("%d ", *(int*)stack_pop(&sk));
  20.         
  21.     printf("\n");

  22.     stack_exit(&sk);
  23. }
----------------------------------------------------------------------------------------

  1. /*
  2.  * file: stack.h
  3.  * author: vincent.cws2008@gmail.com
  4.  * history:
  5.  * initial @ 2012-02-05
  6.  */


  7. #ifndef __STACK_H__
  8. #define __STACK_H__

  9. #include <stdlib.h>

  10. #ifndef __assert
  11. #define __assert(x)
  12. #endif

  13. #ifndef NULL
  14. #define NULL 0
  15. #endif

  16. extern struct node;
  17. extern struct stack;

  18. typedef struct stack{
  19.     struct node *head;
  20. }stack_t;

  21. int stack_init(struct stack *sk);
  22. int stack_exit(struct stack *sk);

  23. void *stack_pop(struct stack *sk);
  24. void stack_push(struct stack *sk, void *data, size_t size);

  25. #endif
----------------------------------------------------------------------------------------
  1. /*
  2.  * file: stack.c
  3.  * author: vincent.cws2008@gmail.com
  4.  * history:
  5.  * initial @ 2012-02-05
  6.  */

  7. #define DEBUG

  8. #include "stack.h"
  9. #include "stdlib.h"

  10. #define __malloc(sz) malloc(sz)
  11. #define __free(p) free(p)


  12. #define __node_init(pn,pd,sz) {\
  13.     (pn)->data=(pd); \
  14.     (pn)->size=(sz); \
  15.     (pn)->next=NULL; \
  16. }

  17. typedef struct node {
  18.     void *data;
  19.     size_t size;
  20.     struct node *next;
  21. } node_t;


  22. void *stack_pop(struct stack *sk)
  23. {
  24.     void *ret=NULL;
  25.     struct node *mark=NULL;
  26.     __assert(sk);
  27.     if (sk->head) {
  28.         mark = sk->head;
  29.         ret = mark->data;
  30.         sk->head = sk->head->next;
  31.         __free(mark);
  32.     }
  33.     return ret;
  34. }

  35. void stack_push(struct stack *sk, void *data, size_t size)
  36. {
  37.     struct node *pnew;
  38.     __assert(sk && data);
  39.     pnew = __malloc(sizeof(struct node));
  40.     __assert(pnew);
  41.     __node_init(pnew, data, size);
  42.     /* insert the node to the head of the list */
  43.     if (sk->head){
  44.         pnew->next = sk->head;
  45.         sk->head = pnew;
  46.     }
  47.     else {
  48.         sk->head = pnew;
  49.     }
  50. }

  51. int stack_init(struct stack *sk)
  52. {
  53.     __assert(sk);
  54.     sk->head = NULL;
  55.     return 0;
  56. }

  57. int stack_exit(struct stack *sk)
  58. {
  59.     __assert(sk);
  60.     while(stack_pop(sk));
  61.     return 0;
  62. }

----------------------------------------------------------------------------------------

代码附件:

 stack.rar  



阅读(2103) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~