您的位置:首页 > 理论基础 > 数据结构算法

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

2020-07-14 04:50 50 查看

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

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: