链式队列。

本文详细介绍了如何使用C语言创建链式队列,包括创建节点、初始化队头和队尾指针、判断队列是否为空、入队操作(尾插)、出队操作、打印队列、清空队列以及销毁队列等核心功能。代码示例展示了链队列的基本操作实现。
摘要由CSDN通过智能技术生成

创建链式队列需要定义两个指针分别指向队头和队尾。然后创建结点,再进行判空。链式队列没有限制,所以不需要判满。因为存在先进先出(尾部进,头部出)的顺序,所以入队即尾插。然后进行出队操作。
//创建链表

#include "link_que.h"
node_t create_linkque()
{
    node_t H=(node_t)malloc(sizeof(node));
    if(H==NULL)
    {
        printf("内存申请失败\n");
        return NULL;
    }
    H->data=-1;
    H->next=NULL;
    return H;
}


//创建队头指针和队尾指针
 

que create_que(node_t H)
{
    que Q=(que)malloc(sizeof(link_que));
    if(Q==NULL)
    {
        printf("内存申请失败\n");
        return NULL;
    }
    Q->front=H;
    Q->rear=H;
    return Q;
}


//创建结点
 

node_t create_node(int data)
{
    node_t p=(node_t)malloc(sizeof(node));
    if(p==NULL)
    {
        printf("内存申请失败\n");
        return NULL;
    }
    p->data=data;
    p->next=NULL;
    return p;
}


//判空
 

int empty_linkque(que Q,node_t H)
{
    if(Q==NULL)
    {
        printf("入参为空\n");
        return -1;
    }
    return Q->front==Q->rear&&Q->rear==H?1:0;
}


//入队,尾插
 

void push_linkque(que Q,int data,node_t H)
{
    if(Q==NULL)
    {
        printf("入参为空\n");
        return;
    }
    node_t p=create_node(data);
    //当链队为空的情况
    if(empty_linkque(Q,H))
    {
        //Q->fornt=H,因为链队为空的时候Q->front和Q->next都指向H
        Q->front->next=p;
        Q->front=p;
        Q->rear=p;
    }
    else
    {
        Q->rear->next=p;
        Q->rear=p;
    }
}


//出队
 

void pop_linkque(que Q,node_t H)
{
    if(Q==NULL)
    {
        printf("入参为空\n");
        return;
    }
    if(empty_linkque(Q,H))
    {
        printf("链队为空\n");
        return;
    }
    if(Q->rear==Q->front&&Q->rear!=H)
    {
        //当链队中只有一个元素的时候
        printf("出队的元素为%d\n",Q->front->data);
        Q->front=H;
        Q->rear=H;
        H->next=NULL;
        return;
    }
    printf("出队的元素为%d\n",Q->front->data);
    //保存要删除的结点
    node_t dele =Q->front;
    //Q->front指向第二个结点
    Q->front=Q->front->next;
    //头结点重新指向,现在链队中的第一个结点
    H->next=Q->front;
    free(dele);
}


//打印
 

void print_linkque(que Q,node_t H)
{
    if(Q==NULL)
    {
        printf("入参为空\n");
        return;
    }
    if(!empty_linkque(Q,H))
    {
        node_t p=Q->front;
        while(p!=NULL)
        {
            printf("%d\n",p->data);
            p=p->next;
        }
    }
}


//清空

进行清空操作时,可以利用while循环和调用出队函数来实现。
 

void clean_linkeque(que Q,node_t H)
{
    if(Q==NULL)
    {
        printf("入参为空\n");
        return;
    }
    while(!empty_linkque(Q,H))
    {
        pop_linkque(Q,H);
    }
}


//销毁

销毁也可以向利用清空函数来实现。只需要再将H删除。

void deatory_que(que *Q,node_t *H)
{
    if(Q==NULL||*Q==NULL||H==NULL||*H==NULL)
    {
        printf("error\n");
        return;
    }
    clean_linkeque(*Q,*H);
    free(*Q);
    free(*H);
    *Q=NULL;
    *H=NULL;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值