C语言链式队列的实现(可执行)——分文件编程

link_queue.c 函数的定义

#include"link_queue.h"
int create_queue(queue_t **my_queue){
    if(NULL==my_queue){
        printf("入参为NULL,请检查..\n");
        return -1;
    }
    *my_queue=(queue_t *)malloc(sizeof(queue_t));
    if(NULL==*my_queue){
        printf("内存分配失败,请检查..\n");
        return -1;
    }
    memset(*my_queue, 0, sizeof(queue_t));
    return 0;
}
int is_empty(queue_t *my_queue){
    if(NULL==my_queue){
        printf("入参为NULL,请检查..\n");
        return -1;
    }
    if(NULL==my_queue->front&&NULL==my_queue->rear){
        printf("队列为空,无法删除..\n");
        return -1;
    }else{
        return 0;
    }
}
int push_queue(queue_t *my_queue, int data){
    if(NULL==my_queue){
        printf("入参为NULL,请检查..\n");
        return -1;
    }
    node_t *pnew=(node_t *)malloc(sizeof(node_t));
    if(NULL==pnew){
        printf("内存分配失败,请检查..\n");
        return -1;
    }
    pnew->data=data;   
    if(NULL==my_queue->front&&NULL==my_queue->rear){
        pnew->next=my_queue->rear;
        my_queue->rear=pnew;
        my_queue->front=pnew;
    }else{
    my_queue->rear->next=pnew;
    my_queue->rear=pnew;
    }
    return 0;
}
int print_queue(queue_t *my_queue){
    if(NULL==my_queue){
        printf("入参为NULL,请检查..\n");
        return -1;
    }
    node_t *s=my_queue->front;
    while(s!=NULL){
        printf("%d ",(s->data));
        s=s->next;
    }
    printf("\n");
}
int pop_queue(queue_t *my_queue, int *data){
    if(NULL==my_queue){
        printf("入参为NULL,请检查..\n");
        return -1;
    }  
    node_t *f=NULL;
    if(!is_empty(my_queue)){
        f=my_queue->front;
        my_queue->front=f->next;
        *data=f->data;
        free(f);
        f=NULL;
        if(NULL==my_queue->front){
            my_queue->rear=NULL;
        }
    }else{
        printf("无法删除了奥!..\n");
    }
    return 0;
}
int clean_queue(queue_t *my_queue){
    if(NULL==my_queue){
        printf("入参为NULL,请检查..\n");
        return -1;
    }  
    node_t *f=NULL;
    if(!is_empty(my_queue)){
        while(my_queue->front!=NULL){
            f=my_queue->front;
            my_queue->front=f->next;
            free(f);
            f=NULL;
        }
        my_queue->rear=NULL;
    }else{
        printf("无需清空..\n");
        return -1;
    }
    return 0;
}
int destroy_queue(queue_t **my_queue){
    if(NULL==my_queue||NULL==(*my_queue)){
        printf("入参为NULL,请检查..\n");
        return -1;
    } 
    clean_queue(*my_queue);
    free(*my_queue);
    *my_queue=NULL;
    return 0;
}

link_main.c 主函数

#include"link_queue.h"
int main(){
    queue_t *my_queue=NULL;
    create_queue(&my_queue);
    //printf("%p\n",my_queue);
    push_queue(my_queue,10);
    push_queue(my_queue,20);
    push_queue(my_queue,30);
    print_queue(my_queue);
    int data=0;
    pop_queue(my_queue,&data);
    printf("出队的元素:%d\n",data);
    print_queue(my_queue);
    clean_queue(my_queue);
    printf("%p \n",my_queue);
    destroy_queue(&my_queue);
    printf("%p \n",my_queue);
    
  
    return 0;
}

link_queue.h 包含头文件,函数的声明,结构体的定义

#ifndef __LINK_QUEUE_H__
#define __LINK_QUEUE_H__

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//链表节点的结构体
typedef struct _Node{
    int data;
    struct _Node *next;
}node_t;

//链式队列的结构体
typedef struct _Queue{
    struct _Node *front;//头
    struct _Node *rear;//尾
}queue_t;
int create_queue(queue_t **my_queue);//
int push_queue(queue_t *my_queue, int data);//
int is_empty(queue_t *my_queue);//
int pop_queue(queue_t *my_queue, int *data);//
int clean_queue(queue_t *my_queue);
int destroy_queue(queue_t **my_queue);
int print_queue(queue_t *my_queue);//

#endif

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值