C语言实现数据结构链式队列
#include<stdio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR -1
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int QElemType;
typedef int status;
typedef struct QNode{
QElemType data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
status InitQueue(LinkQueue *Q); //构建一个空队列
status DestroyQueue(LinkQueue *Q); //销毁队列
status ClearQueue(LinkQueue *Q); //清空队列
status QueueEmpty(LinkQueue Q); //判断队列是否为空
int QueueLength(LinkQueue Q); //返回队列长度
status GetHead(LinkQueue Q,QElemType *e); //返回队列头元素
status EnQueue(LinkQueue *Q,QElemType e); //插入队尾元素
status DeQueue(LinkQueue *Q,QElemType *e); //删除队头元素
status QueueTraverse(LinkQueue Q); //遍历队列
int main()
{
LinkQueue Q;
QElemType e;
int option;
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");
scanf("%d",&option);
switch(option)
{
case 1:{
if(InitQueue(&Q)==OK) printf("构建成功!\n");
else printf("构建失败\n");
break;
}
case 2:{
if(ClearQueue(&Q)==OK) printf("队列已清空!\n");
else printf("清空失败\n");
break;
}
case 3:{
if(QueueEmpty(Q)==TRUE) printf("队列为空!\n");
else printf("队列不为空\n");
break;
}
case 4:{
printf("队列长度为:%d\n",QueueLength(Q));
break;
}
case 5:{
GetHead(Q,&e);
printf("队列头元素为:%d\n",e);
break;
}
case 6:{
printf("输入需要插入的元素:");
scanf("%d",&e);
if(EnQueue(&Q,e)==OK) printf("插入队尾元素成功!\n");
else printf("插入失败\n");
break;
}
case 7:{
if(DeQueue(&Q,&e)==OK) printf("已删除队头元素:%d\n",e);
else printf("删除对头元素失败\n");
break;
}
case 8:{
if(QueueEmpty(Q)==TRUE) printf("列表为空\n");
else{
if(QueueTraverse(Q)==OK) printf("\n已输出队列\n");
else printf("输出失败\n");
}
break;
}
}
}while(option!=0);
DestroyQueue(&Q);
return 0;
}
status InitQueue(LinkQueue *Q)
{
(*Q).front=(*Q).rear=(QueuePtr)malloc(sizeof(QueuePtr)); //创建头结点
if(!(*Q).front) exit(OVERFLOW);
(*Q).front->next=NULL;
return OK;
}
status DestroyQueue(LinkQueue *Q)
{
while((*Q).front){
(*Q).rear=(*Q).front->next;
free((*Q).front);
(*Q).front=(*Q).rear;
}
return OK;
}
status ClearQueue(LinkQueue *Q)
{
(*Q).rear=(*Q).front;
(*Q).front->next=NULL;
return OK;
}
status QueueEmpty(LinkQueue Q)
{
if(Q.front==Q.rear)
return TRUE;
else
return FALSE;
}
int QueueLength(LinkQueue Q)
{
if(Q.front==Q.rear) return ERROR;
int length=0;
QueuePtr p=Q.front->next;
while(p!=NULL)
{
++length;
p=p->next;
}
//?------若使用length=Q.rear-Q.front获取长度 则length输出会为正确长度的两倍
return length;
}
status GetHead(LinkQueue Q,QElemType *e)
{
if(Q.front==Q.rear) return ERROR;
*e=Q.front->next->data;
return OK;
}
status EnQueue(LinkQueue *Q,QElemType e)
{
QueuePtr p=(QueuePtr)malloc(sizeof(QNode));
if(!p) exit(OVERFLOW);
p->data=e;
p->next=NULL;
(*Q).rear->next=p;
(*Q).rear=p;
return OK;
}
status DeQueue(LinkQueue *Q,QElemType *e)
{
if((*Q).front==(*Q).rear) return ERROR; //若列表为空
QueuePtr p;
p=(*Q).front->next;
if((*Q).front==(*Q).rear) return ERROR;
*e=p->data;
(*Q).front->next=p->next;
if((*Q).rear==p) (*Q).rear=(*Q).front;
free(p);
return OK;
}
status QueueTraverse(LinkQueue Q)
{
QueuePtr p=Q.front->next;
while(p!=NULL)
{
printf("\t%d",p->data);
p=p->next;
}
return OK;
}