实现链队的各种基本运算的算法
一、实验内容
编写一个程序,实现链队(假设栈中的元素类型 ElemType为char的各种基本运算,并在此基础上设计一个程序完成以下功能。
(1)初始化链队q。
(2)判断链队q是否非空。
(3)依次进链队元素a、b、c。
(4)出队一个元素,输出该元素。
(5)依次进链队元素d、e、f。
(6)输出出队序列。
(7)释放链队
二、实验目的
本实验旨在通过编写一个程序实现链队的存储结构和各种基本运算的算法,包括初始化、判断链队是否非空、进队、出队、输出出队序列以及释放链队。通过这个实验,希望学生能够深入理解链队数据结构的原理和实现方式,并且掌握链队中各种基本运算算法的设计和实现技巧。
三、实验设计方案
1.定义链队结构体
首先需要定义链队的结构体,包括一个头指针front和一个尾指针rear,以及一个用于存储队列元素的链表。头指针front指向链表的头部,尾指针rear指向链表的尾部。
2.初始化链队
初始化链队可以通过将头指针front和尾指针rear都置为NULL来实现。
3.判断链队是否非空
判断链队是否非空可以通过判断头指针front和尾指针rear是否相等来实现。如果头指针front和尾指针rear相等,则链队为空;否则,链队非空。
4.依次进队元素a、b、c
进队操作可以通过在尾指针rear处创建新节点并将其插入到链表的尾部来实现。具体步骤如下:
- 创建新节点并设置其数据为需要进队的元素。
- 将rear指针指向新节点。
- 如果队列已满,则将front指针指向新节点;否则,将front指针指向下一个节点。重复以上步骤,直到所有元素都进队。5.出队一个元素,输出该元素
出队操作可以通过遍历链表并输出当前节点的数据来实现。具体步骤如下:
- 将front指针指向下一个节点。
- 输出front指向的节点的数据。重复以上步骤,直到队列为空。6.依次进队元素d、e、f
同上,进队操作可以通过在尾指针rear处创建新节点并将其插入到链表的尾部来实现。重复步骤4中的步骤,直到所有元素都进队。
7.输出出队序列
输出出队序列可以通过遍历链表并输出每个节点的数据来实现。具体步骤如下:将front指针指向下一个节点,输出front指向的节点的数据。重复以上步骤,直到队列为空。
四、代码实现
#include<stdio.h>
#include<stdlib.h>
typedef struct qnode{
char data;
struct qnode *next;
}DataNode;
typedef struct {
DataNode *front;
DataNode *rear;
}LinkQuNode;
//初始化队列
void InitQueue(LinkQuNode *&q){
q=(LinkQuNode *)malloc(sizeof(LinkQuNode));
q->front=q->rear=NULL;
}
//销毁队列
void DestroyQueue(LinkQuNode *&q){
DataNode *pre=q->front,*p;
if(pre!=NULL){
p=pre->next;
while(p!=NULL){
free(pre);
pre==p;
p=p->next;
}
free(pre);
}
free(q);
}
//判断队列空
bool QueueEmpty(LinkQuNode *q){
return(q->rear==NULL);
}
//进队列
void enQueue(LinkQuNode *&q,char e){
DataNode *p;
p=(DataNode *)malloc(sizeof(DataNode));
p->data=e;
p->next=NULL;
if(q->rear==NULL) q->front=q->rear=p;
else{
q->rear->next=p;
q->rear=p;
}
}
//出队列
bool deQueue(LinkQuNode *&q,char &e){
DataNode *t;
if(q->rear==NULL)return false;
t=q->front;
if(q->rear==q->front) q->front=q->rear=NULL;
else q->front=q->front->next;
e=t->data;
free(t);
return true;
}
int main(){
LinkQuNode *s;
char e;
//1初始化队列
InitQueue(s);
printf("1、初始化队列:完成!\n");
//2判断队列是否为空
printf("2、判断队列是否为空:");
QueueEmpty(s);
if(QueueEmpty(s))printf("队列为空!\n");
else printf("队列非空!\n");
//3依次进队列元素a、b、c、d、e
printf("3、依次进队列元素a、b、c、d、e:");
char a[6]={'a','b','c','d','e','f'};
for(int i=0;i<3;i++){
enQueue(s,a[i]);
printf("%c\t",a[i]);
}
printf("\n");
//4出队一个元素,并输出
printf("4、出队一个元素,该元素为:");
deQueue(s,e);
printf("%c\n",e);
//5依次进队列元素d、e、f
printf("5、依次进队列元素d、e、f:");
for(int i=3;i<6;i++){
enQueue(s,a[i]);
printf("%c\t",a[i]);
}
printf("\n");
//6输出出队列序列
printf("5、输出出队列序列:");
while(s->front!=NULL){
deQueue(s,e);
printf("%c\t",e);
}
printf("\n");
//7释放栈
printf("7、释放队列:完成!");
DestroyQueue(s);
return 0;
}