数据结构初学之队列--用不带头结点的单链表实现链队列

前言:用不带头结点的单链表来实现链队列要比带头结点的单链表实现复杂一点,主要在初始化队列,入队时有一些区别。特别是在入队时,要根据入队的是不是第一个元素来进行讨论。

1、初始化队列,使队头指针front和队尾指针rear指向空
2、判断队空,Q.front == NULL时为空,不能用Q.front == Q.rear来判断,否则在入队操作时, 会导致Q.front == Q.rear这个条件始终成立,即队头指针和队尾指针始终同时指向新结点。
3、出队时要先判断是否队空,队空则不能出队。当链队列只有一个元素时,出对后,要将Q.rear手动指向空,否则会成为野指针(void point)。

typedef int elementType;
typedef struct LNode {
	elementType data;
	struct LNode* next;
}node;

//链队列结构描述
typedef struct {
	node* front;
	node* rear;
}linkQueue;

//链队列初始化
//不带头结点
void initQueue(linkQueue& Q) {
	Q.front = NULL;//不带头结点时指向空
	Q.rear = Q.front;
}

//判断队空
bool queueEmpty(linkQueue& Q) {
	return (Q.front == NULL);
	//注意不能用Q.front == Q.rear来判断
}

//取队头元素
void queueFront(linkQueue& Q, elementType& x) {
	if (queueEmpty(Q))
		cout << "队列为空,无法取队头元素!";
	else {
		x = Q.front->data;
	}
}

//入队
void enQueue(linkQueue& Q, elementType x) {
	node* s = new node;
	s->data = x;
	s->next = NULL;
	//判断入队的是否是第一个元素
	if (queueEmpty(Q)) {
		Q.front = s;
		Q.rear = s;
	}
	else {
		Q.rear->next = s;
		Q.rear = s;
	}
}

//出队
void outQueue(linkQueue& Q, elementType& x) {
	node* s;
	if (queueEmpty(Q)) {
		cout << "当前队空,无法执行出队操作!" <<endl;
	}
	else {
		s = Q.front;
		Q.front = s->next;
		x = s->data;
		delete s;

		if (Q.front == NULL)//防止野指针void point
			Q.rear = Q.front;
	}
}

//打印链队列
void printQueue(linkQueue& Q) {
	node* p = Q.front;

	cout << "打印链队列" << endl;
	while (p) {
		cout << p->data << " ";
		p = p->next;
	}
	cout << endl;
}

//求队列中的元素个数
int queueLen(linkQueue& Q) {
	node* p = Q.front;
	int cnt = 0;
	while (p) {
		cnt++;
		p = p->next;
	}

	return cnt;
}

  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值