`
hcleon
  • 浏览: 267933 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

链队列(LinkQueue.h和LinkQueue.c) 分享

阅读更多
/*链队列存储结构(LinkQueue.h)*/
typedef struct QNode
{
QElemType data;
struct QNode *next;
}QNode, *QueuePtr;

typedef struct
{
QueuePtr front;
QueuePtr rear;
}LinkQueue;

/**************************************************/

/* 链队列的基本操作(LinkQueue.c)*/
Status InitQueue(LinkQueue *Q)
{
if ((Q->front = (QueuePtr) malloc(sizeof(QNode))) == NULL)
  exit(OVERFLOW);
Q->rear = Q->front;
Q->front->next = NULL;
return OK;
}

Status DestroyQueue(LinkQueue *Q)
{
QueuePtr p = Q->front;

while (p != Q->rear)
{
  Q->front = p->next;
  free(p);
  p = Q->front;
}
free(Q->rear);
Q->front = Q->rear = NULL;
return OK;
}

Status DestroyQueue1(LinkQueue *Q)
{
while (Q->front != NULL)
{
  Q->rear = Q->front->next;
  free(Q->front);
  Q->front = Q->rear;
}
return OK;
}

Status ClearQueue(LinkQueue *Q)
{
QueuePtr p = Q->front->next;

while(p != NULL)
{
  Q->rear = p->next;
  free(p);
  p = Q->rear;
}
Q->rear = Q->front;
Q->front->next = NULL;
return OK;
}

Status QueueEmpty(LinkQueue Q)
{
return Q.front == Q.rear;
}

int QueueLength(LinkQueue Q)
{
int len = 0;

while (Q.front != Q.rear)
{
  len++;
  Q.front = Q.front->next;
}
return len;
}

Status GetHead_Q(LinkQueue Q,QElemType *e)
{
if (!QueueEmpty(Q))
{
  *e = Q.front->next->data;
  return OK;
}
else
  return FALSE;
}

Status EnQueue(LinkQueue *Q,QElemType e)
{
QueuePtr p;

if ((p = (QueuePtr) malloc(sizeof(QNode))) == NULL)
  exit(OVERFLOW);
p->data = e;
p->next = NULL;

Q->rear->next = p;
Q->rear = p;
return OK;
}

Status DeQueue(LinkQueue *Q,QElemType *e)
{
QueuePtr p;

if (!QueueEmpty(*Q))
{
  p = Q->front->next;
  if (p == Q->rear)
   Q->rear = Q->front;
  Q->front->next = p->next;
  *e = p->data;
  free(p);
 
  return OK;
}
else
  return FALSE;
}

Status QueueTraverse(LinkQueue Q,Status(*Visit)(QElemType))
{
QueuePtr p = Q.front->next;
while (p != NULL)
{
  if (!Visit(p->data))
   return ERROR;
  p = p->next;
}
printf("\n");
return OK;
}

/***************************************************/

/*LinkQueue_Main.c 检验LinkQueue.c的主程序 */
#include"DS.h"
typedef int QElemType;
#include"LinkQueue.h"
#include"LinkQueue.c"

Status visit(QElemType i)
{
   printf("%d ",i);
   return OK;
}

void 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);
}
分享到:
评论

相关推荐

    数据结构与算法全集(C源代码+详细注释)

    │ │ LinkQueue.h │ │ Main.cpp │ │ SqStack.cpp │ │ SqStack.h │ │ Status.h │ │ VertexType.cpp │ │ VertexType.h │ │ │ ├─图的关节点 │ │ 1.txt │ │ ALGraph.cpp │ │ ALGraph.h │ │ ...

    数据结构:链队列

    `LinkQueue.h`则是头文件,可能声明了链队列的相关类型和接口。 在实际编程中,链队列常用于各种算法和系统设计,例如: 1. 操作系统中的进程调度,维护待执行任务的顺序。 2. 图形用户界面的消息队列,处理用户的...

    数据结构linkqueue

    在提供的"LinkQueue"文件中,很可能包含了链队的C语言或类似语言的实现代码。这些代码可能包括了上述操作的函数定义,如`initQueue()`, `enqueue()`, `dequeue()`, `isEmpty()`, `getFront()`以及`getSize()`等。...

    链队列和循环队列数据结构实验.pdf

    实验中,我们使用C语言实现了链队列和循环队列的基本操作,包括入队、出队、队首元素获取、队列长度获取等。 四、结论 本实验报告通过链队列和循环队列数据结构的实验,验证了链队列和循环队列的正确性和可靠性。...

    数据结构各种算法实现 (C)

    链式队列(LinkQueue.h) 链式队列是基于链表实现的队列数据结构,与顺序队列类似,但更适合处理大量数据的情况。 ### 9. 优先级队列(PriorityQueue.h) 优先级队列是一种特殊类型的队列,其中每个元素都有一个...

    图的广度优先遍历.doc

    在**源程序文件清单**中,包含了头文件、源文件,如`AlGraph.h`定义了图的类型,`LinkQueue.h`定义了队列,`BFSearch.cpp`实现了广度优先遍历算法,`GenerateDeG.cpp`和`GenerateUnG.cpp`分别用于生成有向图和无向图...

    26.C语言程序设计--停车场信息管理系统.docx

    10. **内存分配(malloc.h)**:C语言中的`malloc.h`头文件包含内存动态分配的函数,如`malloc()`,在程序中可能用于创建堆栈和队列等数据结构。 11. **函数声明**:`#include <stdio.h>` 包含标准输入输出函数,如...

    数据结构-实验4队列的基本操作.pdf

    本实验报告的主要目的是掌握队列的基本操作,包括链接存储队列的进队和出队等基本操作,以及环形队列的进队和出队等基本操作。通过本实验,学生将加深对队列结构的理解,逐步培养解决实际问题的编程能力。 实验目的...

    [栈及队列的操作]数据结构实验报告C语言源码

    3. **建立链队列并实现元素入队**:创建一个链队列,并将元素`4`、`5`、`7`、`6`、`8`依次入队,以展示链队列的构建与基本操作。 ```plaintext 入队元素: 4 -> 5 -> 7 -> 6 -> 8 ``` 4. **实现元素出队**:...

    数据结构实验-队列的相关计算

    1. **链队列的存储结构**:定义了一个`LinkQueueNode`类型用于表示链队列中的节点,每个节点包含数据域`data`和指向下一个节点的指针域`next`。此外,还定义了一个`LinkQueue`类型,其中包含了指向队首的指针`front`...

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

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

    关于二叉树的建立遍历查找程序代码

    此外,代码中还提供了判断链队列是否为空`Empty_LinkQueue()`、入队`In_LinkQueue()`和出队`Out_LinkQueue()`的操作,这些都是层次遍历所必需的辅助函数。 总结起来,这段代码涵盖了二叉树的基本操作,包括建立、...

    网络爬虫详解

    例如,路径:A-F-G, E-H-I, B, C, D。 2. 宽度优先遍历(BFS):优先抓取起始页的全部链接,然后逐步扩展。如路径:A-B-C-D-E-F, G, H, I。 四、PageRank策略 PageRank是Google搜索引擎早期用于网页排序的关键...

    数据结构层序中序遍历构建二叉树

    定义了链队列的相关结构体,用于存储层序遍历过程中的节点信息,包括节点值、中序遍历序列的边界等信息。 3. **构建二叉树函数**:`BiTree* In_Level_CreatBiTree(int* In, int* Level, int n)` - **初始化队列**...

Global site tag (gtag.js) - Google Analytics