1.数据类型定义

在代码中为了清楚的表示一些错误和函数运行状态,我们预先定义一些变量来表示这些状态。在head.h头文件中有如下定义:

//定义数据结构中要用到的一些变量和类型
#ifndef HEAD_H
#define HEAD_H#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>#define TRUE  1
#define FALSE 0
#define OK    1
#define ERROR  0
#define INFEASIBLE -1
#define OVERFLOW   -2    //分配内存出错typedef int  Status;     //函数返回值类型
typedef int  ElemType;   //用户定义的数据类型#endif

2.数据结构实现

typedef struct Node{ElemType data;struct Node* next;
}Node,*pNode;typedef struct LinkQueue{pNode head;pNode tail;int  length;
}LinkQueue,*pLinkQueue;

3.队列链式实现

LinkQueue.h代码实现如下:

#ifndef LINKQUEUE_H
#define LINKQUEUE_H#include "head.h"typedef struct Node{ElemType data;struct Node* next;
}Node,*pNode;typedef struct LinkQueue{pNode head;pNode tail;int  length;
}LinkQueue,*pLinkQueue;//初始化队列
Status InitQueue(pLinkQueue &Q){Q=(pLinkQueue)malloc(sizeof(LinkQueue));if(!Q) return OVERFLOW;pNode p=(pNode)malloc(sizeof(Node));if(!p) return OVERFLOW;p->next=NULL;Q->head=p;Q->tail=p;Q->length=0;return OK;
}//队列长度
Status QueueLength(pLinkQueue Q){if(Q==NULL) return ERROR;return Q->length;
}
//队列是否为空
Status QueueEmpty(pLinkQueue Q){return QueueLength(Q)==0;
}//取得队头数据
Status GetHead(pLinkQueue Q,ElemType &e){if(QueueLength(Q)<1) return ERROR;e=Q->head->next->data;return true;
}
//从队尾插入数据
Status InsertQueue(pLinkQueue &Q,ElemType e){pNode q=Q->tail;pNode p=(pNode)malloc(sizeof(Node));p->data=e;p->next=NULL;Q->tail=p;q->next=Q->tail;Q->length++;return true;
}
//从队头删除数据
Status DeleteQueue(pLinkQueue &Q,ElemType &e){if(QueueLength(Q)<1) return ERROR;if(QueueLength(Q)==1){e=Q->tail->data;}else{pNode p=Q->head;Q->head=p->next;e=Q->head->data;free(p);}Q->length--;return true;
}
//用(*visit)()遍历队列
Status QueueTraverse(pLinkQueue &Q,Status (*visit)(ElemType)){pNode p=Q->head;do{p=p->next;(*visit)(p->data);}while((p!=Q->tail));return true;
}
Status print(ElemType e){printf("%d<<",e);return true;
}
//输出队列
Status printQueue(pLinkQueue Q){if(QueueLength(Q)<1) return ERROR;printf("\nhead<<");QueueTraverse(Q,print);printf("tail\n");return true;
}
//清空队列
Status ClearQueue(pLinkQueue &Q){while(!QueueEmpty(Q)){ElemType e;DeleteQueue(Q,e);}return OK;
}
//销毁队列
Status DestroyQueue(pLinkQueue &Q){ClearQueue(Q);free(Q->head);free(Q->tail);free(Q);Q=NULL;return OK;
}#endif

4.测试队列

#include "LinkQueue.h"
void main(){pLinkQueue Q;InitQueue(Q);for (int i=0;i<10;i++){InsertQueue(Q,i);}printQueue(Q);ElemType e2;DeleteQueue(Q,e2);printf("\n删除队列头:%d",e2);printQueue(Q);printf("\n队列长度:%d",QueueLength(Q));ElemType e;GetHead(Q,e);printf("\n队列头:%d",e);ClearQueue(Q);DestroyQueue(Q);}

5.测试结果如下

head<<0<<1<<2<<3<<4<<5<<6<<7<<8<<9<<tail删除队列头:0
head<<1<<2<<3<<4<<5<<6<<7<<8<<9<<tail队列长度:9
队列头:1

转载于:https://www.cnblogs.com/whzhaochao/p/5023507.html

