队列和链表,栈一样都属于线性表,队列的基本操作与链表类似,队列就是操作受限的链表,队列的特性是先进先出.
首先需要两个头文件#include <stdio.h>和#include <stdlib.h>
1.定义结构体
typedef struct Node//定义结构体
{
int data;//数据域
struct Node *next;//指针域
}Node;//将struct Node重写为Node
2.初始化队列(指针函数)
Node *initQueue()
{
Node *Q = (Node *)malloc(sizeof(Node));//申请新的内存空间
Q->data = 0;//初始节点内的data代表此队列有多少元素
Q->next = NULL;//Q的后继指向空
return Q;//返回Q
}
3.入队操作(与链表尾插法类似)
void enQueue(Node *Q,int data)
{
int i;
Node *node = (Node *)malloc(sizeof(Node));//申请新的内存空间
Node *q = Q;//定义新的要移动的指针,此指针要找到队列末尾节点
node->data = data;//将元素写入新节点
while(q->next!=NULL)//通过判断节点后继是否为空来找最后的节点
{
q = q->next;
}
node->next = q->next;//新节点指向末尾节点的后继(与链表操作类似)
q->next = node;//将新节点插入末尾节点后继
Q->data++;//头节点内的data域加一
}
4.判空
int isEmpty(Node *Q)
{
if(Q->data==0||Q->next==NULL)//头节点data域为0或者头节点的后继为空
return 1;
else
return 0;
}
5.出队操作
int deQueue(Node *Q)
{
Node *node = Q->next;//定义一个节点指向头节点的下一个节点(第一个节点)
int data;//接收出队的元素
if(isEmpty(Q))//判空
{
printf("队列为空!\n");
return -1;
}
else
{
Q->next = node->next;//头节点跳过第一个节点指向第二个节点
Q->data--;//队列元素总数减一
data = node->data;//取出将要出队的元素值
free(node);//释放第一个节点
return data;//返回要出队的元素
}
}
6.遍历输出
void printQueue(Node *Q)
{
Q = Q->next;//头节点的下一个节点才是第一个节点
while(Q)//空节点则退出循环
{
printf("%d ",Q->data);//打印输出队列中的元素
Q = Q->next;//Q往后走
}
printf("\n");
}
7.主函数验证
int main()
{
int i,j;
Node *Q = initQueue();//初始化队列
for(i=0;i<=5;i++)
enQueue(Q,i);//验证入队函数
printQueue(Q);//验证遍历输出函数
j = deQueue(Q);//验证出队函数
printf("%d\n",j);
printQueue(Q);
return 0;
}