`

单链队列

阅读更多
 /* c3-2.h 单链队列--队列的链式存储结构 */
 typedef struct QNode
 {
   QElemType data;
   struct QNode *next;
 }QNode,*QueuePtr;

 typedef struct
 {
   QueuePtr front,rear; /* 队头、队尾指针 */
 }LinkQueue;

 

 /* bo3-2.c 链队列(存储结构由c3-2.h定义)的基本操作(9个) */
 Status InitQueue(LinkQueue *Q)
 { /* 构造一个空队列Q */
   (*Q).front=(*Q).rear=(QueuePtr)malloc(sizeof(QNode));
   if(!(*Q).front)
     exit(OVERFLOW);
   (*Q).front->next=NULL;
   return OK;
 }

 Status DestroyQueue(LinkQueue *Q)
 { /* 销毁队列Q(无论空否均可) */
   while((*Q).front)
   {
     (*Q).rear=(*Q).front->next;
     free((*Q).front);
     (*Q).front=(*Q).rear;
   }
   return OK;
 }

 Status ClearQueue(LinkQueue *Q)
 { /* 将Q清为空队列 */
   QueuePtr p,q;
   (*Q).rear=(*Q).front;
   p=(*Q).front->next;
   (*Q).front->next=NULL;
   while(p)
   {
     q=p;
     p=p->next;
     free(q);
   }
   return OK;
 }

 Status QueueEmpty(LinkQueue Q)
 { /* 若Q为空队列,则返回TRUE,否则返回FALSE */
   if(Q.front==Q.rear)
     return TRUE;
   else
     return FALSE;
 }

 int QueueLength(LinkQueue Q)
 { /* 求队列的长度 */
   int i=0;
   QueuePtr p;
   p=Q.front;
   while(Q.rear!=p)
   {
     i++;
     p=p->next;
   }
   return i;
 }

 Status GetHead_Q(LinkQueue Q,QElemType *e) /* 避免与bo2-6.c重名 */
 { /* 若队列不空,则用e返回Q的队头元素,并返回OK,否则返回ERROR */
   QueuePtr p;
   if(Q.front==Q.rear)
     return ERROR;
   p=Q.front->next;
   *e=p->data;
   return OK;
 }

 Status EnQueue(LinkQueue *Q,QElemType e)
 { /* 插入元素e为Q的新的队尾元素 */
   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)
 { /* 若队列不空,删除Q的队头元素,用e返回其值,并返回OK,否则返回ERROR */
   QueuePtr p;
   if((*Q).front==(*Q).rear)
     return ERROR;
   p=(*Q).front->next;
   *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(*vi)(QElemType))
 { /* 从队头到队尾依次对队列Q中每个元素调用函数vi()。一旦vi失败,则操作失败 */
   QueuePtr p;
   p=Q.front->next;
   while(p)
   {
     vi(p->data);
     p=p->next;
   }
   printf("\n");
   return OK;
 }

 

 /* main3-2.c 检验bo3-2.c的主程序 */
 #include"c1.h"
 typedef int QElemType;
 #include"c3-2.h"
 #include"bo3-2.c"

 void visit(QElemType i)
 {
   printf("%d ",i);
 }

 int main()
 {
   int i;
   QElemType d;
   LinkQueue q;
   i=InitQueue(&q);
   if(i)
     printf("成功地构造了一个空队列!\n");
   printf("是否空队列?%d(1:空 0:否)  ",QueueEmpty(q));
   printf("队列的长度为%d\n",QueueLength(q));
   EnQueue(&q,-5);
   EnQueue(&q,5);
   EnQueue(&q,10);
   printf("插入3个元素(-5,5,10)后,队列的长度为%d\n",QueueLength(q));
   printf("是否空队列?%d(1:空 0:否)  ",QueueEmpty(q));
   printf("队列的元素依次为:");
   QueueTraverse(q,visit);
   i=GetHead_Q(q,&d);
   if(i==OK)
     printf("队头元素是:%d\n",d);
   DeQueue(&q,&d);
   printf("删除了队头元素%d\n",d);
   i=GetHead_Q(q,&d);
   if(i==OK)
     printf("新的队头元素是:%d\n",d);
   ClearQueue(&q);
   printf("清空队列后,q.front=%u q.rear=%u q.front->next=%u\n",q.front,q.rear,q.front->next);
   DestroyQueue(&q);
   printf("销毁队列后,q.front=%u q.rear=%u\n",q.front, q.rear);
   return 0;
 }

 

分享到:
评论

相关推荐

    简单的数据结构单链队列的VC实现

    单链队列是一种常用的数据结构,它在计算机科学中扮演着重要的角色,特别是在处理序列操作时。本节我们将深入探讨单链队列的概念、它的实现原理以及如何在VC6.0环境下进行具体实现。 首先,我们需要理解数据结构中...

    数据结构 单链队列算法的实现

    /*作者:一条傻龙 *名称:单链队列 *编译环境:vc++ 6.0 *使用语言:c *功能:构造一个空队列,销毁队列,插入,删除,队列的建立(无法构造多个队列) *最后修改时间:2010-10-30 09:36 */

    C语言单链队列的表示与实现实例详解

    C语言中的单链队列是一种基于链表结构的数据结构,它遵循先进先出(FIFO)的原则,即最早进入队列的元素最早离开队列。单链队列使用链表作为基本数据结构,解决了数组队列可能出现的伪溢出问题,因为链式存储允许...

    用单链表和队列实现归并排序

    在标题“用单链表和队列实现归并排序”中,我们可以理解到这个实现是利用了链表和队列的数据结构。链表是一种线性数据结构,其中的元素在内存中不是顺序存储的,而是通过指针链接。队列则是一种先进先出(FIFO)的...

    病人看病模拟程序(队列的应用)

    本实验报告旨在通过设计和实现一个病人看病模拟程序,掌握单链队列存储方式的类型定义,掌握单链队列的基本运算的实现,并学会根据应用问题的需要选择合适的数据结构,掌握队列的先进先出运算规则及其在病人看病模拟...

    数据结构:链队列

    在单链队列中,每个节点只有一个指向后继节点的指针。链队列的插入操作(入队)在队尾进行,这通常涉及更新队尾指针。删除操作(出队)则在队首进行,需要更新队首指针并释放队首节点。由于链式结构的特性,这两种...

    单链表操作 和 栈、队列的应用

    单链表操作 和 栈、队列的应用 基本要求:1)用前插法建立带表头结点的单链表; 2)在该链表中统计数据值为x的结点个数。 3)在该链表中值为k的结点前插入y结点,并删除k结点,如果没有值为k的结点则把y结点插在...

    队列的程序

    本程序实现了基于链表的单链队列,具有构造、销毁、入队、出队和判断队列是否为空等基本操作。 首先,定义了队列元素的数据类型`QElemtype`,在这里是字符`char`。接着,定义了队列的链表节点结构`QNode`,包含数据...

    数据结构 队列实验报告.pdf

    此外,还具体设计了单链队列的数据结构,包括结构体QNode(表示队列节点)和LinkQueue(包含队头和队尾指针),以及对应的链队列操作函数。 总的来说,本实验报告通过理论与实践相结合,深入讲解了队列这一重要数据...

    栈和队列C语言代码栈和队列C语言代码.doc

    栈和队列C语言代码 栈和队列是计算机科学中的两个基本数据结构,栈是一种...本文详细介绍了栈和队列的C语言代码实现,包括顺序栈、链栈、顺序队列和单链队列的类型定义和操作。这些代码可以作为栈和队列的实现参考。

    Queue-using-SLL.rar_single

    标题中的"Queue-using-SLL.rar_single"表明这是一个关于使用单链表实现队列的数据压缩包。在计算机科学中,队列是一种线性数据结构,它遵循“先进先出”(FIFO,First In First Out)的原则,而单链表则是存储这种...

    数据结构实验报告-栈和队列.docx

    单链队列的存储表示则是通过链表结构,每个节点包含元素值和指向下一个节点的指针。循环队列的顺序存储表示是在数组基础上,通过巧妙地设置队头和队尾指针,使队列看起来像一个无限循环的序列。 总的来说,本实验...

    单链表,栈和队列(c的实现)

    单链表、栈和队列是计算机科学与技术领域中基础且重要的数据结构,它们在程序设计中扮演着不可或缺的角色。下面将详细讲解这些概念及其C语言实现。 首先,我们来了解一下**单链表**。单链表是一种线性数据结构,...

    使用js实现单链解决前端队列问题的方法

    总结起来,使用JavaScript实现的单链队列能够有效地处理前端的异步操作或需要顺序执行的任务,确保任务按照加入队列的顺序进行。通过自定义的`ChainQueue`类,我们可以根据具体需求调整队列的大小、添加和删除元素,...

    C语言单链表实现的队列

    在IT领域,数据结构是编程基础中的重要组成部分,而队列是一种常用且基础的数据结构,它遵循“先进先出”(FIFO)的原则。在这个场景中,我们将探讨如何使用C语言来实现一个基于单链表的队列,特别是在Linux环境下...

    数据结构实验报告-栈和队列.pdf

    13. **链式队列**:实验预习中提到了单链队列的存储表示,链式队列是另一种实现队列的方式,通过链表节点连接元素,具有灵活的存储特点,可以适应动态变化的队列长度。 综上,这个实验主要涵盖了栈这一数据结构的...

    航空客运订票系统 课程设计

    系统的核心数据结构包括两个单链表和一个单链队列: 1. **单链表结构**(`Yidingkehu`)用于存储已订票的客户信息,包含客户姓名和已订票数量。每个节点都有一个指向下一个已订票客户节点的指针。 2. **单链队列...

    严蔚敏《数据结构》源码 顺序表——二叉树

    开发环境 VS2019 由于C语言中没有引用 (&),所以这里使用的是C++,极大...LinkQueue.cpp------单链队列 C_Queue.cpp------循环队列 InitString-------顺序串 BinaryTree------二叉树 BiThrTree-------线索二叉树

    数据结构C语言描述的源码

    **队列**部分,有单链队列(`LinkQueue`)和循环队列(`SqQueue`)的定义。单链队列通过`QNode`结构体表示,包含数据和指向下一个节点的指针。循环队列使用数组实现,有头指针`front`和尾指针`rear`,以及存储空间的...

Global site tag (gtag.js) - Google Analytics