`
king_tt
  • 浏览: 2126042 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

【数据结构】链队列_LinkQueue

 
阅读更多
#include "stdio.h"    
#include "stdlib.h"   
#include "io.h"  
#include "math.h"  
#include "time.h"

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20 /* 存储空间初始分配量 */

typedef int Status; 

typedef int QElemType; /* QElemType类型根据实际情况而定,这里假设为int */

typedef struct QNode	/* 结点结构 */
{
   QElemType data;
   struct QNode *next;
}QNode,*QueuePtr;

typedef struct			/* 队列的链表结构 */
{
   QueuePtr front,rear; /* 队头、队尾指针 */
}LinkQueue;

Status visit(QElemType c)
{
	printf("%d ",c);
	return OK;
}

/* 构造一个空队列Q */
Status InitQueue(LinkQueue *Q)
{ 
	Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode));
	if(!Q->front)
		exit(OVERFLOW);
	Q->front->next=NULL;
	return OK;
}

/* 销毁队列Q */
Status DestroyQueue(LinkQueue *Q)
{
	while(Q->front)
	{
		 Q->rear=Q->front->next;
		 free(Q->front);
		 Q->front=Q->rear;
	}
	return OK;
}

/* 将Q清为空队列 */
Status ClearQueue(LinkQueue *Q)
{
	QueuePtr p,q;
	Q->rear=Q->front;
	p=Q->front->next;
	Q->front->next=NULL;
	while(p)
	{
		 q=p;
		 p=p->next;
		 free(q);
	}
	return OK;
}

/* 若Q为空队列,则返回TRUE,否则返回FALSE */
Status QueueEmpty(LinkQueue Q)
{ 
	if(Q.front==Q.rear)
		return TRUE;
	else
		return FALSE;
}

/* 求队列的长度 */
int QueueLength(LinkQueue Q)
{ 
	int i=0;
	QueuePtr p;
	p=Q.front;
	while(Q.rear!=p)
	{
		 i++;
		 p=p->next;
	}
	return i;
}

/* 若队列不空,则用e返回Q的队头元素,并返回OK,否则返回ERROR */
Status GetHead(LinkQueue Q,QElemType *e)
{ 
	QueuePtr p;
	if(Q.front==Q.rear)
		return ERROR;
	p=Q.front->next;
	*e=p->data;
	return OK;
}


/* 插入元素e为Q的新的队尾元素 */
Status EnQueue(LinkQueue *Q,QElemType e)
{ 
	QueuePtr s=(QueuePtr)malloc(sizeof(QNode));
	if(!s) /* 存储分配失败 */
		exit(OVERFLOW);
	s->data=e;
	s->next=NULL;
	Q->rear->next=s;	/* 把拥有元素e的新结点s赋值给原队尾结点的后继,见图中① */
	Q->rear=s;		/* 把当前的s设置为队尾结点,rear指向s,见图中② */
	return OK;
}

/* 若队列不空,删除Q的队头元素,用e返回其值,并返回OK,否则返回ERROR */
Status DeQueue(LinkQueue *Q,QElemType *e)
{
	QueuePtr p;
	if(Q->front==Q->rear)
		return ERROR;
	p=Q->front->next;		/* 将欲删除的队头结点暂存给p,见图中① */
	*e=p->data;				/* 将欲删除的队头结点的值赋值给e */
	Q->front->next=p->next;/* 将原队头结点的后继p->next赋值给头结点后继,见图中② */
	if(Q->rear==p)		/* 若队头就是队尾,则删除后将rear指向头结点,见图中③ */
		Q->rear=Q->front;
	free(p);
	return OK;
}

/* 从队头到队尾依次对队列Q中每个元素输出 */
Status QueueTraverse(LinkQueue Q)
{
	QueuePtr p;
	p=Q.front->next;
	while(p)
	{
		 visit(p->data);
		 p=p->next;
	}
	printf("\n");
	return OK;
}

int main()
{
	int i;
	QElemType d;
	LinkQueue q;
	i=InitQueue(&q);
	if(i)
		printf("成功地构造了一个空队列!\n");
	printf("是否空队列?%d(1:空 0:否)  ",QueueEmpty(q));
	printf("队列的长度为%d\n",QueueLength(q));
	EnQueue(&q,-5);
	EnQueue(&q,5);
	EnQueue(&q,10);
	printf("插入3个元素(-5,5,10)后,队列的长度为%d\n",QueueLength(q));
	printf("是否空队列?%d(1:空 0:否)  ",QueueEmpty(q));
	printf("队列的元素依次为:");
	QueueTraverse(q);
	i=GetHead(q,&d);
	if(i==OK)
	 printf("队头元素是:%d\n",d);
	DeQueue(&q,&d);
	printf("删除了队头元素%d\n",d);
	i=GetHead(q,&d);
	if(i==OK)
		printf("新的队头元素是:%d\n",d);
	ClearQueue(&q);
	printf("清空队列后,q.front=%u q.rear=%u q.front->next=%u\n",q.front,q.rear,q.front->next);
	DestroyQueue(&q);
	printf("销毁队列后,q.front=%u q.rear=%u\n",q.front, q.rear);
	
	return 0;
}


分享到:
评论

相关推荐

    链队列(严蔚敏 C语言版 链队列表示与实现)(c++编写)

    链队列(欠判队空操作) 主函数部分纯属测试 部分内容: Status InitQueue (LinkQueue &Q); // 构造一个空队列Q Status EnQueue (LinkQueue &Q,QElemType e) ;// 插入元素e为Q的新的队尾元素 Status DeQueue ...

    用链栈实现链队列逆置(栈的指针的实现的应用)

    //用链栈实现链队列逆置 //Wpl #include "linkstack.h" //将链栈基本操作包括进来 typedef struct node /*定义链队列结点类型*/ { datatype data; struct node *next; }linkqueue; typedef struct /*封装队头指针...

    数据结构与算法全集(C源代码+详细注释)

    │ ├─键树(双链键树) │ │ 1.txt │ │ DLTree.cpp │ │ DLTree.h │ │ main.cpp │ │ Record.h │ │ Status.h │ │ │ ├─静态查找表(有序表的查找) │ │ 1.txt │ │ main.cpp │ │ SElemType.cpp │ ...

    队列源码数据

    ②int InitQueue(LinkQueue *Q) //链队列初始化 ③int EnterQueue(LinkQueue *Q,int x) //链队列的插入操作  ④int DeleteQueue(LinkQueue *Q,int e) //链队列的删除操作  ⑤int PrintQueue(LinkQueue *Q) //链...

    数据结构实验-队列的相关计算

    2.掌握链队列的建立,入队、出队等基本运算。 二、实验原理 采用链式存储结构的队列实质上是限定了仅在头结点之后执行删除操作、在表尾结点后执行插入操作的线性链表,如下图所示。 队列的存储结构定义为: ...

    LinkQueue.txt

    文档中实现了队列了链式表示,并实现了队列了一些主要操作函数.可以作为学习数据结构中队列那一部分时的参考.

    队列的基本操作

    ②int InitQueue(LinkQueue *Q) //链队列初始化 ③int EnterQueue(LinkQueue *Q,int x) //链队列的插入操作  ④int DeleteQueue(LinkQueue *Q,int e) //链队列的删除操作  ⑤int PrintQueue(LinkQueue *Q) //链...

    严蔚敏《数据结构》源码 顺序表——二叉树

    目前写在了图,之后的内容会在github上持续更新,数据结构系列更新完之后,可能会更新算法的教程(参考屈婉玲版《算法设计与分析》)希望可以帮到各位!! InitList.cpp------顺序表 LinkList.cpp------链表 ...

    LinkQueue.cpp

    LinkQueue.cpp

    数据结构实践

    链队 LinkQueue 5 串 串类 AString 串匹配 FindStr 6 数组 快速转置 MatrixTrans 矩阵加 AddMatrix 矩阵乘 MulMatrix 7 广义表 头、尾表示的广义表 BroadList 8 树与二叉树 二叉链表存储的二叉树 BiTree 孩子-...

    数据结构课程设计航空订票系统.doc

    修改航班信息: 当航班信息改变可以修改航班数据文件 概要设计 每个模块的算法设计说明如下: (1)录入模块: 查找单链表的链尾,在链头插入一个"航班信息"的新结点。 (2)浏览模块: 顺着单链表输出航班信息。 ...

    数据结构中的链队(C++版)

    vs2017编写的链队(链式存储的队列),包括:创建、销毁、清空、判空、获取元素数、获取队头、入队、出队、遍历等

    生产者与消费者 进程的同步与互斥模拟

    程序中有三个链队列,一个链表。一个就绪队列(ready),两个等待队列:生产者等待队列(producer);消费者队列(consumer)。一个链表(over),用于收集已经运行结束的进程 本程序通过函数模拟信号量的操作。 ...

    生产者与消费者 进程调度模拟(c++)

    程序中有三个链队列,一个链表。一个就绪队列(ready),两个等待队列:生产者等待队列(producer);消费者队列(consumer)。一个链表(over),用于收集已经运行结束的进程 本程序通过函数模拟信号量的操作。 ...

Global site tag (gtag.js) - Google Analytics