单链表sLinkList类,模板类
队列(queue )是一种先进先出(first in first out,简称 FIFO表)的线性表。
它只允许在表的一端进行插入,而在另一端删 除元素。
在队列中,允许插入的一端叫做队尾(rear),允许删除的一端 称为队头(front)。
一、队列的顺序表示和实现,循环队列(数组)
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h> #define OK 1
#define ERROR 0
#define OVERFLOW -1
#define MAXQSIZE 100 //最大队列长度 typedef int Status;
typedef int QElemType; /* 0.队列结构体 */
typedef struct {
QElemType *base; // 指针(指向动态分配存储空间)
int front; //头指针,若队列不空,
//指向队列头元素
int rear; //尾指针,若队列不空,
//指向队列尾元素的下 一个位置
}SqQueue; //定义循环队列类型 /* 1.队列Q初始化(构造一个空队列Q) */
Status InitQueue (SqQueue &Q) {
Q.base = (QElemType *) malloc(MAXQSIZE *sizeof (QElemType));
if (!Q.base) exit (OVERFLOW);// 存储分配失败
Q.front = Q.rear = ; //队列为空(数组下标均为0)
return OK;
} /* 2.队列Q的队尾插入元素e*/
Status EnQueue (SqQueue &Q, QElemType e) {
if ((Q.rear+) % MAXQSIZE == Q.front)
return ERROR; //队列满 rear+1 == front
Q.base[Q.rear] = e; //插入队尾
Q.rear = (Q.rear+) % MAXQSIZE; //队尾指针更新 rear+1
return OK;
} /* 3.删除队列Q的队头元素 */
Status DeQueue (SqQueue &Q, QElemType &e) {
if (Q.front == Q.rear) return ERROR; //空队列 front == rear
e = Q.base[Q.front]; //返回删除的元素
Q.front = (Q.front+) % MAXQSIZE; //删除元素(更新队头指针 front+1)
return OK;
} /* 测试代码 */
int main()
{
int array[] = {};
SqQueue Q; //创建一个队列变量
InitQueue(Q);//队列初始化(分配空间,构造空队列)
for(int i=; i<; ++i)
EnQueue(Q,i+); //队列插入元素
for(int j=; j<; ++j)
DeQueue(Q,array[j]); //删除队列元素,到数组array
for(int k=; k<; ++k) //输出数组元素
printf("%3d",array[k]);
printf("\n");
return ;
}
//浙大数据结构 \ 顺序队列
typedef int Position;
struct QNode {
ElementType *Data; /* 存储元素的数组 */
Position Front, Rear; /* 队列的头、尾指针 */
int MaxSize; /* 队列最大容量 */
};
typedef struct QNode *Queue; Queue CreateQueue( int MaxSize )
{
Queue Q = (Queue)malloc(sizeof(struct QNode));
Q->Data = (ElementType *)malloc(MaxSize * sizeof(ElementType));
Q->Front = Q->Rear = ;
Q->MaxSize = MaxSize;
return Q;
} bool IsFull( Queue Q )
{
return ((Q->Rear+)%Q->MaxSize == Q->Front);
} bool AddQ( Queue Q, ElementType X )
{
if ( IsFull(Q) ) {
printf("队列满");
return false;
}
else {
Q->Rear = (Q->Rear+)%Q->MaxSize;
Q->Data[Q->Rear] = X;
return true;
}
} bool IsEmpty( Queue Q )
{
return (Q->Front == Q->Rear);
} ElementType DeleteQ( Queue Q )
{
if ( IsEmpty(Q) ) {
printf("队列空");
return ERROR;
}
else {
Q->Front =(Q->Front+)%Q->MaxSize;
return Q->Data[Q->Front];
}
}
二、队列的链式表示和实现,链队列(链表)
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h> #define OK 1
#define ERROR 0
#define OVERFLOW -1
#define MAXQSIZE 100 //最大队列长度 typedef int Status;
typedef int QElemType;
typedef struct Node QNode; //结点类型
typedef struct Node* QueuePtr;//结点指针
struct Node { //定义结点
QElemType data; //结点data
QueuePtr next; //结点next指针
}; /* 0.队列结构体 */
typedef struct {
QueuePtr front; // 队头指针
QueuePtr rear; // 队尾指针
} LinkQueue; // 链队列类型 /* 1.队列Q初始化(构造一个空队列Q) */
Status InitQueue (LinkQueue &Q) {
//队列的队头、队尾指向队头结点(空队列)
Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));
if (!Q.front) exit (OVERFLOW);//存储分配失败
Q.front->next = NULL;//头指针置空
return OK;
} /* 2.销毁队列Q */
Status DestroyQueue (LinkQueue &Q) {
Q.front = Q.front->next;//带头结点的队列
while (Q.front)
{
Q.rear = Q.front->next;
free (Q.front) ;
Q.front = Q.rear;
}
return OK;
} /* 3.队列Q的队尾插入元素e*/
Status EnQueue (LinkQueue &Q, QElemType e) {
QueuePtr p = (QueuePtr) malloc (sizeof (QNode));
if(!p) exit (OVERFLOW); //存储分配失败
p->data = e;
p->next = NULL; //新结点p->next置为NULL
Q.rear->next = p;//插入队列
Q.rear = p; //更新队尾
return OK;
} /* 3.删除队列Q的队头元素 */
Status DeQueue (LinkQueue &Q, QElemType &e) {
if (Q.front == Q.rear) return ERROR; //队列为空
QueuePtr p = Q.front->next;
e = p->data;
Q.front->next = p->next; //删除队头元素(其后继元素挂到队列头结点)
if (Q.rear == NULL) Q.rear = Q.front; //队尾空,队列置空
free (p); //释放删除的对头元素
return OK;
} /* 测试代码 */
int main()
{
int array[] = {};
LinkQueue Q; //创建一个队列变量
InitQueue(Q);//队列初始化(分配空间,构造空队列)
for(int i=; i<; ++i)
EnQueue(Q,i+); //队列插入元素
for(int j=; j<; ++j)
DeQueue(Q,array[j]); //删除队列元素,到数组array
for(int k=; k<; ++k) //输出数组元素
printf("%3d",array[k]);
printf("\n");
return ;
}
/* 只有尾指针的循环队列 */
#include <stdio.h>
#include <malloc.h> #define OK 1
#define ERROR 0 typedef int QElemType, Status;
typedef struct LinkQueueNode* LinkQueuePTR; /* 0.结点 */
struct LinkQueueNode{
QElemType e;
LinkQueuePTR next;
}; /* 1. 初始化队列*/
Status InitQueue(LinkQueuePTR *rear)
{
LinkQueuePTR p;
p = (LinkQueuePTR)malloc(sizeof(struct LinkQueueNode));
if(p == NULL)
return ERROR; p->next = p;
*rear = p;
return OK;
}
/* 2. 队列是否为空*/
Status isEmpty(LinkQueuePTR rear)
{
if(rear == NULL)
return ERROR;
return rear == rear->next ? OK : ERROR;
}
/* 3. 进队*/
Status enqueue(LinkQueuePTR *rear,QElemType e)
{
LinkQueuePTR p;
p = (LinkQueuePTR)malloc(sizeof(struct LinkQueueNode));
if(p == NULL)
return ERROR; p->e=e;
p->next = (*rear)->next;
(*rear)->next = p;
*rear = p;
return OK;
}
/* 4. 出队*/
Status dequeue(LinkQueuePTR *rear,QElemType *e)
{
if(isEmpty(*rear))
return ERROR; LinkQueuePTR front;
front = (*rear)->next->next; if(front == *rear){/* 是否只一个结点 */
*rear = front->next;
(*rear)->next = *rear;
}
else{
(*rear)->next->next = front->next;
} *e = front->e;
free(front);
return OK;
} /* 测试代码 */
int main()
{
LinkQueuePTR rear = NULL;
QElemType e;
int n = ;
/* 初始化只有尾指针的循环队列 */
InitQueue(&rear);
/* 队列输入数据(进队) */
for(int i=; i<n; ++i){
scanf("%d",&e);
enqueue(&rear,e);
}
/* 出队 */
while(!isEmpty(rear))
{
dequeue(&rear,&e);
printf("%5d",e);
}
return ;
}
//浙大数据结构 \ 链队列
typedef struct Node *PtrToNode;
struct Node { /* 队列中的结点 */
ElementType Data;
PtrToNode Next;
};
typedef PtrToNode Position; struct QNode {
Position Front, Rear; /* 队列的头、尾指针 */
int MaxSize; /* 队列最大容量 */
};
typedef struct QNode *Queue; bool IsEmpty( Queue Q )
{
return ( Q->Front == NULL);
} ElementType DeleteQ( Queue Q )
{
Position FrontCell;
ElementType FrontElem; if ( IsEmpty(Q) ) {
printf("队列空");
return ERROR;
}
else {
FrontCell = Q->Front;
if ( Q->Front == Q->Rear ) /* 若队列只有一个元素 */
Q->Front = Q->Rear = NULL; /* 删除后队列置为空 */
else
Q->Front = Q->Front->Next;
FrontElem = FrontCell->Data; free( FrontCell ); /* 释放被删除结点空间 */
return FrontElem;
}
}
单链表sLinkList类,模板类的更多相关文章
- C++中的链表节点用模板类和用普通类来实现的区别
C++中的链表节点通常情况下类型都是一致的.因此我们可以用模板来实现. #include <iostream> using namespace std; template<typen ...
- 数据结构图文解析之:数组、单链表、双链表介绍及C++模板实现
0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...
- C++学习笔记36:类模板
类模板的目的 设计通用的类型式,以适应广泛的成员数据型式 类模板的定义格式 template<模板形式参数列表>class 类名称{...}; 原型:template<typenam ...
- C++解析(26):函数模板与类模板
0.目录 1.函数模板 1.1 函数模板与泛型编程 1.2 多参数函数模板 1.3 函数重载遇上函数模板 2.类模板 2.1 类模板 2.2 多参数类模板与特化 2.3 特化的深度分析 3.小结 1. ...
- 如何用boost::serialization去序列化派生模板类(续)
在 如何用boost::serialization去序列化派生模板类这篇文章中,介绍了序列化派生类模板类, 在写測试用例时一直出现编译错误,调了非常久也没跳出来,今天偶然试了一下...竟然调了出来. ...
- C++_进阶之函数模板_类模板
C++_进阶之函数模板_类模板 第一部分 前言 c++提供了函数模板(function template.)所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来 ...
- C++ 类模板与模板类详解
在C++的Template中很多地方都用到了typename与class这两个关键字,有时候这两者可以替换,那么这两个关键字是否完全一样呢? 事实上class用于定义类,在模板引入c++后,最初定义模 ...
- C++程序设计方法4:类模板
类模板 在定义类时也可以将一些类型抽象出来,用模板参数来替换,从而使类更具有通用性.这种类被称为模板类,例如: template <typename T> class A { T data ...
- C++ 类模板基础知识
类模板与模板类 为什么要引入类模板:类模板是对一批仅仅成员数据类型不同的类的抽象,程序员只要为这一批类所组成的整个类家族创建一个类模板,给出一套程序代码,就可以用来生成多种具体的类,(这类可以看作是类 ...
随机推荐
- hql 函数大全
序号 函数名称 说明 类型 支持 使用方法 备注 1 ABS(n) 取绝对值 数学函数 JPAQL HQL ABS(column_name[数字类型对象属性]) 2 SQRT(n) 取平方根 数 ...
- 菜鸡学C语言之真心话大冒险
题目描述 Leslie非常喜欢真心话大冒险的游戏.这一次游戏的规则有些不同.每个人都有自己的真心话,一开始每个人也都只知道自己的真心话.每一轮每个人都告诉指定的一个人他所知道的所有真心话,那么Lesl ...
- Linux下的crontab定时执行任务命令详解(参考:https://www.cnblogs.com/longjshz/p/5779215.html)
在Linux中,周期执行的任务一般由cron这个守护进程来处理[ps -ef | grep cron].cron读取一个或多个配置文件,这些配置文件中包含了命令行以及调用时间. cron的配置文件成为 ...
- SpringBoot项目中禁用HttpClient那些嘈杂的日志
在SpringBoot中使用了HttpClient之后,会产生大量嘈杂且基本无效的日志信息,如下图: 找了很多文章,大部分用common-logging.propertites,log4j.prope ...
- 关于HttpClient上传中文乱码的解决办法
使用过HttpClient的人都知道可以通过addTextBody方法来添加要上传的文本信息,但是,如果要上传中文的话,或还有中文名称的文件会出现乱码的问题,解决办法其实很简单: 第一步:设置Mult ...
- zzw原创_cmd下带jar包运行提示 “错误: 找不到或无法加载主类 ”
在windows下编译java,由于是临时测试一下文件,不想改classpath,就在命令行中用 -cp 或classpath引入jar包,用javac编译成功,便使用java带-cp 或classp ...
- raid卡的结构示意图
raid卡的结构示意图,取自<大话存储>第124页 ROM:一般用FLash芯片做ROM,存放着初始化RAID卡必须的代码以及实现RAID功能所需的代码; XOR芯片:专门用来做RAID ...
- js 快速生成数组的方法
//实现方法一:循环赋值var arr1 = new Array(100);for(var i=0;i<arr1.length;i++){ arr1[i] = i;}console.log(ar ...
- Firebug: 已拦截跨源请求:同源策略禁止读取位于XXX的远程资源。(原因:CORS 头缺少 'Access-Control-Allow-
第一种,就是在被请求的程序中添加HTTP头,即CORS跨域(跨域资源共享,Cross-Origin Resource Sharing) 如: Response.Headers.Add("Ac ...
- hdu1098
Ignatius is poor at math,he falls across a puzzle problem,so he has no choice but to appeal to Eddy. ...