/*链队列存储结构(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);
}
分享到:
相关推荐
│ │ 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"文件中,很可能包含了链队的C语言或类似语言的实现代码。这些代码可能包括了上述操作的函数定义,如`initQueue()`, `enqueue()`, `dequeue()`, `isEmpty()`, `getFront()`以及`getSize()`等。...
实验中,我们使用C语言实现了链队列和循环队列的基本操作,包括入队、出队、队首元素获取、队列长度获取等。 四、结论 本实验报告通过链队列和循环队列数据结构的实验,验证了链队列和循环队列的正确性和可靠性。...
链式队列(LinkQueue.h) 链式队列是基于链表实现的队列数据结构,与顺序队列类似,但更适合处理大量数据的情况。 ### 9. 优先级队列(PriorityQueue.h) 优先级队列是一种特殊类型的队列,其中每个元素都有一个...
在**源程序文件清单**中,包含了头文件、源文件,如`AlGraph.h`定义了图的类型,`LinkQueue.h`定义了队列,`BFSearch.cpp`实现了广度优先遍历算法,`GenerateDeG.cpp`和`GenerateUnG.cpp`分别用于生成有向图和无向图...
10. **内存分配(malloc.h)**:C语言中的`malloc.h`头文件包含内存动态分配的函数,如`malloc()`,在程序中可能用于创建堆栈和队列等数据结构。 11. **函数声明**:`#include <stdio.h>` 包含标准输入输出函数,如...
本实验报告的主要目的是掌握队列的基本操作,包括链接存储队列的进队和出队等基本操作,以及环形队列的进队和出队等基本操作。通过本实验,学生将加深对队列结构的理解,逐步培养解决实际问题的编程能力。 实验目的...
3. **建立链队列并实现元素入队**:创建一个链队列,并将元素`4`、`5`、`7`、`6`、`8`依次入队,以展示链队列的构建与基本操作。 ```plaintext 入队元素: 4 -> 5 -> 7 -> 6 -> 8 ``` 4. **实现元素出队**:...
1. **链队列的存储结构**:定义了一个`LinkQueueNode`类型用于表示链队列中的节点,每个节点包含数据域`data`和指向下一个节点的指针域`next`。此外,还定义了一个`LinkQueue`类型,其中包含了指向队首的指针`front`...
**队列**部分,有单链队列(`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)` - **初始化队列**...