实 验 四 报 告
一、实验目的
1.掌握队列的定义、特点和逻辑结构,理解队列的抽象数据类型。
2.熟练掌握循环队列的结构类型定义、特点和基于循环队列的基本运算的实现。熟练掌握链3.队列的结构类型定义、特点和基于链队列的基本运算的实现。掌握队列的应用。
二、实验内容
1.编写循环队列基本运算的算法。假设此循环队列中只设 rear 和 length 来分别指示队尾元素的位置和队中元素的个数,试给出判别此循环队列的队满、队空、出队和入队的算法,要求出队时返回队头元素。
#include <stdio.h>
#define MAX_SIZE 100
typedef struct {
int items[MAX_SIZE];
int rear;
int length;
} Queue;
void init_queue(Queue *q) {
q->rear = -1;
q->length = 0;
}
int is_full(Queue *q) {
return q->length == MAX_SIZE;
}
int is_empty(Queue *q) {
return q->length == 0;
}
int dequeue(Queue *q) {
int front_element = q->items[0];
for (int i = 0; i < q->length - 1; i++) {
q->items[i] = q->items[i + 1];
}
q->length--;
q->rear--;
return front_element;
}
void enqueue(Queue *q, int item) {
if (is_full(q)) {
printf("Queue is full.\n");
return;
}
q->items[(q->rear + 1) % MAX_SIZE] = item;
q->rear++;
q->length++;
}
int main() {
Queue q;
init_queue(&q);
enqueue(&q, 1);
enqueue(&q, 2);
enqueue(&q, 3);
while (!is_empty(&q)) {
printf("Dequeued: %d\n", dequeue(&q));
}
return 0;
}
2.请编写一个完整的程序,使用顺序表实现以下任务。
(1)产生50个1~100的随机整数,将其中的偶数依次保存到顺序表中。
(2)输出顺序表的所有元素,并求顺序表的长度。
(3)在顺序表中指定位置 i 处,插入一个新产生1~100的随机整数。
(4)删除顺序表中值为 x 的结点或指定位置 i 的结点。
(5)将顺序表按升序排列,并输出排序结果。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node* next;
} Node;
typedef struct {
Node* front;
Node* rear;
} Queue;
void init_queue(Queue* q) {
q->front = NULL;
q->rear = NULL;
}
void enqueue(Queue* q, int item) {
Node* new_node = (Node*)malloc(sizeof(Node));
new_node->data = item;
new_node->next = NULL;
if (q->rear == NULL) {
q->front = new_node;
q->rear = new_node;
}
else {
q->rear->next = new_node;
q->rear = new_node;
}
Node* current = q->front;
while (current != NULL) {
printf("%d ", current->data);
current = current->next;
}
printf("\n");
}
int dequeue(Queue* q) {
if (q->front == NULL) {
printf("Queue is empty.\n");
return -1;
}
int front_element = q->front->data;
Node* temp = q->front;
q->front = q->front->next;
free(temp);
Node* current = q->front;
while (current != NULL) {
printf("%d ", current->data);
current = current->next;
}
printf("\n");
return front_element;
}
int main() {
Queue q;
init_queue(&q);
int input;
do {
printf("Enter a number (0 to exit): ");
scanf("%d", &input);
if (input == 0) {
break;
}
else if (input % 2 == 0) {
enqueue(&q, input);
}
else {
dequeue(&q);
}
} while (1);
return 0;
- 假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾结点,但不设头指针,请编写相应的入队和出队算法。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构
struct Node {
int data;
struct Node* next;
};
// 定义队列结构
struct Queue {
struct Node* rear; // 队尾指针
};
// 初始化队列
void initQueue(struct Queue* queue) {
queue->rear = NULL;
}
// 入队操作
void enqueue(struct Queue* queue, int value) {
struct Node* new_node = (struct Node*)malloc(sizeof(struct Node));
if (new_node == NULL) {
exit(1); // 内存分配失败
}
new_node->data = value;
new_node->next = NULL;
if (queue->rear == NULL) {
new_node->next = new_node; // 新节点自环
queue->rear = new_node;
}
else {
new_node->next = queue->rear->next;
queue->rear->next = new_node;
queue->rear = new_node;
}
}
// 出队操作
int dequeue(struct Queue* queue) {
if (queue->rear == NULL) {
printf("Queue is empty\n");
return -1;
}
struct Node* front = queue->rear->next; // 队首节点
int value = front->data;
if (front == queue->rear) {
queue->rear = NULL;
}
else {
queue->rear->next = front->next;
}
free(front); // 释放出队节点的内存空间
return value;
}
int main() {
struct Queue queue;
initQueue(&queue); // 初始化队列
enqueue(&queue, 1);
enqueue(&queue, 2);
enqueue(&queue, 3);
printf("%d\n", dequeue(&queue)); // 输出: 1
printf("%d\n", dequeue(&queue)); // 输出: 2
printf("%d\n", dequeue(&queue)); // 输出: 3
printf("%d\n", dequeue(&queue)); // 输出: Queue is empty
return 0;
}
三、实验心得:
在本次实验中,我们通过学习和实践掌握了队列的基本概念和原理。首先,我深入理解了队列的定义、特点和逻辑结构,以及队列作为一种抽象数据类型的重要性。通过与队列相关的诸多例子和练习,我对队列的本质有了更清晰的认识。
其次,我熟练掌握了循环队列和链队列的结构类型定义、特点和基本运算的实现方法。循环队列的环形结构使得队列的操作更为高效,而链队列则能够非常灵活地处理动态数据。通过实践操作,我更加熟悉了这两种队列结构的操作方法,并能够应用于实际问题中。
最后,在实验中我也意识到了队列在实际应用中的重要性,比如在计算机程序中的任务调度、缓冲管理等方面都能发挥重要作用。通过本次实验的学习,我不仅提升了对队列的理论认识,同时也磨练了自己对数据结构的实际操作能力,为今后进一步学习和研究数据结构打下了坚实的基础。