mirror of
https://github.com/Didnelpsun/CS408.git
synced 2026-06-17 07:27:12 +08:00
更新队列
This commit is contained in:
@@ -141,12 +141,16 @@
|
||||
<ItemGroup>
|
||||
<ClCompile Include="head.h" />
|
||||
<ClCompile Include="main.c" />
|
||||
<ClCompile Include="sequence_stack.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="double_link_list.h" />
|
||||
<ClInclude Include="link_list.h" />
|
||||
<ClInclude Include="link_queue.h" />
|
||||
<ClInclude Include="link_stack.h" />
|
||||
<ClInclude Include="sequence_list.h" />
|
||||
<ClInclude Include="static_link_list.h" />
|
||||
<ClInclude Include="sequence_queue.h" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
|
||||
@@ -21,6 +21,9 @@
|
||||
<ClCompile Include="main.c">
|
||||
<Filter>源文件</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="sequence_stack.h">
|
||||
<Filter>头文件</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="link_list.h">
|
||||
@@ -29,5 +32,20 @@
|
||||
<ClInclude Include="sequence_list.h">
|
||||
<Filter>头文件</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="double_link_list.h">
|
||||
<Filter>头文件</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="link_stack.h">
|
||||
<Filter>头文件</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="static_link_list.h">
|
||||
<Filter>头文件</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="sequence_queue.h">
|
||||
<Filter>头文件</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="link_queue.h">
|
||||
<Filter>头文件</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
154
Code/link_queue.h
Normal file
154
Code/link_queue.h
Normal file
@@ -0,0 +1,154 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "head.h"
|
||||
|
||||
// 链队列结点
|
||||
typedef struct LinkQueueNode {
|
||||
element_type data;
|
||||
struct LinkQueueNode* next;
|
||||
} LinkQueueNode;
|
||||
|
||||
// 链队列
|
||||
typedef struct {
|
||||
// 队列的队头指针和队尾指针
|
||||
LinkQueueNode* front, * rear;
|
||||
} LinkQueue;
|
||||
|
||||
// 初始化带头节点链队列
|
||||
int InitLinkQueueWithHead(LinkQueue* queue) {
|
||||
// 初始化时队头指针和队尾指针都指向头结点
|
||||
queue->front = queue->rear = (LinkQueueNode*)malloc(sizeof(LinkQueueNode));
|
||||
if (queue->front) {
|
||||
queue->front->next = NULL;
|
||||
}
|
||||
if (queue->front == NULL || queue->rear == NULL) {
|
||||
printf("InitLinkQueueWithHead:初始化分配内存失败!");
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
// 初始化不带头节点链队列
|
||||
int InitLinkQueueWithoutHead(LinkQueue* queue) {
|
||||
// 初始化时头结点与尾结点都指向NULL
|
||||
queue->front = NULL;
|
||||
queue->rear = NULL;
|
||||
}
|
||||
|
||||
// 判断带头结点链队列是否为空
|
||||
int IsLinkQueueEmptyWithHead(LinkQueue* queue) {
|
||||
// 当队头指针和队尾指针指向同一个地方
|
||||
if (queue->front == queue->rear) {
|
||||
return 1;
|
||||
}
|
||||
else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
// 判断不带头结点链队列是否为空
|
||||
int IsLinkQueueEmptyWithoutHead(LinkQueue* queue) {
|
||||
// 当队头指针和队尾指针有一个为NULL
|
||||
if (queue->front == NULL) {
|
||||
return 1;
|
||||
}
|
||||
else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
// 带头节点链队列入队
|
||||
int EnterLinkQueueWithHead(LinkQueue* queue, element_type elem) {
|
||||
LinkQueueNode* p = (LinkQueueNode*)malloc(sizeof(LinkQueueNode));
|
||||
if (p) {
|
||||
// 数据赋值
|
||||
p->data = elem;
|
||||
// next指向NULL
|
||||
p->next = NULL;
|
||||
// 新结点插入到rear之后
|
||||
queue->rear->next = p;
|
||||
// 修改尾指针
|
||||
queue->rear = p;
|
||||
return 0;
|
||||
}
|
||||
else {
|
||||
printf("EnterLinkQueueWithHead:插入结点建立失败!");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
// 不带头节点链队列入队
|
||||
int EnterLinkQueueWithoutHead(LinkQueue* queue, element_type elem) {
|
||||
LinkQueueNode* p = (LinkQueueNode*)malloc(sizeof(LinkQueueNode));
|
||||
if (p) {
|
||||
// 数据赋值
|
||||
p->data = elem;
|
||||
// next指向NULL
|
||||
p->next = NULL;
|
||||
// 如果是空队列插入第一个元素
|
||||
if (queue->front == NULL) {
|
||||
// 将队头指针给新建的元素
|
||||
queue->front = p;
|
||||
}
|
||||
else {
|
||||
// 新结点插入到rear之后
|
||||
queue->rear->next = p;
|
||||
}
|
||||
// 修改尾指针
|
||||
queue->rear = p;
|
||||
return 0;
|
||||
}
|
||||
else {
|
||||
printf("EnterLinkQueueWithHead:插入结点建立失败!");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
// 带头结点链队出队
|
||||
int ExitLinkQueueWithHead(LinkQueue* queue, element_type* elem) {
|
||||
// 如果是空队
|
||||
if (queue->front == queue->rear) {
|
||||
printf("ExitLinkQueueWithHead:队列已空无法出队!");
|
||||
return 1;
|
||||
}
|
||||
// 建立一个结点变量赋值为队头结点(头结点)的下一个结点
|
||||
LinkQueueNode* p = queue->front->next;
|
||||
// 返回第一个元素
|
||||
*elem = p->data;
|
||||
// 修改头结点的next指针所指向
|
||||
// 即后移一个结点
|
||||
queue->front->next = p->next;
|
||||
// 如果是最后一个结点出队
|
||||
if (queue->rear == p) {
|
||||
queue->rear = queue->front;
|
||||
}
|
||||
// 对malloc申请的空间释放
|
||||
free(p);
|
||||
return 0;
|
||||
}
|
||||
|
||||
// 不带头结点链队出队
|
||||
int ExitLinkQueueWithoutHead(LinkQueue* queue, element_type* elem) {
|
||||
// 如果是空队
|
||||
if (queue->front == NULL) {
|
||||
printf("ExitLinkQueueWithoutHead:队列已空无法出队!");
|
||||
return 1;
|
||||
}
|
||||
// 建立一个结点变量赋值为队头结点
|
||||
LinkQueueNode* p = queue->front;
|
||||
// 返回第一个元素
|
||||
*elem = p->data;
|
||||
// 修改头结点的指针所指向
|
||||
// 即后移一个结点
|
||||
queue->front = p->next;
|
||||
// 如果是最后一个结点出队
|
||||
if (queue->rear == p) {
|
||||
// 队头队尾指针都赋值为NULL
|
||||
queue->front = NULL;
|
||||
queue->rear = NULL;
|
||||
}
|
||||
// 对malloc申请的空间释放
|
||||
free(p);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -26,4 +26,7 @@
|
||||
|
||||
当如果我们必须保证所有的存储空间被利用,可以定义一个size表明队列当前的长度,就可以完全利用所有空间。
|
||||
|
||||
同理我们可以定义一个int类型的tag,当进行删除操作就置tag为0,插入操作时置tag为1,只有删除才可能队空,只有插入才可能队满,所以就可以根据这个来判断。
|
||||
同理我们可以定义一个int类型的tag,当进行删除操作就置tag为0,插入操作时置tag为1,只有删除才可能队空,只有插入才可能队满,所以就可以根据这个来判断。
|
||||
|
||||
## 链队
|
||||
|
||||
|
||||
Reference in New Issue
Block a user