(C语言)队列的链式实现(数据结构十一)相关推荐

  1. 队列的链式存储结构及其实现_了解队列数据结构及其实现

    队列的链式存储结构及其实现 A queue is a collection of items whereby its operations work in a FIFO - First In Firs ...

  2. c语言建立队列(顺序队列、循化队列和链式队列)

    c语言建立队列 一.顺序队列 队列的顺序存储结构 顺序队列的讨论 "下溢"现象 "真上溢"现象 "假上溢"现象 二.如何解决"假上 ...

  3. 数据结构 3-2-1 队列的链式存储实现

    一.概念 队列也是一种受限的线性表,只允许一端插入另一段输出,就像其名字一样,队列具有先入先出的特点,这是由于其受限的特点所决定的.用链式结构实现队列,称为链队列,实际上是一个带有队头指针和队尾指针的 ...

  4. 队列的链式存储结构及实现

    队列的链式存储结构,其实就是线性表的单链表,只不过它只是尾进头出而已,我们把它简称为链队列.为了操作上的方便,我们将队头指针指向链队列的头结点,而队尾指针指向终端节点.如果 空队列时,front和re ...

  5. 队列的链式存储实现(简单的入队和出队操作)

    /************************************************************************ * * 文件名:2.2.5.cpp * * 文件描述 ...

  6. 队列的链式存储结构(链队)

    链队 1.队列的链式存储结构 typedef struct QNode{ //结点结构QElemType data; //结点数据域struct QNode *next; //结点指针域 }QNode ...

  7. c语言队列如何表示,队列的链式表示和实现(C语言)

    #include #include #define OK 1; #define ERROR 0; #define OVERFLOW 0; #define TURE 1; #define FALSE 0 ...

  8. 队列的链式存储和实现(C语言)【队列】(8)

    LinkQueue.h DataType.h DataType.cpp LinkQueue.cpp 测试结果 LinkQueue.h #pragma once#include "DataTy ...

  9. c语言队列(顺序队列,循环队列,链式队列)

    顺序队列 1.初始化: front=-1; rear=-1; 2.判空条件 font=rear; 3.队列已满条件 rear=max-1; 代码: #include<stdio.h> #i ...

最新文章

  1. 05定制后台和修改模型
  2. Pandas批量删除dataframe列名中的前缀实战:使用lstrip函数批量删除列名中的前缀(prefix)、使用replace函数批量删除列名中的前缀(prefix)
  3. 项目实战-linux下安装activeMQ
  4. jquery链式写法 java_jQuery链式操作
  5. 程序员如何日常解决错误问题
  6. ubuntu18.04的ifconfig输出没有ip地址
  7. idea中右侧的Maven框消失了
  8. sql中 N’ 的作用
  9. 分块试水--CODEVS4927 线段树练习5
  10. 运维工程师必会的linux命令下载,运维工程师必会的109个Linux命令.pdf
  11. 又拍云黄慧攀QCon 2016技术分享:直播平台架构与实施
  12. 升级 python 2.6.6 到 2.7.14 版本(pip工具安装)
  13. 谈谈CountDownLatch和CyclicBarrier
  14. python爬虫代码-学Python=写爬虫?不用代码也能爬下95%网站的数据!
  15. matlab遗传算法之goat工具箱
  16. 数值核反应堆大数据及其应用
  17. linux 用户 组区别吗,Linux用户组之主组和附加组
  18. 谨赠20篇技术热文营造一个不一样的节日气氛!
  19. 学生管理系统报错合集
  20. python爬取微博评论并做词频分析_爬取李子柒微博评论并分析

热门文章

  1. 识别中文_中文场景文字识别大赛官方baseline
  2. php计算日期函数,php日期处理函数(计算时间差,转换时间戳日期)
  3. union matlab,[转载]intersect,unique,union在matlab中的用法(I lo
  4. python异常如何处理_python异常处理
  5. openstack horizon dashboard_OpenStack最新版本:Ussuri发布亮点
  6. java比较炫的小程序_有人不建议学Java,有人不建议学Python,该怎么选择
  7. 三维计算机视觉(八)--点云配准
  8. hashmap扩容_面试官问:HashMap在并发情况下为什么造成死循环?一脸懵
  9. 剑指offer(面试战备ing,持续更新)
  10. C语言:求矩阵对角线元素的和