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);

 
실현
#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("\t q->base.start = %p
",q->base.start); while(q->base.end!=NULL) { printf("\t 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("\tpnode->data = %d
",*((char *)p->data)); break; case 'S': printf("\tpnode->data = %s
",(char *)p->data); break; case 'C': printf("\tpnode->data = %c
",*((char *)p->data)); break; default: break; } printf("\tpnode->size = %d
",p->size); printf("\tpnode->type = %c
",p->type); printf("\tpnode->down = %p
",p->down); // printf("\tque->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; }

좋은 웹페이지 즐겨찾기