博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LX链队列的基本操作
阅读量:4316 次
发布时间:2019-06-06

本文共 3646 字,大约阅读时间需要 12 分钟。

#include<stdio.h>

#include<stdlib.h>
#include<malloc.h>
#define TRUE 1
#define FALSE 0
#define NULL 0
#define OK 1
#define OVERFLOW 0
#define ERROR 0
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)//1.构建一个空队列Q
Status DestroyQueue(LinkQueue &Q)//2.销毁队列Q,Q不再存在
Status ClearQueue(LinkQueue &Q)//3.将Q清空
Status QueueEmpty(LinkQueue &Q)//4.若队列Q为空队列,则返回TRUE,否则返回FALSE
int QueueLength(LinkQueue Q)//5.求队列的长度
Status GetHead(LinkQueue Q,QElemType &e)//6.若队列不空,则用e返回Q的队头元素,并返回OK;否则返回ERROR
Status EnQueue(LinkQueue &Q,QElemType e)//7.插入元素e为新的队尾元素
Status DeQueue(LinkQueue &Q,QElemType &e)//8.若队列不空,则删除Q的队头元素,用e返回,并返回OK;否则返回ERROR
Status QueueTraverse(LinkQueue Q,visit())//9.从队头到队尾依次对Q中的每一个元素调用函数visit()。一旦visit失败,则操作失败
*/
//---------基本操作的算法描述---------
Status InitQueue(LinkQueue &Q)//1.构建一个空队列Q
{
 Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
 if(!Q.front) exit(OVERFLOW);//分配空间失败,则强制停止程序,并返回OVERFLOW
 Q.front->next=NULL;
 return OK;
}
Status DestroyQueue(LinkQueue &Q)//2.销毁队列Q,Q不再存在
{
 while(Q.front)
 {
  Q.rear=Q.front->next;//Q.rear指向Q.front的下一个节点
  free(Q.front);//释放Q.front所指的节点
  Q.front=Q.rear;//Q.front指向Q.rear的下一个节点
 }
 return OK;
}
/*
Status ClearQueue(LinkQueue &Q)//3.将Q清空
{
 DestroyQueue(&Q);
 InitQueue(&Q);
}
*/
Status ClearQueue(LinkQueue &Q)//3.将Q清空
{
 if(Q.front->next== NULL)
  return OK;
 QueuePtr s = Q.front->next,p;
 while(s)
 {
  p=s->next;
  free(s);
  s = p;
 }
 Q.rear = NULL;
 Q.front ->next = Q.rear ;
 return OK;
}
Status QueueEmpty(LinkQueue &Q)//4.若队列Q为空队列,则返回TRUE,否则返回FALSE
{
 if(Q.front== Q.rear) return TRUE;
 else return FALSE;
}
int QueueLength(LinkQueue Q)//5.求队列的长度
{
 int i=0;
 QueuePtr p=Q.front;
 while(Q.rear!=p)
 {
  i++;
  p=p->next;
 }
 return i;
}
Status GetHead(LinkQueue Q,QElemType &e)//6.若队列不空,则用e返回Q的队头元素,并返回OK;否则返回ERROR
{
 QueuePtr p=Q.front;//p指向队头指针
 if(Q.front==Q.rear)  return ERROR;
 e=p->next->data;
 return OK;
}
Status EnQueue(LinkQueue &Q,QElemType e)//7.插入元素e为新的队尾元素
{
 QueuePtr p;
 p=(QueuePtr)malloc(sizeof(QNode));//动态生成新结
 if(!p)exit(OVERFLOW);
 p->data=e;
 p->next=NULL;
 p->data=e;//将e的值赋给新结点
 p->next=NULL;//新结点的指针为空
 Q.rear->next=p;//原队尾结点的指针域为指向新结点
 Q.rear=p;//尾指针指向新结点
 return OK;
}
Status DeQueue(LinkQueue &Q,QElemType &e)//8.若队列不空,则删除Q的队头元素,用e返回,并返回OK;否则返回ERROR
{
 QueuePtr 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,void(*visit)(QElemType))//9.从队头到队尾依次对Q中的每一个元素调用函数visit()。一旦visit失败,则操作失败
{
 QueuePtr p=Q.front->next;
 while(p)
 {
  visit(p->data);//对p所指元素调用visit()
  p=p->next;
 }
 printf("\n");
 return OK;
}
void visit(QElemType e)
{
 printf("%  d",e);
}
void main()
{
 int n,a,i,k;
 QElemType d;
 LinkQueue q;
 InitQueue(q);//构造一个空栈
 printf("输入队列的元素个数:");
 scanf("%d",&n);
 printf("输入队列元素为:");
 for(i=0;i<n;i++)
 {
  scanf("%d",&a);
  EnQueue(q,a);
 }
 printf("队列的元素为:");
 QueueTraverse(q,visit);
 printf("此时队列的长度为:L=%d\n",QueueLength(q));
 k=QueueEmpty(q);
 {
  if(k)  printf("判断队列是否为空:队列为空\n");
  else printf("判断队列是否为空:队列不空\n");
 }
 GetHead(q,d);
 printf("队头元素为:d=%d\n",d);
 printf("删除队头元素:%d\n",d);
 DeQueue(q,d);
 GetHead(q,d);
 printf("删除后新的队头元素为:d=%d\n",d);
 printf("删除队头元素后队列的长度为:L=%d\n",QueueLength(q));
 ClearQueue(q);//清空队列
 printf("清空队列后q.front=%u,q.rear=%u,q.front->next=%u\n",q.front,q.rear,q.front->next);
 printf("清空队列后队列的长度为:L=%d\n",QueueLength(q));
 DestroyQueue(q);
 printf("销毁队列后,q.front=%u,q.rear=%u\n",q.front,q.rear);
 printf("销毁队列后队列的长度为:L=%d\n",QueueLength(q));
}

转载于:https://www.cnblogs.com/lianghongwei/archive/2013/05/03/3057410.html

你可能感兴趣的文章
P3901 数列找不同
查看>>
利用无线网络数据包分析无线网络安全
查看>>
MEMBER REPORT
查看>>
[HAOI2006]受欢迎的牛
查看>>
使用jquery去掉时光轴头尾部的线条
查看>>
算法(转)
查看>>
网络字节顺序
查看>>
复制mueclipse项目到eclipse
查看>>
飞扬的小鸟
查看>>
玩转TypeScript(2) --简单TypeScript类型
查看>>
Asp.net 解析json
查看>>
程序猿崛起3——这一次,我用行动说话
查看>>
201521123038 《Java程序设计》 第一周学习总结
查看>>
每天一个linux命令(20):find命令之exec
查看>>
MVC HtmlHelper用法大全
查看>>
SQL分布式查询、跨数据库查询
查看>>
python国内豆瓣源
查看>>
redux、immutablejs和mobx性能对比(三)
查看>>
jQuery实现简单而且很酷的返回顶部链接效果
查看>>
mac 终端 常用命令
查看>>