用链表实现队列(数据结构复习笔记一)

一、总体流程

①首先,创建一个头结点,然后创建一个栈顶指针,并使它的头(frong)和尾(rear)指向头结点;

②其次,创建一个新的结点,然后将头结点的指针next和栈顶指针的指针real指向下一个结点,并将数据传入头结点;(这样front指向第一个数据传入的结点,real指向的就是下一个数据插入的结点)

③然后以此类推;

④删除结点就是把栈顶指针的指针front指向头结点的下一个结点,这样之前的front连接就自动断开了;然后断开next连接,并free掉头结点(注意:这时real指向的结点是里面没有数据);

⑤清空链表就是把除栈顶指针和real指向的没有数据的结点外的结点都清空,并把指针front指向指针real指向的那个结点。

⑥销毁链表就是执行完步骤⑤后清空栈顶指针和它指向的那个结点的空间。

二、代码

①main.c

//main.c
#include"link_que.h"
int main(int argc, char const *argv[])
{
    node_t P=creat_que();//创建头结点
    que Q=create_link_que(P);//创建链表
    push_link_que(Q,10);//入队
    push_link_que(Q,20);//入队
    push_link_que(Q,25);//入队
    print_link_que(Q);//打印
    pop_link_que(Q);//出队
    print_link_que(Q);//打印
    clean_link_que(Q);//清空
    print_link_que(Q);//打印
    destory_link_que(&Q,&P);//销毁
    print_link_que(Q);//打印
    return 0;
}

②link_que.c

#include"link_que.h"
//创建头结点
node_t creat_que()
{
    node_t P=(node_t)malloc(sizeof(node));
    if(P==NULL)
    {
        printf("申请空间失败\n");
        return NULL;
    }
    P->data=-1;
    P->next=NULL;
    return P;
}
//创建链表
que create_link_que(node_t P)
{
    que Q=(que)malloc(sizeof(link_que));
    if(Q==NULL)
    {
        printf("申请空间失败\n");
        return NULL;
    }
    Q->front=P;
    Q->rear=P;
    return Q;
}

//创建结点
node_t create_node()
{
    node_t Q=(node_t)malloc(sizeof(node));
    if(Q==NULL)
    {
        printf("申请空间失败\n");
        return NULL;
    }
    Q->data=0;
    Q->next=NULL;
    return Q;
}

//判空
int empty_link_que(que Q)
{
    if(Q==NULL)
    {
        printf("入参为空\n");
        return -1;
    }
    return Q->front==Q->rear?1:0;
}

//入队
void push_link_que(que Q,int data)
{
    if(Q==NULL)
    {
        printf("入参为空\n");
        return;
    }
    node_t new=create_node();
    Q->rear->data=data;
    Q->rear->next=new;
    Q->rear=new;
}

//出队
void pop_link_que(que Q)
{
    if(Q==NULL)
    {
        printf("入参为空\n");
        return;
    }
    if(!empty_link_que(Q))
    {
        node_t dele=Q->front;
        Q->front=Q->front->next;
        printf("出队元素为:%d",dele->data);
        free(dele);
        putchar(10);
    }
    else
    printf("链表队列为空,无法出队\n");
}

//打印
void print_link_que(que Q)
{
    if(Q==NULL)
    {
        printf("入参为空\n");
        return;
    }
    if(!empty_link_que(Q))
    {
        node_t P=Q->front;
        while(P->next!=NULL)
        {
            printf("%d\n",P->data);
            P=P->next;
        }
    }
    else
        printf("链表队列为空\n");
}

//清空
void clean_link_que(que Q)
{
    if(Q==NULL)
    {
        printf("入参为空\n");
        return;
    }
    while(Q->front!=Q->rear)
    {
        pop_link_que(Q);
    }
}

//销毁
void destory_link_que(que *Q,node_t *P)
{
    if(*Q==NULL)
    {
        printf("入参为空\n");
        return;
    }
    clean_link_que(*Q);
    free(*P);
    free(*Q);
    *P=NULL;
    *Q=NULL;
}

③link_que.h

#ifndef __LINK_QUE_H__
#define __LINK_QUE_H__
#include<stdio.h>
#include<stdlib.h>
//创建链表结点的类型
typedef struct node
{
    int data;
    struct node*next;
}node,*node_t;
//创建指向链表头和尾的指针(头结点)
typedef struct 
{
    node_t front;
    node_t rear;
}link_que,*que;
node_t creat_que();
que create_link_que(node_t P);
node_t create_node();
int empty_link_que(que Q);
void push_link_que(que Q,int data);
void pop_link_que(que Q);
void print_link_que(que Q);
void clean_link_que(que Q);
void destory_link_que(que *Q,node_t *P);
#endif
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蜂蜂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值