C实现队列
来源:互联网 发布:淘宝描述不符赔偿 编辑:程序博客网 时间:2024/06/05 00:58
今天又是在加班,无聊就写了一个队列的实现,具体代码如下:
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\n");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\n");return 1;} pnode *elem=mem_alloc(pnode,sizeof(pnode)); if(!elem){msg_err("malloc for pnode fali\n");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\n");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\n",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\n"); 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\n",p); switch(p->type) { case 'I': printf("\tpnode->data = %d\n",*((char *)p->data)); break; case 'S': printf("\tpnode->data = %s\n",(char *)p->data); break; case 'C': printf("\tpnode->data = %c\n",*((char *)p->data)); break; default: break; } printf("\tpnode->size = %d\n",p->size); printf("\tpnode->type = %c\n",p->type); printf("\tpnode->down = %p\n",p->down); // printf("\tque->len = %d\n",q->len); p=p->down; }}int main(void){ printf("sizeof que:%d\n",sizeof(que)); que *q=que_new(); int x=100; char *s="133"; char x1='P'; printf("que_add(%p,%c,%c): %d\n",q,x1,x1,que_add(q,&x1,'C')); printf("que_add(%p,%d,%c): %d\n",q,x,'I',que_add(q,&x,'I')); printf("que_add(%p,%s,%c): %d\n",q,s,'S',que_add(q,s,'S')); que_prt(q); printf("que_destroy(%p): %d\n",q,que_destroy(q)); q=que_new(); printf("que_add(%p,%c,%c): %d\n",q,x1,x1,que_add(q,&x1,'C')); printf("que_add(%p,%d,%c): %d\n",q,x,'I',que_add(q,&x,'I')); printf("que_add(%p,%s,%c): %d\n",q,s,'S',que_add(q,s,'S')); printf("que_pop(%p) :%d\n",q,que_pop(q)); printf("que_pop(%p) :%d\n",q,que_pop(q)); que_prt(q); printf("que->len :%d\n",q->len); printf("que_destroy(%p): %d\n",q,que_destroy(q)); //que_destroy(q); return 0;}
0 0
- C 宏实现队列
- 队列C实现
- Objective-C 队列实现
- C实现链式队列
- 循环队列实现(C++)
- 队列 C语言实现
- 队列C语言实现
- C/C++队列实现
- C数据结构实现队列
- 【C++】队列的实现
- C语言实现队列
- 队列(c实现)
- C 循环队列实现
- 队列 c语言实现
- C语言实现队列
- C队列 数组实现
- C实现队列
- C 实现ArrayQueue队列
- C 实现简单的栈
- Java web 之mysql连接
- MySQL高性能以及高安全测试
- linux中解压版eclipse 无法使用问题
- mysqld执行的函数栈
- C实现队列
- C 内存池的实现
- dbms_scheduler介绍
- Mysql Join_buffer_size的使用原理
- GCD倒计时
- innnodb 线程在做什么?
- perl 操作mysql 数据库
- Seconds_Behind_Master的计算
- MySQL内存分配