zoukankan      html  css  js  c++  java
  • C实现队列

    今天又是在加班,无聊就写了一个队列的实现,具体代码如下:

    que.h

    #define ut_base(TYPE) 
        struct {          
            TYPE *start;  
            TYPE  *end;   
        }__attribute__((packed))
    #define mem_alloc(TYPE,SIZE) 
        (TYPE *)malloc(SIZE)
    #define msg_err(msg)
        fprintf(stderr,msg)
    typedef char byte;
    typedef unsigned int uint;
    typedef struct _pnode
    {
        void *data;
        uint size;
        char  type;
        struct _pnode *down;
    }__attribute__((packed)) pnode;
    typedef struct _que
    {
        uint len;
        ut_base(struct _pnode) base;
    }__attribute__((packed)) que;
    
    /* create new queque*/
    que *que_new();
    /*add one element to queue */
    int que_add(que *q,void *pdata,char type);
    /*remove one element from que */
    int que_pop(que *q);
    /* destroy a queue*/
    int que_destroy(que *q);

    que.c的实现

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "que.h"
    que *que_new()
    {
      que *q=mem_alloc(que,sizeof(que));
      if(!q){msg_err("malloc memory for que fali
    ");return NULL;}
      q->base.start=NULL;
      q->base.end=NULL;
      q->len=0;
      return q;
    }
    int que_add(que *q,void *pdata,char type)
    {
       if(!q){msg_err("queue header is null
    ");return 1;}
       pnode *elem=mem_alloc(pnode,sizeof(pnode));
       if(!elem){msg_err("malloc for pnode fali
    ");return 1;}
       char dtype=0;
       int size=0;
       if(q->base.start==NULL)
        {
          q->base.start=elem;
        }
       switch(type)
       {
           case 'I':
               size=sizeof(int);
               dtype='I';
               break;
           case 'S':
               size=strlen((char *)pdata)+1;
               dtype='S';
               break;
           case 'C':
               size=sizeof(char);
               dtype='C';
               break;
           default:
              dtype='X';
               break;
       }
       elem->data=mem_alloc(byte,size);
       if(!elem->data){msg_err(" malloc memory for elem->data fail
    ");return 1;}
       memcpy(elem->data,(byte *)pdata,size);
       elem->size=size;
       elem->type=dtype;
       elem->down=q->base.end;
       q->base.end=elem;
       q->len++;
       return 0;
    }
    int que_pop(que *q)
    {
        pnode *top=q->base.end->down;
        pnode *prt=q->base.end;
        q->base.end=top;
        q->len--;
        free(prt);
        prt=NULL;
        return 0;
    }
    int que_destroy(que *q)
    {
       printf("	 q->base.start = %p
    ",q->base.start); 
       while(q->base.end!=NULL)
        {
            printf("	 cur pnode = %p ,",q->base.end);
            pnode *down=q->base.end->down;
            free(q->base.end);
            printf("free
    ");
            q->base.end=down;
        }
        free(q);
        return 0;
    }
    void que_prt(que *q)
    {
        pnode *p=q->base.end;
        while(p!=NULL)
        {
            printf(" cur pnode = %p
    ",p);
            switch(p->type)
            {
                case 'I':
                    printf("	pnode->data = %d
    ",*((char *)p->data));
                    break;
                case 'S':
                    printf("	pnode->data = %s
    ",(char *)p->data);
                    break;
                case 'C':
                    printf("	pnode->data = %c
    ",*((char *)p->data));
                    break;
                default:
                    break;
            }
            printf("	pnode->size = %d
    ",p->size);
            printf("	pnode->type = %c
    ",p->type);
            printf("	pnode->down = %p
    ",p->down);
           // printf("	que->len = %d
    ",q->len);
            p=p->down;
        }
    }
    int main(void)
    {
      printf("sizeof que:%d
    ",sizeof(que)); 
      que *q=que_new();
      int x=100;
      char *s="133";
      char x1='P';
      printf("que_add(%p,%c,%c): %d
    ",q,x1,x1,que_add(q,&x1,'C'));
      printf("que_add(%p,%d,%c): %d
    ",q,x,'I',que_add(q,&x,'I'));
      printf("que_add(%p,%s,%c): %d
    ",q,s,'S',que_add(q,s,'S'));
      que_prt(q);
      printf("que_destroy(%p): %d
    ",q,que_destroy(q));
      q=que_new();
      printf("que_add(%p,%c,%c): %d
    ",q,x1,x1,que_add(q,&x1,'C'));                                  
      printf("que_add(%p,%d,%c): %d
    ",q,x,'I',que_add(q,&x,'I'));                                   
      printf("que_add(%p,%s,%c): %d
    ",q,s,'S',que_add(q,s,'S'));      
      printf("que_pop(%p) :%d
    ",q,que_pop(q));
      printf("que_pop(%p) :%d
    ",q,que_pop(q));
      que_prt(q);
      printf("que->len :%d
    ",q->len);
      printf("que_destroy(%p): %d
    ",q,que_destroy(q));
      //que_destroy(q);
      return 0;
    }
  • 相关阅读:
    团队第二阶段冲刺——第三天
    团队第二阶段冲刺——第二天
    团队第二阶段冲刺——第一天
    第一阶段意见汇总
    团队第一次绩效考核
    我们与同类产品的差距
    团队项目第一阶段成果评价
    第一阶段验收成果总结
    团队冲刺第十天
    团队冲刺第九天
  • 原文地址:https://www.cnblogs.com/innobase/p/4528889.html
Copyright © 2011-2022 走看看