【算法与数据结构】 C语言实现单链表队列详解2

简介: 【算法与数据结构】 C语言实现单链表队列详解

【算法与数据结构】 C语言实现单链表队列详解1:https://developer.aliyun.com/article/1474522

🌠测试

# define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include "Queue.h" 

int main() 
{
    Queue queue;
    QueueInit(&queue);

    printf("Queue is empty: %s\n", QueueEmpty(&queue) ? "true" : "false");

    printf("Pushing elements into the queue...\n");
    for (int i = 1; i <= 5; ++i) 
    {
        printf("Pushing %d\n", i);
        QueuePush(&queue, i);
    }

    printf("Queue size: %d\n", QueueSize(&queue));
    printf("Queue front: %d\n", QueueFront(&queue));
    printf("Queue back: %d\n", QueueBack(&queue));

    printf("Popping elements from the queue...\n");
    while (!QueueEmpty(&queue)) 
    {
        printf("Front: %d\n", QueueFront(&queue));
        QueuePop(&queue);
    }

    printf("Queue is empty: %s\n", QueueEmpty(&queue) ? "true" : "false");

    QueueDestroy(&queue);

    return 0;
}

代码效果图:

🌉 总源代码

Queue.c

#include "Queue.h"

void QueueInit(Queue* pq)
{
  assert(pq); // 断言队列指针是否为空
  pq->phead = NULL; // 初始化头节点指针为空
  pq->ptail = NULL; // 初始化尾节点指针为空  
  pq->size = 0; // 初始化队列大小为0
}

void QueueDestroy(Queue* pq)
{

  assert(pq); // 断言队列指针是否为空
  QNode* cur = pq->phead; // cur指向队列头节点
  while (cur)
  {
    QNode* next = pq->phead->next; // 保存cur下一个节点的指针
    free(cur); // 释放cur节点内存
    cur = next; // cur指针移到下一个节点
  }
  pq->phead = pq->ptail = NULL; // 重置头尾节点指针为空
  pq->size = 0; // 重置队列大小为0

}



void QueuePush(Queue* pq, QDataType* x)
{
  assert(pq); // 断言队列指针是否为空
  QNode* newnode = (QNode*)malloc(sizeof(QNode)); // 申请新节点内存
  if (newnode == NULL)
  { // 申请失败
    perror("malloc fail");
    return;
  }
  newnode->data = x; // 设置新节点数据
  newnode->next = NULL; // 设置新节点next指针为空

  if (pq->ptail)
  { // 如果队列不为空
    pq->ptail->next = newnode; // 尾节点指向新节点
    pq->ptail = newnode; // 更新尾节点指针
  }
  else
  { // 队列为空
    pq->phead = pq->ptail = newnode; // 头尾节点同时指向新节点
  }

  pq->size++; // 队列大小增加1

}

//出队列
void QueuePop(Queue* pq)
{

  assert(pq); // 断言队列指针是否为空
  if (pq->phead == NULL)
    return; // 队列为空直接返回

  assert(pq->phead != NULL); // 断言头节点不为空
  if (pq->phead->next == NULL)
  { // 队列只有一个节点
    free(pq->phead); // 释放头节点
    pq->phead = pq->ptail = NULL; // 头尾节点同时置空
  }
  else
  { // 队列有多个节点
    QNode* next = pq->phead->next; // 保存头节点的下一个节点
    free(pq->phead); // 释放头节点
    pq->phead = next; // 头节点指向下一个节点
  }

  pq->size--; // 队列大小减1

}

QDataType QueueFront(Queue* pq)
{
  assert(pq);

  assert(pq->phead != NULL);

  return pq->phead->data;
}

QDataType QueueBack(Queue* pq)
{
  assert(pq);

  //暴力检查
  assert(pq->ptail != NULL);

  return pq->ptail->data;
}

bool QueueEmpty(Queue* pq)
{
  assert(pq);
  
  return pq->size == 0;
}

int QueueSize(Queue* pq)
{
  assert(pq);

  return pq->size;
}
相关文章
|
22小时前
|
算法
重拾数据结构和算法——脑图
重拾数据结构和算法——脑图
2 0
|
2天前
<数据结构>栈和队列. 顺序表实现栈,单链表实现队列.
<数据结构>栈和队列. 顺序表实现栈,单链表实现队列
13 3
|
2天前
(数据结构)单链表 —— 尾插,尾删,头插,头删,查找,插入,删除。
数据结构单链表 —— 尾插,尾删,头插,头删,查找,插入,删除
14 0
|
3天前
|
存储 C语言
数据结构——顺序表(C语言)
数据结构——顺序表(C语言)
8 1
|
3天前
|
索引
【数据结构】单链表代码实现
【数据结构】单链表代码实现
8 1
|
3天前
|
Java
DAY-1 | Java数据结构之链表:删除无头单链表中等于给定值 val 的所有节点
力扣203题解:使用时间复杂度为O(n)的思路删除链表中所有值为key的元素。引入辅助指针pre,记录cur的前一个节点,遍历链表时,若cur.val!=key,pre和cur同时前进;若cur.val==key,则pre.next=cur.next,cur继续前进,确保pre不急于跟随以处理连续相同值的情况。遍历结束后,处理头节点可能需要删除的特殊情况。
15 0
|
6天前
|
算法 搜索推荐 Java
Java数据结构 -- 常见算法分析(查找算法、排序算法)精解详解!!!
Java数据结构 -- 常见算法分析(查找算法、排序算法)精解详解!!!
7 0
|
6天前
|
算法 C++
c++算法学习笔记 (14) 栈与队列
c++算法学习笔记 (14) 栈与队列
|
6天前
|
存储 搜索推荐 算法
C语言数据结构算法,常用10种排序实战
插入排序(Insertion Sort) 希尔排序(Shell Sort) 选择排序(Selection Sort) 冒泡排序(Bubble Sort) 归并排序(Merge Sort) 快速排序(Quick Sort) 堆排序(Heap Sort) 基数排序(Radix Sort)
9 1
C语言数据结构算法,常用10种排序实战
|
7天前
|
算法 测试技术
【数据结构与算法 | 基础篇】环形数组模拟队列
【数据结构与算法 | 基础篇】环形数组模拟队列