您的位置:首页 > 编程语言 > C语言/C++

C语言队列的实现

2012-04-24 12:44 316 查看
作者:朱克锋

队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。

  在队列这种数据结构中,最先插入在元素将是最先被删除;反之最后插入的元素将最后被删除,因此队列又称为“先进先出”(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

*/

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

*/

/*

*功能:实现一个结构体的初始化

*参数: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:动态数组函数实现

*/

/*

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语言通用链表的实现》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: