基本接口实现代码
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define IBFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType; /* 元素类型为int类型*/
// 链队列类型
typedef struct LQNode{
ElemType data;
struct LQNode *next;
}LQNode,*QueuePtr; //结点及其指针类型
typedef struct{
QueuePtr front; //队头指针
QueuePtr rear; //队尾指针
}LQueue; //链队列
//接口
//初始化队列
Status InitQueue_LQ(LQueue &Q);
// 销毁队列
Status DestroyQueue_LQ(LQueue &Q);
//判断队列是否为空
Status QueueEmpty_LQ(LQueue Q);
//返回队列的长度
int QueueLength_LQ(LQueue Q);
//返回队头元素
Status GetHead_LQ(LQueue Q, ElemType &e);
// 在队列Q的队尾插入元素
Status EnQueue_LQ(LQueue &Q,ElemType e);
//删除队头元素
Status DeQueue_LQ(LQueue &Q,ElemType &e);
//遍历打印队列
void PrintQueue_LQ(LQueue Q);
//接口实现代码
//1.初始化队列
Status InitQueue_LQ(LQueue &Q){
Q.front=Q.rear=(LQNode *)malloc(sizeof(LQNode));
if(Q.front==NULL) return OVERFLOW;
Q.front->next= NULL; //Q.front=Q.rear=NULL;
return OK;
}
//2.销毁队列
Status DestroyQueue_LQ(LQueue &Q){
int e;
while (!QueueEmpty_LQ(Q)){
DeQueue_LQ(Q,e);
}
return OK;
}
//3.判断是否为空
Status QueueEmpty_LQ(LQueue Q){
return Q.front==NULL&&Q.rear==NULL; //实际上只须判断队头指针 是否为空即可
}
//4.求队列的长度
int QueueLength_LQ(LQueue Q){
int length=0;
LQNode *pt;
pt=Q.front->next;
while(pt !=Q.rear->next){
length++;
pt=pt->next;
}
return length;
}
//5.返回队头元素
Status GetHead_LQ(LQueue Q, ElemType &e){
e=Q.front->next->data;
}
//6.入队
Status EnQueue_LQ(LQueue &Q,ElemType e){
LQNode *p;
p=(LQNode *)malloc(sizeof(LQNode));
if(NULL==p) return OVERFLOW;
p->data=e;
p->next = NULL;
if(NULL==Q.front){
Q.front=p; //将e插入空队列
}else{
Q.rear->next=p; //e插入非空队列
}
Q.rear=p; //队尾指针指向新的队尾
}
//7.出队
Status DeQueue_LQ(LQueue &Q,ElemType &e){
LQNode *p;
if(NULL==Q.front) return ERROR;
p=Q.front; //指向头结点
e=p->data; //保存头结点数据
Q.front=p->next;
if(Q.rear==p) Q.rear==NULL; //队列只有一个结点,删去后队列变空
free(p); //释放结点p
return OK;
}
//遍历打印队列
void PrintQueue_LQ(LQueue Q){
LQNode *pt;
pt=Q.front->next;
printf("链队列里元素为:");
while(pt !=Q.rear->next){
printf("%4d ",pt->data);
pt=pt->next; //最后一次执行至此时将pt置为NULL,此时不用free(pt)
}
printf("
");
}
//测试函数
int main(){
int i,e,a,j;
LQueue Q;
do{
printf("1.初始化链队列
");
printf("2.销毁链队列
");
printf("3.判断链队列是否为空
");
printf("4.链队列的长度
");
printf("5.返回链队列的队头元素
");
printf("6.在队尾插入元素
");
printf("7.删除队头元素
");
printf("8.遍历并打印队列元素
");
printf("请输入你要进行的操作:
");
scanf("%d",&i);
switch(i){
case 1:
if(InitQueue_LQ(Q)){
printf("初始化成功
");
printf("请输入5个元素:
");
for(j=0;j<5;j++){
scanf("%d",&a);
EnQueue_LQ(Q,a);
}
};
break;
case 2:
DestroyQueue_LQ(Q);
printf("销毁队列成功
");
break;
case 3:
if(QueueEmpty_LQ(Q)){
printf("链队列为空!
");
}else{
printf("链队列不为空!
");
}
break;
case 4:
printf("链队列的长度为:%d
",QueueLength_LQ(Q));
break;
case 5:
GetHead_LQ(Q,e);
printf("链队列队头元素为:%d
",e);
break;
case 6:
printf("请输入你要插入的元素:");
scanf("%d",&e);
if(EnQueue_LQ(Q,e)){
printf("插入成功
");
}
break;
case 7:
DeQueue_LQ(Q,e);
printf("删除成功
");
break;
case 8:
PrintQueue_LQ(Q);
break;
}
}while(i>0&&i<10);
return 0;
}