数据结构-链式队列(C语言实现)

1. 导入头文件

编写代码过程中,涉及动态内存分配等常用的函数,需要引入如下头文件

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

2. 结构体定义

// 链表节点的结构定义
typedef struct Node
{
    int data;
    struct Node * next;
} NODE, *PNODE;

// 队列的结构定义
typedef struct Queue
{
    PNODE pFront;
    PNODE pTail;
} QUEUE, *PQUEUE;

3. 函数声明

void init(PQUEUE pQueue);    // 初始化
void show(PQUEUE pQueue);    // 列出所有元素
int isEmpty(PQUEUE pQueue); // 是否为空
void enQueue(PQUEUE pQueue, int val);      // 入队
void deQueue(PQUEUE pQueue, int *val);  // 出队

4. 队列初始化

队列初始化时将头和尾指向同一位置

void init(PQUEUE pQ)
{
    pQ->pFront = (PNODE)malloc(sizeof(NODE));
    if (NULL == pQ->pFront)
    {
        printf("内存分配失败");
        exit(-1);
    } else
    {
        pQ->pTail = pQ->pFront;
        pQ->pTail->next = NULL;
    }
}

5. 判断队列是否为空

int isEmpty(PQUEUE pQ)
{
    if (pQ->pFront == pQ->pTail)    // 和初始化时相同则为空
    {
        return 1;
    }
    return 0;
}

6. 入队操作

入队操作,当有元素入队时,要移动尾指针 pTail ,pTail 始终指向最后一个元素。

void enQueue(PQUEUE pQ, int val)
{
    PNODE pNew = (PNODE)malloc(sizeof(NODE));
    if (pNew == NULL)
    {
        printf("内存分配失败");
        exit(-1);
    }

    pNew->data = val;

    pQ->pTail->next = pNew;       // 注意链表的指向
    pQ->pTail = pNew;
}

6. 出队操作

出队操作和链表删除元素操作一致。

void deQueue(PQUEUE pQ, int *val)
{
    if (isEmpty(pQ)){
        printf("队列为空");
        return;
    } else
    {
        PNODE q = pQ->pFront->next;
        *val = q->data;
        pQ->pFront->next=q->next;
        free(q);
        q=NULL;
    }
}

7. 列出队列所有元素

void show(PQUEUE pQ)
{
    if (isEmpty(pQ))
    {
        printf("队列为空\n");
    } else
    {
        PNODE p = pQ->pFront->next;
        while (p)
        {
            printf("%d,", p->data);
            p=p->next;
        }

        printf("\n");
    }
}

8. main 函数

int main()
{
    int val;
    QUEUE q;
    init(&q);
    enQueue(&q, 1);
    enQueue(&q, 2);
    enQueue(&q, 3);
    enQueue(&q, 4);
    show(&q);
    deQueue(&q, &val);
    deQueue(&q, &val);
    show(&q);
    return 0;
}
posted @ 2020-06-19 10:59  sugare  阅读(385)  评论(0)    收藏  举报