特殊线性表队的c语言,C语言队列的实现--学习组合设计(一)

转载请注明出处:http://blog.youkuaiyun.com/ecorefeng

作者:朱克锋

队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。  在队列这种数据结构中,最先插入在元素将是最先被删除;反之最后插入的元素将最后被删除,因此队列又称为“先进先出”(FIFO—first in first out)的线性表。还有一种双向的Queue实现Deque。这种队列允许在队列头和尾部进行入队出队操作,因此在功能上比Queue显然要更复杂。需要说明的是LinkedList也已经加入了Deque的一部分(LinkedList是从jdk1.2 开始就存在数据结构)。在这里不仅仅是实现了队列,我想通过这个队列体现组合意义首先看一下前面我写的链表,看一下代码的实现,然后再来看这个对列的实现,会发现组合的威力是多么的巨大和前面一样先定义结构:typedef struct _Queue{    DList *dlist;}Queue;下面定义基本操作,包括:Queue *queue_create();Ret queue_push(Queue *queue, void *data);Ret queue_pop(Queue *queue);Ret queue_destroy(Queue *queue, DES_FUNC des_func ,int index);void *queue_foreach(Queue *queue, VISIT_FUNC visit_func, void *ctx);int queue_len(Queue *queue);DListNode *queue_get(Queue *queue);完整头文件如下#ifndef QUEUE_H#define QUEUE_H#include "dlist.h"/** File:   queue.h* Author: ecorefeng* Created on 2010年8月13日*/typedef struct _Queue{    DList *dlist;}Queue;Queue *queue_create();Ret queue_push(Queue *queue, void *data);Ret queue_pop(Queue *queue);Ret queue_destroy(Queue *queue, DES_FUNC des_func ,int index);void *queue_foreach(Queue *queue, VISIT_FUNC visit_func, void *ctx);int queue_len(Queue *queue);DListNode *queue_get(Queue *queue);#endif /*QUEUE_H*/以下是函数实现部分(queue.c):#include "queue.h"#include /** File:   queue.c* Author: ecorefeng* Created on 2010年8月13日*//**功能:实现一个结构体的初始化*参数:void*返回:Queue结构体*/Queue *queue_create(){    Queue *queue  = (Queue*)malloc(sizeof(Queue));    if(queue !=NULL)    {        queue->dlist = dlist_create();        if(queue->dlist == NULL)        {            free(queue);            queue = NULL;        }    }    return queue;}Ret queue_push(Queue *queue, void *data){    return_val_if_fail(queue != NULL&&data != NULL, RET_FAULT);    return dlist_add(queue->dlist, -1, data);}Ret queue_pop(Queue *queue){    return_val_if_fail(queue !=NULL, RET_FAULT);        return dlist_delete(queue->dlist, 1);}Ret queue_destroy(Queue *queue, DES_FUNC des_func ,int index){    if(queue != NULL)    {        dlist_destroy(queue->dlist, des_func, index);        queue->dlist = NULL;        free(queue);    }        return RET_OK;}void *queue_foreach(Queue *queue, VISIT_FUNC visit_func, void *ctx){    return_val_if_fail(queue != NULL&&visit_func != NULL, NULL);    return dlist_foreach(queue->dlist, visit_func, ctx);}int queue_len(Queue *queue){    return_val_if_fail(queue != NULL, 0);    return dlist_len(queue->dlist);}DListNode *queue_get(Queue *queue){    return dlist_get(queue->dlist, 1);}最后把测试也写在下面,供学习者测试(queuetest.c)#include #include #include "queue.h"/** File:   queuetest.c:动态数组函数实现* Author: ecorefeng* Created on 2010年8月13日*//*int main(int argc, char * argv[]){    int i = 0;    int a = 6666666;    int b = 7777777;    Queue *queue = NULL;    queue = (Queue *)queue_create();    queue_push(queue,&a );    queue_push(queue,&a );    queue_push(queue,&a );    for(i = 0; i < 10; i++)    {        queue_push(queue, &b);    }    assert(13 == queue_len(queue));    queue_pop(queue);    assert(12 == queue_len(queue));        void * print_int(void *ctx, void *data)    {        printf("%d/n",*(int *)data);        return NULL;    }    queue_foreach(queue, print_int,NULL);    queue_destroy(queue, NULL, 0);}在这篇文章里我没有对代码本身进行解释,主要向表现的是组合的思想,程序本身不是太难,(要了解我前面写的通用链表)如果没有看的话请一定要看一下《C语言通用链表的实现》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值