C语言队列的实现--学习组合设计(一)

转载请注明出处:http://blog.csdn.net/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 <malloc.h>
/*
* 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 <stdio.h>
#include <assert.h>
#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语言通用链表的实现》

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值