数据结构-链式队列

1.main.c

#include <stdio.h>
#include "llistqueue.h"

int main()
{
    int num[] = {1, 2, 3, 4, 5};
    int size = ((sizeof(num)) / (sizeof(num[0])));

    // 创建链式队列
    LListQueue_t *llist_queue;
    llist_queue = LListQueue_Create();
    if (NULL == llist_queue){
        printf("error!!!!!\n");
    }

    // 入栈
    for (int i = 0; i < size; i++){
        if (0 != LListQueue_EnQueue(llist_queue, num[i])){
            printf("error!!!!!\n");
            break;
        }
    }
    // 遍历链式队列中的元素
    printf("链式队列元素:");
    LListQueue_Show(llist_queue);

    // 出栈
    int temp = 0;
    temp = LListQueue_DeQueue(llist_queue);
    printf("出队元素:%d\n", temp);

    printf("链式队列元素:");
    // 遍历链式队列中的元素
    LListQueue_Show(llist_queue);

    // 释放链式队列空间内存
    LListQueue_Free(llist_queue);

    return 0;
}

2.llistqueue.c

#include "llistqueue.h"

// 创建链式队列
LListQueue_t *LListQueue_Create()
{
    // 定义一个链表头节点结构体变量
    LListQueue_t *llist_queue = NULL;
    // 申请内存空间
    llist_queue = (LListQueue_t *)calloc(1, sizeof(LListQueue_t));
    // 错误判断
    if (NULL == llist_queue){
        return NULL;
    }
    // 将头节点的指针域指向NULL
    llist_queue->next = NULL;
    // 返回头节点地址
    return llist_queue;
}

// 入队(尾插)
int LListQueue_EnQueue(LListQueue_t *llist_queue, Data_t data)
{
    LListQueue_t *llist_queue1 = llist_queue;
    LListQueue_t *llist_queue2 = NULL;

    // 创建一个链表节点(存储数据和下一个节点的地址)
    llist_queue2 = calloc(1, sizeof(LListQueue_t));
    if (NULL == llist_queue2){
        return -1;
    }   
    // 放入元素
    llist_queue2->data = data; 

    // 依次向后移动直到找到尾部   
    while (NULL != llist_queue1->next){
        llist_queue1 = llist_queue1->next;
    }

    // 将尾结点的next指针域指向新结点的地址
    llist_queue1->next = llist_queue2;
    // 将新结点的next指针域指向NULL   
    llist_queue2->next = NULL;

    return 0;
}

// 出队(头删)
int LListQueue_DeQueue(LListQueue_t *llist_queue)
{
    // 存储出队的元素
    int temp = 0;
    // 头节点地址
    LListQueue_t *llist_queue1 = llist_queue->next;

    // 判断链表是否为空
    if (NULL == llist_queue1){
        return -1;
    }   

    //保存出队元素
    temp = llist_queue1->data;
    // 头节点指向首结点的下一个节点
    llist_queue->next = llist_queue1->next;
    free(llist_queue1);
    llist_queue1 = NULL;

    // 将出队的元素返回
    return temp;
}

// 遍历元素
void LListQueue_Show(LListQueue_t *llist_queue)
{
    // 将头结点的地址保存在llist1中
    LListQueue_t *llist_queue1 = llist_queue;
    // 判断链表是否为空
    if (NULL == llist_queue1->next){
        return ;
    }
    // 依次向后移动一位遍历链表元素
    while (NULL != llist_queue1->next){
        llist_queue1 = llist_queue1->next;
        printf("%d ", llist_queue1->data);
    }
    printf("\n");
}

// 释放内存空间
void LListQueue_Free(LListQueue_t *llist_queue)
{
    LListQueue_t *llist_queue1 = NULL;
    LListQueue_t *llist_queue2 = NULL;
    for (llist_queue1 = llist_queue->next; NULL != llist_queue1; llist_queue1 = llist_queue2){
        // 保存当前节点指向的下一个结点的地址
        llist_queue2 = llist_queue1->next;
        // 释放当前节点内存空间(llist1中保存的地址的内存空间)
        free(llist_queue1);
    }
    // 释放链表中的头节点
    free(llist_queue);
}

3.llistqueue.h

#ifndef _LLISTQUEUE_H_
#define _LLISTQUEUE_H_

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

// 重定义
typedef int Data_t;

// 定义链表节点
typedef struct LinkedListQueue{
    Data_t data;                        // 数据域
    struct LinkedListQueue *next;       // 指针域
}LListQueue_t;

LListQueue_t *LListQueue_Create();
int LListQueue_EnQueue(LListQueue_t *llist_queue, Data_t data);
int LListQueue_DeQueue(LListQueue_t *llist_queue);
void LListQueue_Show(LListQueue_t *llist_queue);
void LListQueue_Free(LListQueue_t *llist_queue);

#endif

4.运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值