链队列的基本接口实现
基本接口实现代码
#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("\n"); } //测试函数 int main(){ int i,e,a,j; LQueue Q; do{ printf("1.初始化链队列\n"); printf("2.销毁链队列\n"); printf("3.判断链队列是否为空\n"); printf("4.链队列的长度\n"); printf("5.返回链队列的队头元素\n"); printf("6.在队尾插入元素\n"); printf("7.删除队头元素\n"); printf("8.遍历并打印队列元素\n"); printf("请输入你要进行的操作:\n"); scanf("%d",&i); switch(i){ case 1: if(InitQueue_LQ(Q)){ printf("初始化成功\n"); printf("请输入5个元素:\n"); for(j=0;j<5;j++){ scanf("%d",&a); EnQueue_LQ(Q,a); } }; break; case 2: DestroyQueue_LQ(Q); printf("销毁队列成功\n"); break; case 3: if(QueueEmpty_LQ(Q)){ printf("链队列为空!\n"); }else{ printf("链队列不为空!\n"); } break; case 4: printf("链队列的长度为:%d\n",QueueLength_LQ(Q)); break; case 5: GetHead_LQ(Q,e); printf("链队列队头元素为:%d\n",e); break; case 6: printf("请输入你要插入的元素:"); scanf("%d",&e); if(EnQueue_LQ(Q,e)){ printf("插入成功\n"); } break; case 7: DeQueue_LQ(Q,e); printf("删除成功\n"); break; case 8: PrintQueue_LQ(Q); break; } }while(i>0&&i<10); return 0; }