C ~ 链式队列与循环队列

      此处的链式与循环队列可以应用于BFS和树的层序遍历。下面是对其结构和基本操作的程序描述。

1、循环队列

    解决循环队列的队空和队满的方法:

    [1].增加一个参数count,用来记录数组中当前元素的个数;

    [2].为避免队空和满两状态混淆,少用一个存储空间,也就是数组最后一个存数空间不用,(rear+1)% QSIZE= front 时, 队满;

a)判断是否为空队列:front==rear; b)判断队列是否已满:front=(rear+1)%size; 

typedef struct{      //队列结构定义
	int front;
	int rear;
	int count;  //队列元素计数
	int key[QSIZE];
}BFSQueue;

void InitBFSQueue(BFSQueue *BFSQ)  //队列初始化
{
	BFSQ->front=0;  //front指向队列第一个元素
	BFSQ->rear=0;   //rear指向队列中下一个空位
	BFSQ->count=0;
}
int EmptyBFSQueue(BFSQueue *BFSQ) //空
{
	return BFSQ->count==0;
}
int FullBFSQueue(BFSQueue *BFSQ)  //满
{
	return BFSQ->count==QSIZE;
}

void AddBFSQueue(BFSQueue *BFSQ,int num)  //插入
{
	if(!FullBFSQueue(BFSQ))
	{
		BFSQ->count++;
		BFSQ->key[BFSQ->rear]=num;
		BFSQ->rear=(BFSQ->rear+1) % QSIZE;
	}
}

int DelBFSQueue(BFSQueue *BFSQ)  //删除
{
	int temp;
	if(!EmptyBFSQueue(BFSQ))
	{
		BFSQ->count--;
		temp=BFSQ->key[BFSQ->front];
		BFSQ->front=(BFSQ->front+1) % QSIZE;
		return temp;
	}
	else
		return NULL;
}
/******************************************************************/


2、链式队列

typedef struct QNode{  // 队列元素结构  
	int key;
    struct QNode *next;
}QNode;
typedef struct{  // 队列结构 
	QNode *front;
	QNode *rear;
	int count;
}BFSQueue;

void InitBFSQueue(BFSQueue *BFSQ)  //队列初始化
{
	BFSQ->front=NULL;  
	BFSQ->rear=NULL; 
	BFSQ->count=0;
}
int EmptyBFSQueue(BFSQueue *BFSQ) //空
{
	return BFSQ->count==0;
}

void AddBFSQueue(BFSQueue *BFSQ,int num)  //插入
{
	QNode *np=(QNode *)malloc(sizeof(QNode));
	np->key=num;
	np->next=NULL;
      //BFSQ->count++;

	if(!EmptyBFSQueue(BFSQ))  // 队列非空
	{		
		BFSQ->rear->next=np;
	    BFSQ->rear=np;
	}
	else                      // 队列空
	{
		BFSQ->rear=np;
		BFSQ->front=np;
	}
	BFSQ->count++;
}
int DelBFSQueue(BFSQueue *BFSQ)  //删除
{
	int temp;
	QNode *tp=(QNode *)malloc(sizeof(QNode));
	if(!EmptyBFSQueue(BFSQ)) //队列非空
	{
	      //BFSQ->count--;  //注意,必须在队列判定之后增加或减小count的值///
		tp=BFSQ->front;
		temp=tp->key;
		if(BFSQ->count==1)  //出队后队列为空
		{
			BFSQ->rear=NULL;
			BFSQ->front=NULL;
		}
		else  //出队后队列非空
		{
			BFSQ->front=tp->next;
		}        
		BFSQ->count--;
		free(tp);  //释放暂存指针

		return temp;
	}
	else
		return NULL;
}

                
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值