带头结点的链队列的基本操作
时间: 2023-10-17 18:05:37 浏览: 127
带头结点的链队列是一种链式存储结构,它通过一个头结点来标识队列的头和尾。下面是带头结点的链队列的基本操作:
1.初始化操作
带头结点的链队列的初始化操作就是创建一个头结点,并让头结点的 next 指针指向 NULL。代码实现如下:
```
typedef struct Node {
int data;
struct Node* next;
} Node;
typedef struct {
Node* front; // 队头指针
Node* rear; // 队尾指针
} LinkQueue;
void InitQueue(LinkQueue* Q) {
Q->front = Q->rear = (Node*)malloc(sizeof(Node));
Q->front->next = NULL;
}
```
2.入队操作
在带头结点的链队列中,新元素需要插入到队尾,因此需要修改队尾指针的指向。代码实现如下:
```
void EnQueue(LinkQueue* Q, int x) {
Node* s = (Node*)malloc(sizeof(Node));
s->data = x;
s->next = NULL;
Q->rear->next = s;
Q->rear = s;
}
```
3.出队操作
出队操作需要删除队头元素,并修改队头指针的指向。代码实现如下:
```
int DeQueue(LinkQueue* Q) {
if (Q->front == Q->rear) return -1; // 队列为空
Node* p = Q->front->next;
int x = p->data;
Q->front->next = p->next;
if (Q->rear == p) Q->rear = Q->front; // 如果队列只有一个元素,删除后队列为空
free(p);
return x;
}
```
4.获取队头元素
获取队头元素需要先判断队列是否为空,如果不为空就返回队头元素的值。代码实现如下:
```
int GetHead(LinkQueue* Q) {
if (Q->front == Q->rear) return -1; // 队列为空
Node* p = Q->front->next;
return p->data;
}
```
5.判断队列是否为空
判断队列是否为空只需要判断头结点的 next 指针是否为 NULL。代码实现如下:
```
int IsEmpty(LinkQueue* Q) {
return Q->front == Q->rear;
}
```
阅读全文