队列——链表与数组实现(数据结构与算法分析C语言版)
2013-04-28 10:46
351 查看
链队列:一个链队列显然需要两个分别指向队头和队尾的指针(即头指针和尾指针)才能唯一确定。一般,为了操作方便,可以给链队列添加一个头结点,并令头指针指向头结点。由此,空的链队列的判决条件为:头指针和尾指针均指向头结点,如下图所示:
头文件:queue.h
数组实现:队列头文件,queue.h
头文件:queue.h
typedef int ElementType; #ifndef _QUEUE_LIST_ #define _QUEUE_LIST_ struct QNode; struct Node; typedef QNode *QNodePtr; typedef Node *PtrToNode; typedef PtrToNode Queue; int IsEmpty( Queue Q ); //判断队列是否为空Q->Rear == Q->Front; Queue CreateQueue(); //构造队列 void DisposeQueue( Queue Q ); //删除整个队列,回收空间 void MakeEmpty( Queue Q ); //释放队列空间,将其置为空 void EnQueue( ElementType X, Queue Q ); //在队列尾端插入元素 ElementType Front( Queue Q ); //取出对头元素,但不删除 void Dequeue( Queue Q ); //删除对头元素 ElementType FrontAndDequeue( Queue Q ); // void PrintQueue( Queue Q ); //打印队列 #endif实现文件queue.c
#include "queue.h" #include <stdio.h> #include <stdlib.h> struct QNode { ElementType Element; QNodePtr Next; }; struct Node { QNodePtr Front; QNodePtr Rear; }; int IsEmpty( Queue Q ) { return Q->Rear == Q->Front; } void MakeEmpty( Queue Q ) { if (Q == NULL) { printf("The queue is empty! Must use CreateQueue first!\n"); return; } else { while(!IsEmpty(Q)) Dequeue(Q); } } Queue CreateQueue() { //不仅要为对头(Queue)申请空间,还要为队列元素/节点(QNode)申请空间. Queue Q; Q = (Queue)malloc(sizeof(struct Node)); if (Q == NULL) { printf("Out of space!\n"); return NULL; } Q->Front = Q->Rear = (QNodePtr)malloc(sizeof(struct QNode)); if (Q->Front == NULL) { printf("Out of space!\n"); return NULL; } Q->Front->Next = NULL; return Q; } void DisposeQueue( Queue Q ) { while (Q->Front != NULL) { Q->Rear = Q->Front->Next; free(Q->Front); Q->Front = Q->Rear; } } void Dequeue( Queue Q ) { //删除链队列第一个元素 if (!IsEmpty(Q)) { QNodePtr P; P = Q->Front->Next; Q->Front->Next = P->Next; if (Q->Rear == P) //判断队列中是否只有一个元素 Q->Rear = Q->Front; free(P); } else { printf("The queue is empty!\n"); } } void EnQueue( ElementType X, Queue Q ) { QNodePtr P = (QNodePtr)malloc(sizeof(struct QNode)); if (P == NULL) { printf("Out of space!\n"); return; } else { P->Next = NULL; P->Element = X; Q->Rear->Next = P; Q->Rear = P; } } ElementType Front( Queue Q ) { return Q->Front->Next->Element; } ElementType FrontAndDequeue( Queue Q ) { ElementType X = 0; if (!IsEmpty(Q)) { X = Front(Q); Dequeue(Q); } else { printf("The queue is empty!\n"); } return X; } void PrintQueue( Queue Q ) { QNodePtr P = Q->Front; while (P != Q->Rear) { P = P->Next; printf("%d\n", P->Element); } }循环队列一般是用循环数组实现,其判空条件有多种方式:其一是设一个标志位以区别队列是空还是满;其二是少用一个元素空间,约定以队列头指针在队列尾指针的下一位置上作为队列呈满状态标志。或者是如下面代码所示,为表示队列的结构体设置一个表示队列大小的size标志,若size为0,那么队列为空。
数组实现:队列头文件,queue.h
typedef int ElementType; #ifndef _QUEUE_ #define _QUEUE_ struct QueueRecord; typedef QueueRecord *Queue; int IsEmpty( Queue Q ); int IsFull( Queue Q ); Queue CreateQueue( int MaxElements ); void DisposeQueue( Queue Q ); void MakeEmpty( Queue Q ); void EnQueue( ElementType X, Queue Q ); ElementType Front( Queue Q ); void Dequeue( Queue Q ); ElementType FrontAndDequeue( Queue Q ); #endif实现文件:queue.cpp
#include "queue.h" #include <stdio.h> #include <stdlib.h> struct QueueRecord { int Capacity; int Front; int Rear; int Size; ElementType *Array; }; int IsEmpty( Queue Q ) { return Q->Size == 0; } int IsFull( Queue Q ) { return Q->Size == Q->Capacity; } void MakeEmpty( Queue Q ) { Q->Size = 0; Q->Front = 1; Q->Rear = 0; } Queue CreateQueue( int MaxElements ) { Queue Q; Q = (Queue)malloc(sizeof(struct QueueRecord)); if (Q == NULL) { printf("Out of space!\n"); return NULL; } Q->Array = (ElementType*)malloc(sizeof(ElementType) * MaxElements); if (Q->Array == NULL) { printf("Out of space!\n"); return NULL; } Q->Capacity = MaxElements; MakeEmpty(Q); return Q; } void DisposeQueue( Queue Q ) { if (Q != NULL) { free(Q->Array); free(Q); } } static int Succ(int Value, Queue Q) { if (++Value == Q->Capacity) Value = 0; return Value; } void EnQueue( ElementType X, Queue Q ) { if (IsFull(Q)) { printf("Queue is full!\n"); return; } else { Q->Size++; Q->Rear = Succ(Q->Rear, Q); //Q->Rear = (Q->Rear + 1) % Q->Capacity ? Q->Rear + 1 : 0; Q->Array[Q->Rear] = X; } } ElementType Front( Queue Q ) { if (!IsEmpty(Q)) { return Q->Array[Q->Front]; } printf("Queue is Empty!\n"); return 0; } void Dequeue( Queue Q ) { if (!IsEmpty(Q)) { Q->Size--; Q->Front = Succ(Q->Front, Q); } else { printf("Queue is Empty!\n"); } } ElementType FrontAndDequeue( Queue Q ) { ElementType X = 0; if (!IsEmpty(Q)) { Q->Size--; X = Q->Array[Q->Front]; Q->Front = Succ(Q->Front, Q); } else { printf("Queue is Empty!\n"); } return X; }
相关文章推荐
- 用单链表与数组实现队列先进先出的数据结构
- Lua中使用table实现的其它5种数据结构(数组、链表、队列、集合和包、StringBuild)
- java使用数组和链表实现队列示例
- 用结点实现链表LinkedList,用数组和结点实现栈Stack,用数组和结点链表实现队列Queue
- 数据结构与算法分析-用C语言实现队列(数组方式)
- java 实现数组队列和链表队列
- 用数组和链表实现队列操作
- 数据结构与算法分析—循环队列的数组实现(C语言)
- 习题3.25 链表和数组对队列例程实现
- C++实现队列--数组实现和链表实现
- 算法导论10:栈链表的简化、队列的数组实现 2016.1.10
- 队列—链表与循环数组实现
- 队列的两种实现:数组和链表
- 20162314 王译潇 课上用链表和数组实现循环队列
- 数组、链表、栈、队列的实现。
- Python 使用由单链表构建的数组实现有边际优先队列 (基于class, 包含迭代器)
- 队列(queue)的链表(list)实现及循环数组(circular array)实现 C++实现
- 数据结构与实现——数组、矩阵、链表、队列、栈、对象、二叉树和红黑树
- 数据结构之用数组和链表实现队列
- 入门经典_Chap06_例题[一]:队列,栈,链表的数组实现