基于C语言的队列操作(包含完整代码)

队列和链表,栈一样都属于线性表,队列的基本操作与链表类似,队列就是操作受限的链表,队列的特性是先进先出.

首先需要两个头文件#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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值