数据结构-队列的基本操作实验报告
本实验报告的主要目的是掌握队列的基本操作,包括链接存储队列的进队和出队等基本操作,以及环形队列的进队和出队等基本操作。通过本实验,学生将加深对队列结构的理解,逐步培养解决实际问题的编程能力。
实验目的:
1. 掌握链接存储队列的进队和出队等基本操作。
2. 掌握环形队列的进队和出队等基本操作。
3. 加深对队列结构的理解,逐步培养解决实际问题的编程能力。
实验内容:
1. 编写栈的基本操作函数,包括进队函数、出队函数和输出队列中元素函数。
2. 调用上述函数实现下列操作:
(1) 调用进队函数建立一个队列。
(2) 读取队列中的第一个元素。
(3) 从队列中删除元素。
(4) 输出队列中的所有元素。
实验代码:
```c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct QNode {
int data;
struct QNode *next;
} QNode, *QueuePtr;
typedef struct {
QueuePtr front; // 队头指针
QueuePtr rear; // 队尾指针
} LinkQueue;
int InitQueue(LinkQueue &Q) {
// 构造一个空队列Q
Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));
if (!Q.front) exit(0); // 存储分配失败
Q.front->next = NULL;
return 1;
}
int EnQueue(LinkQueue &Q, int e) {
// 插入元素e,使之成为新的队尾元素
QueuePtr p;
p = (QueuePtr)malloc(sizeof(QNode));
if (!p) exit(0); // 存储分配失败
p->data = e;
p->next = NULL;
Q.rear->next = p;
Q.rear = p;
return 1;
}
int DeQueue(LinkQueue &Q, int &e) {
// 若队列不空,则删除Q 的队头元素,用e 返回其值并返回OK ;否则返回ERROR
QueuePtr p;
p = Q.front->next;
e = p->data;
Q.front->next = p->next;
if (Q.rear == p) Q.rear = Q.front; // 如果最后一个元素出队,重置Q为空队
free(p);
return 1;
}
void firstyuanshu(LinkQueue &Q) {
int e;
QueuePtr p;
p = Q.front->next;
e = p->data;
printf("%d\n", e);
}
void OutputQueue(LinkQueue &Q) {
QueuePtr p;
if (Q.front == Q.rear) printf(" 队列为空 ");
else {
p = Q.front->next;
while (p) {
printf("%d\n", p->data);
p = p->next;
}
}
}
void main() {
int e, a, b, i;
LinkQueue Q;
InitQueue(Q);
int x = 1, select;
printf(" 队列的基本操作\n");
printf(" 1.调用进队函数简历一个队列:\n ");
printf("2. 读取函数中的第一个元素:\n");
printf(" 3.从队列中删除元素:\n ");
printf(" 4. 输出队列中的所有元素:\n ");
printf(" 5. 退出\n ");
while (x) {
printf(" 请选择: ");
scanf("%d", &select);
switch (select) {
case 1:
printf(" 请输入需要进队的元素的个数:\n");
scanf("%d", &b);
for (i = 0; i < b; i++) {
printf(" 请输入进队数字:\n");
scanf("%d", &e);
EnQueue(Q, e);
}
break;
case 2:
if (Q.front == Q.rear) printf(" 该队列为空队列,请先创建以个队列再执行该操作\n");
// ...
}
}
}
```
实验结果:
通过本实验,我们可以掌握队列的基本操作,包括进队、出队和输出队列中元素等操作。同时,我们也可以加深对队列结构的理解,逐步培养解决实际问题的编程能力。