设以不带头结点的循环链表表示队列,并且只设一个指针指向队尾结点,但不设头指针。用C++编写相应的入队和出队程序。
时间: 2024-04-30 09:01:53 浏览: 10
入队程序:
```c
void enqueue(Node **rear, int data) {
Node *new_node = (Node *) malloc(sizeof(Node));
new_node->data = data;
if (*rear == NULL) { // 队列为空
*rear = new_node;
new_node->next = new_node;
} else {
new_node->next = (*rear)->next;
(*rear)->next = new_node;
*rear = new_node;
}
}
```
出队程序:
```c
int dequeue(Node **rear) {
if (*rear == NULL) {
printf("队列为空!");
exit(1);
}
Node *head = (*rear)->next;
int data = head->data;
if (*rear == head) { // 队列只有一个元素
*rear = NULL;
} else {
(*rear)->next = head->next;
}
free(head);
return data;
}
```
相关问题
用c++编写设以不带头结点的循环链表表示队列,并且只设一个指针指向队尾结点,但不设头指针
,编写队列的入队操作和出队操作的代码。
可以使用如下代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 队列结点的结构体
typedef struct Node {
int data;
struct Node *next;
} Node;
// 队列的结构体
typedef struct {
Node *rear; // 队尾指针
} Queue;
// 初始化队列
void initQueue(Queue *q) {
q->rear = NULL;
}
// 入队操作
void enqueue(Queue *q, int data) {
// 创建新结点
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = data;
newNode->next = NULL;
// 如果队列为空,新结点既是队首结点,也是队尾结点
if (q->rear == NULL) {
q->rear = newNode;
newNode->next = newNode;
} else {
// 新结点插入到队尾
newNode->next = q->rear->next;
q->rear->next = newNode;
q->rear = newNode;
}
}
// 出队操作
int dequeue(Queue *q) {
// 如果队列为空,返回 -1 表示出错
if (q->rear == NULL) {
return -1;
}
Node *delNode = q->rear->next;
int data = delNode->data;
// 如果队列只有一个结点,出队后队列为空
if (delNode == q->rear) {
q->rear = NULL;
} else {
// 删除队首结点
q->rear->next = delNode->next;
}
free(delNode);
return data;
}
int main() {
Queue q;
initQueue(&q);
enqueue(&q, 1);
enqueue(&q, 2);
enqueue(&q, 3);
int data = dequeue(&q);
while (data != -1) {
printf("%d ", data);
data = dequeue(&q);
}
return 0;
}
```
在这个代码中,队尾指针 `rear` 指向队尾结点,因为是循环链表,所以队尾结点的 `next` 指针指向队首结点。当队列为空时,队尾指针为 `NULL`。每次入队时,新结点插入到队尾,队尾指针指向新结点,保持队尾指针始终指向队尾结点。每次出队时,删除队首结点,如果队列为空,队尾指针设置为 `NULL`。
以不带头结点的循环链表表示队列,并且只设一个指针指向队尾结点,但不设头指针。编写相应的入队和出队程序。
循环链表表示队列时,我们可以使用一个指针 `rear` 来指向队尾结点。队列为空时,`rear` 指向 `NULL`。
入队操作时,我们新建一个结点 `new_node`,将数据存入结点中,然后将 `new_node` 插入到队尾。具体步骤如下:
1. 如果队列为空,将 `rear` 指向新结点,然后将结点的 `next` 指针指向自身,表示该结点是队列中唯一的结点;
2. 如果队列不为空,将新结点的 `next` 指针指向 `rear->next`,然后将 `rear->next` 指向新结点,最后更新 `rear` 指针,将其指向新结点。
出队操作时,我们需要删除队头结点。具体步骤如下:
1. 如果队列为空,返回空值;
2. 如果队列只有一个结点,删除该结点,并将 `rear` 指向 `NULL`;
3. 如果队列有多个结点,删除队头结点,并将 `rear->next` 指向新的队头结点。
以下是具体的代码实现:
```c++
#include <iostream>
using namespace std;
struct Node {
int val;
Node* next;
};
Node* rear = NULL; // 队尾指针,初始值为 NULL
void enqueue(int x) {
Node* new_node = new Node;
new_node->val = x;
if (rear == NULL) { // 队列为空
rear = new_node;
new_node->next = new_node; // 指向自身
} else {
new_node->next = rear->next;
rear->next = new_node;
rear = new_node;
}
}
int dequeue() {
if (rear == NULL) { // 队列为空
return -1;
}
int val = rear->next->val;
if (rear->next == rear) { // 队列只有一个结点
delete rear;
rear = NULL;
} else {
Node* temp = rear->next;
rear->next = temp->next;
delete temp;
}
return val;
}
int main() {
enqueue(1);
enqueue(2);
enqueue(3);
cout << dequeue() << endl; // 1
cout << dequeue() << endl; // 2
enqueue(4);
enqueue(5);
cout << dequeue() << endl; // 3
cout << dequeue() << endl; // 4
cout << dequeue() << endl; // 5
cout << dequeue() << endl; // -1,队列为空
return 0;
}
```