【数据结构】【王道】【线性表】循环链表的实现及基本操作(可直接运行)

纯C语言完整代码操作单链表(初始化、插入、删除、查找...) C语言操作单链表 阅读详情

总目录

1.说明

由于循环链表尾部并未指向空,而是指向头指针。循环单链表尾结点指针域指向头结点;循环双链表尾结点后继指针指向头结点,头结点前驱指针指向尾节点。故而各类基本操作与之前单链表、双链表基本操作相差不大,主要就是在于对尾结点的处理问题,之前非循环链表尾结点指向空,如果要执行插入、删除等可能需要对后继结点取指针域的操作会导致报错,而循环链表就没有这个问题,因为它尾结点并非指向空。综上,在此处不会给出全部的基本操作,仅给出简单插入和删除作为示例,可与博主之前实现单链表、双链表的文章参照查看,改动主要是对于尾结点的处理,其余操作可参照之前文章。

单链表实现:单链表的实现及基本操作(带头结点)(可直接运行)
双链表实现:双链表的实现及基本操作(可直接运行)

2.循环单链表

2.1 基本操作

2.1.1 结构体定义

typedef struct LNode {
    int data;   // 数据域
    struct LNode *next; // 指针域
} LNode, *LinkList;

2.1.2 初始化

// 初始化
bool InitList(LinkList &L) {
    // 申请分配空间
    L = (LNode*)malloc(sizeof(LNode));
    // 分配空间失败的情况
    if(L == NULL) {
        return false;
    }
    // 头结点后继指针指向头结点本身
    L->next = L;
    return true;
}

2.1.3 判空

// 判断循环单链表是否为空
bool Empty(LinkList L) {
    // 判断头结点指针域是否指向头结点本身即可
    if(L->next == L) {
        return true;
    } else {
        return false;
    }
}

2.1.4 判断是否是表尾结点

// 判断结点p是否是表尾结点
bool isTail(LinkList L, LNode *p) {
    // 如果p结点指针域指向头结点,那么就是表尾结点(循环链表特性)
    if(p->next == L) {
        return true;
    } else {
        return false;
    }
}

2.1.5 结点后插入

// 指定结点后插操作:在p结点之后插入元素e
bool InsertNextNode(LNode *p, int e) {
    // p不合理的情况
    if(p == NULL) {
        return false;
    }
    LNode *s = (LNode *)malloc(sizeof(LNode));
    // 内存分配失败的情况
    if(s == NULL) {
        return false;
    }
    // 此处先将要插入结点的指针域指向前一个结点的指针域,即后一个结点的地址
    // 之后再令前一个结点的指针域指向要插入结点
    // 顺序不可颠倒,否则可能出现找不到之后结点的情况
    s->data = e;
    s->next = p->next;
    p->next = s;
    return true;
}

2.1.6 删除指定节点

// 删除指定节点
bool DeleteNode(LNode *p) {
    // p不合理的情况
    if(p == NULL) {
        return false;
    }
    // 此操作可以理解为将p节点与其后继结点进行数据域交换
    // 之后再删除其后继结点,可以视作完成了删除,且避免了寻找前驱结点的遍历操作
    // 由于是循环单链表,所以在尾部时无需对最后一个结点进行特殊处理
    // 因为循环单链表最后一个结点的后继指针指向头结点
    // 所以即使p是最后一个结点也可以处理
    LNode *q = p->next;
    p->data = p->next->data;
    p->next = q->next;
    free(q);
    return true;
}

2.1.7 输出所有元素

// 输出所有链表元素
void PrintList(LinkList L) {
    if(Empty(L)) {
        printf("the list is empty");
    }
    LNode* p = L->next;
    while(p != NULL && p != L) {
        printf("%d  ", p->data);
        if(p->next == L) {
            break;
        }
        p = p->next;
    }
    printf("\n");
}

2.2 完整代码

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

typedef struct LNode {
    int data;   // 数据域
    struct LNode *next; // 指针域
} LNode, *LinkList;

// 初始化
bool InitList(LinkList &L) {
    // 申请分配空间
    L = (LNode*)malloc(sizeof(LNode));
    // 分配空间失败的情况
    if(L == NULL) {
        return false;
    }
    // 头结点后继指针指向头结点本身
    L->next = L;
    return true;
}

// 判断循环单链表是否为空
bool Empty(LinkList L) {
    // 判断头结点指针域是否指向头结点本身即可
    if(L->next == L) {
        return true;
    } else {
        return false;
    }
}

// 判断结点p是否是表尾结点
bool isTail(LinkList L, LNode *p) {
    // 如果p结点指针域指向头结点,那么就是表尾结点(循环链表特性)
    if(p->next == L) {
        return true;
    } else {
        return false;
    }
}

// 指定结点后插操作:在p结点之后插入元素e
bool InsertNextNode(LNode *p, int e) {
    // p不合理的情况
    if(p == NULL) {
        return false;
    }
    LNode *s = (LNode *)malloc(sizeof(LNode));
    // 内存分配失败的情况
    if(s == NULL) {
        return false;
    }
    // 此处先将要插入结点的指针域指向前一个结点的指针域,即后一个结点的地址
    // 之后再令前一个结点的指针域指向要插入结点
    // 顺序不可颠倒,否则可能出现找不到之后结点的情况
    s->data = e;
    s->next = p->next;
    p->next = s;
    return true;
}

// 删除指定节点
bool DeleteNode(LNode *p) {
    // p不合理的情况
    if(p == NULL) {
        return false;
    }
    // 此操作可以理解为将p节点与其后继结点进行数据域交换
    // 之后再删除其后继结点,可以视作完成了删除,且避免了寻找前驱结点的遍历操作
    // 由于是循环单链表,所以在尾部时无需对最后一个结点进行特殊处理
    // 因为循环单链表最后一个结点的后继指针指向头结点
    // 所以即使p是最后一个结点也可以处理
    LNode *q = p->next;
    p->data = p->next->data;
    p->next = q->next;
    free(q);
    return true;
}

// 输出所有链表元素
void PrintList(LinkList L) {
    if(Empty(L)) {
        printf("the list is empty");
    }
    LNode* p = L->next;
    while(p != NULL && p != L) {
        printf("%d  ", p->data);
        if(p->next == L) {
            break;
        }
        p = p->next;
    }
    printf("\n");
}

int main() {
    LinkList L;
    InitList(L);
    PrintList(L);
    InsertNextNode(L, 5);
    InsertNextNode(L, 3);
    InsertNextNode(L, 1);
    PrintList(L);
    DeleteNode(L->next->next);
    PrintList(L);
}

2.3 运行截图

在这里插入图片描述

3.循环双链表

3.1 基本操作

3.1.1 结构体定义

typedef struct DNode {
    int data;   // 数据域
    struct DNode *prior, *next; // 指针域
} DNode, *DLinkList;

3.1.2 初始化

// 初始化
bool InitDLinkList(DLinkList &L) {
    // 申请分配空间
    L = (DNode*)malloc(sizeof(DNode));
    // 分配空间失败的情况
    if(L == NULL) {
        return false;
    }
    // 头结点前驱指针与后继指针都指向头结点本身
    L->prior = L;
    L->next = L;
    return true;
}

3.1.3 判空

// 判空
bool Empty(DLinkList L) {
    // 判断头结点后继指针是否指向头结点本身即可
    if(L->next == L) {
        return true;
    } else {
        return false;
    }
}

3.1.4 判断是否是表尾结点

// 判断结点p是否是表尾结点
bool isTail(DLinkList L, DNode *p) {
    // 如果p结点指针域指向头结点,那么就是表尾结点(循环链表特性)
    if(p->next == L) {
        return true;
    } else {
        return false;
    }
}

3.1.5 结点后插入

// 双链表插入
// 在p结点后插入s结点
bool InsertNextDNode(DNode *p, DNode *s) {
    // 无效输入
    if(p == NULL || s == NULL) {
        return false;
    }
    // 先令s后继指针指向后继结点
    // 再令后继结点的前驱指针指向s
    // 再令s前驱指针指向p
    // 最后令前驱结点后继指针指向s
    // 顺序注意不要在连接前断开即可
    s->next = p->next;
    // 由于是循环双链表,所以在尾部时无需对最后一个结点进行特殊处理
    // 因为循环双链表最后一个结点的后继指针指向头结点,且头结点前驱指针指向尾节点
    p->next->prior = s;
    s->prior = p;
    p->next = s;
    return true;
}

3.1.6 结点后删除

// 删除p结点的后继结点
bool DeleteNextDNode(DNode *p) {
    // 无效输入
    if(p == NULL) {
        return false;
    }
    // 找到p的后继结点q
    DNode *q = p->next;
    // 由于是循环双链表,所以在尾部时无需对最后一个结点进行特殊处理
    // 因为循环双链表最后一个结点的后继指针指向头结点,且头结点前驱指针指向尾节点
    // 用前驱结点的后继指针指向后继结点
    p->next = q->next;
    // 用q后继结点的前驱指针指向前驱结点
    q->next->prior = p;
    // 不要忘记释放空间!!!
    free(q);
    return true;
}

3.1.7 输出所有元素

// 输出所有链表元素
void PrintList(DLinkList L) {
    if(Empty(L)) {
        printf("the list is empty");
    }
    DNode* p = L->next;
    while(p != NULL && p != L) {
        printf("%d  ", p->data);
        if(p->next == L) {
            break;
        }
        p = p->next;
    }
    printf("\n");
}

3.2 完整代码

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

typedef struct DNode {
    int data;   // 数据域
    struct DNode *prior, *next; // 指针域
} DNode, *DLinkList;

// 初始化
bool InitDLinkList(DLinkList &L) {
    // 申请分配空间
    L = (DNode*)malloc(sizeof(DNode));
    // 分配空间失败的情况
    if(L == NULL) {
        return false;
    }
    // 头结点前驱指针与后继指针都指向头结点本身
    L->prior = L;
    L->next = L;
    return true;
}

// 判空
bool Empty(DLinkList L) {
    // 判断头结点后继指针是否指向头结点本身即可
    if(L->next == L) {
        return true;
    } else {
        return false;
    }
}

// 判断结点p是否是表尾结点
bool isTail(DLinkList L, DNode *p) {
    // 如果p结点指针域指向头结点,那么就是表尾结点(循环链表特性)
    if(p->next == L) {
        return true;
    } else {
        return false;
    }
}

// 双链表插入
// 在p结点后插入s结点
bool InsertNextDNode(DNode *p, DNode *s) {
    // 无效输入
    if(p == NULL || s == NULL) {
        return false;
    }
    // 先令s后继指针指向后继结点
    // 再令后继结点的前驱指针指向s
    // 再令s前驱指针指向p
    // 最后令前驱结点后继指针指向s
    // 顺序注意不要在连接前断开即可
    s->next = p->next;
    // 由于是循环双链表,所以在尾部时无需对最后一个结点进行特殊处理
    // 因为循环双链表最后一个结点的后继指针指向头结点,且头结点前驱指针指向尾节点
    p->next->prior = s;
    s->prior = p;
    p->next = s;
    return true;
}

// 删除p结点的后继结点
bool DeleteNextDNode(DNode *p) {
    // 无效输入
    if(p == NULL) {
        return false;
    }
    // 找到p的后继结点q
    DNode *q = p->next;
    // 由于是循环双链表,所以在尾部时无需对最后一个结点进行特殊处理
    // 因为循环双链表最后一个结点的后继指针指向头结点,且头结点前驱指针指向尾节点
    // 用前驱结点的后继指针指向后继结点
    p->next = q->next;
    // 用q后继结点的前驱指针指向前驱结点
    q->next->prior = p;
    // 不要忘记释放空间!!!
    free(q);
    return true;
}

// 输出所有链表元素
void PrintList(DLinkList L) {
    if(Empty(L)) {
        printf("the list is empty");
    }
    DNode* p = L->next;
    while(p != NULL && p != L) {
        printf("%d  ", p->data);
        if(p->next == L) {
            break;
        }
        p = p->next;
    }
    printf("\n");
}

int main() {
    DLinkList L;
    InitDLinkList(L);
    PrintList(L);
    DNode *s1 = (DNode*)malloc(sizeof(DNode));
    s1->data = 5;
    s1->next = NULL;
    DNode *s2 = (DNode*)malloc(sizeof(DNode));
    s2->data = 3;
    s2->next = NULL;
    InsertNextDNode(L, s1);
    InsertNextDNode(L, s2);
    PrintList(L);
    DeleteNextDNode(L);
    PrintList(L);
}

3.3 运行截图

在这里插入图片描述

数据结构(王道计算机考研笔记) 数据结构 阅读详情

相关推荐

【数据结构】【王道408】——PPT截图与思维导图

【数据结构】【王道408】——PPT截图与思维导图

网瘾中心呼唤爱的博客 9549

线性表的循环单链表使用的代码实现(python语言)

# 单链表 class ListNode: # 定义链表节点类 def __init__(self, elem_1, next_1): self.elem = elem_1 # 节点的值 self.next = next_1 # 指向下一个节点的链接 class LoopList: # 定义一个循环单链表 def __init__(sel...

zhangyu4863的博客 323

如何将TDengine集成到Thingsboard?

1 概述 ThingsBoard是用于数据收集、处理、可视化和设备管理的开源物联网平台。它通过行业标准的物联网协议MQTT、CoAP和HTTP实现设备连接,并支持云和本地部署。 ThingsBoard迄今没有导入专业的时序数据库应用,用户可选择的只有PostgreSQL和Cassandra。虽然针对PostgreSQL引入了TimeScale插件,但由于其不是按照宽表的方式组织数据记录,TimeScale的优势根本发挥不出来。总之,这两种数据库不具备高效的数据吞吐能力。 而且,Thingsboard在

Wearable_device的博客 4766

【数据结构】 循环单链表的基本操作 (C语言版)

【数据结构】 循环单链表的基本操作 (C语言版)

weixin_56814370的博客 2394

端侧视觉赋能手游自动化:YOLOv8+NCNN实现低风险挂机与广告拦截

本文提出一种基于端侧AI的移动游戏自动化解决方案,采用YOLOv8目标检测和NCNN推理框架,结合AutoJS实现"感知-决策-执行"闭环。方案通过轻量化模型训练、多分辨率适配和行为拟态优化,解决了传统脚本的适配性和风控问题。关键技术包括:构建游戏专属数据集、模型量化优化、广告拦截和挂机功能实现,具有本地运行、安全稳定等特点,为个人开发者提供了一套完整的自动化开发框架。

milk416666的博客 1263

向量库深度解析:选型、索引原理与生产实践

本文系统解析五大主流向量库(pgvector、Milvus、Weaviate、ChromaDB、Faiss)的定位、优缺点与适用场景,深入拆解FLAT、IVF、HNSW等核心索引原理,并重点分析Milvus的Compaction机制。针对数据治理场景,提供精准选型建议:中小规模优先pgvector或Weaviate,超大规模选择Milvus,开发测试推荐ChromaDB。核心索引推荐HNSW,兼顾检索速度与召回率。全文从理论到实践,为开发者提供清晰的向量库选型逻辑与生产落地指南。

a123147abc的博客 360

数据结构单链表的循环链表及基本操作实现(C语言实现)

循环链表的基本操作的实现 特点:循环链表可以从任意一个位置循环遍历整个链表,如果设置的的为尾指针的话,其操作头节点后为节点的时间复杂度外O(1); 其实现代码如下 #include <stdio.h> #include <stdlib.h> #include <stdbool.h> typedef int ElementType; typedef struct Node { ElementType element; struct Node *next;

qq_42169456的博客 591

从零到一:高通Memory QMVS测试环境搭建的避坑指南

本文详细介绍了高通Memory QMVS测试环境搭建的全流程避坑指南,涵盖硬件选择、软件配置、QMVS核心组件安装及测试执行技巧。重点解析了adb工具配置、QPST日志抓取等关键步骤,帮助工程师高效搭建稳定测试环境,避免常见兼容性和稳定性问题。

weixin_29251567的博客 555

C语言数据结构——循环链表

在双向循环链表中,每个结点包括三个域,分别是 data 域、next 域和 prev 域,其中data域为数据域,next 域为指向后继结点的指针域,prev域为指向前驱结点的指针域。下图为链表的结点结构。

m0_73676323的博客 1894

Autosar软件组件分析及ARXML文件分析

Autosar软件组件分析及ARXML文件分析

专注汽车软件开发、AutoSAR、车载以太网、SOA、EE架构。 3601

OpenHarmony可信执行环境:TEE模块源码分析与实现原理

TEE(Trusted Execution Environment)是OpenHarmony系统中的安全执行环境,用于提供隔离的安全执行环境,保护敏感数据和操作。OpenHarmony的TEE模块基于OpenTrustee实现,采用微内核架构,为系统提供可信执行环境支持。OpenHarmony TEE模块是一个复杂的安全系统,通过提供隔离的执行环境保护敏感数据和操作。

m0_67505153的博客 548

2021 王道考研 数据结构+习题讲解

2021 王道考研 数据结构 P1【2021版】0.0 课程指南 P2【2021版】1.1.0 开篇_数据结构在学什么 P3【2021版】1.1.1 数据结构的基本概念 P4【2021版】1.2.1 算法的基本概念 P5【2021版】1.2.2 算法的时间复杂度 P6【2021版】1.2.3 算法的空间复杂度 P7【2021版】2.1_线性表的定义和基本操作 P8【2021版】2.2.1_顺序表的定义 P9【2021版】2.2.2_1_顺序表的插入删除 P10【2021版】2.2.2_2_顺序表的查找 P1

weixin_47312141的博客 4万+

30天入门 SAP BTP 开发系列之四:SAP BTP 控制台里 Global Account 的常规操作介绍

笔者前一篇文章,介绍了 SAP BTP 中 Global Account 的概念。本文咱们一起来看看 SAP BTP 控制台里,给 Global Account 开放了哪些操作功能。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 867

王道数据结构课代表 - 考研数据结构 第二章 线性表 究极精华总结笔记(C版本)

数据结构与算法 笔记导航🚥🚥🚥 🥬 第一章 绪论 🥕 第二章 线性表 🥪 第三章 栈和队列 🍊 第四章 串-KMP(看毛片算法) 🍒 第五章 树和二叉树 🍀 第六章 图 🍚 第七章 查找(B树、散列表) 🧄 第八章 排序 (内部排序:八大排序动图演示与实现 + 外部排序) 🍔 数据结构与算法 复试精简笔记 🎨 408 全套初复试笔记汇总 传送门 🏃‍🏃‍🏃‍ 如果本篇文章对大家起到帮助的话,跪求各位帅哥美女们,求赞👍 、求收藏、求关注!

clzZ2的博客 1万+

复制幻灯片到另一个PPT编程

请确保将源PPT文件和目标PPT文件的文件名修改为你实际使用的文件名。运行上述代码后,目标PPT将包含源PPT中的所有幻灯片和形状。这里假设源PPT文件名为"source.pptx",目标PPT文件名为"target.pptx"。方法将每个幻灯片的布局添加到目标PPT中。是一个强大的库,可以用于创建、修改和操作PPT文件。要将一个PPT中的幻灯片复制到另一个PPT,可以使用Python的。这段代码遍历源PPT的每个幻灯片,并使用。步骤 3: 打开源PPT和目标PPT。这将保存修改后的目标PPT文件。

ByteSparkX的博客 1322

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

24王道考研408数据结构代码整合(学习用)

define MaxSize 10 //定义最大长度//用静态的“数组”存放数据元素int length;//顺序表的当前长度}SeqList;//顺序表的类型定义(静态分配方式)//基本操作——初始化一个顺序表i

Ch_ensf的博客 1万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

王道考研数据结构代码总结(前四章)

本文包含王道考研讲课中所涉及的数据结构中的所有代码,当PPT代码和书上代码有所区别时以咸鱼的PPT为主,个人认为PPT上的代码比王道书上的代码要便于理解,此外,本博客也许会补充一些额外的代码进来(不仅受限于王道考研),408中冷门考点频出,应该会囊括所有涉及到的代码,这也是我的DS的第二轮复习,希望与大家共勉之,由于博客体量的问题,原先打算此文也将收录诸如os中的吸烟者问题等的一系列伪代码,具体看到时候本文字数而定。如果一篇博客放不下的话会拆分成为两三篇文章发布。

佛系更新 5569

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【数据结构】【王道】【数据结构实现】文章目录

数据结构实现文章目录

treesorshining的博客 1915

数据结构笔记(王道考研) 第二章:线性表

数据结构笔记(王道考研) 第二章:线性表

zimuzi2019的博客 3185

数据结构学习笔记(王道)

数据结构学习笔记(王道) PS:本文章部分内容参考自王道考研数据结构笔记 文章目录数据结构学习笔记(王道)一、绪论1.1. 数据结构1.2. 算法1.2.1. 算法的基本概念1.2.2. 算法的时间复杂度1.2.3. 算法的空间复杂度二、线性表2.1. 线性表的定义和操作2.1.1. 线性表的基本概念2.1.2. 线性表的基本操作2.2. 顺序表2.2.1. 顺序表的基本概念2.2.2. 顺序表的实现2.2.3. 顺序表的基本操作2.3. 链表2.3.1. 单链表的基本概念2.3.2. 单链表的实现2.3.

qq_55593227的博客 4万+

《王道》数据结构笔记整理2022

数据结构第一章绪论1.1数据结构的基本概念1.2数据结构的三要素1.3算法的基本概念1.4算法的时间复杂度1.5算法的空间复杂度 第一章绪论 1.1数据结构的基本概念 1.数据:数据是信息的载体,是描述客观事物属性的数、字符以及所有能输入到计算机中并被程序识别和处理的符号的集合。 2.数据元素:数据元素是数据的基本单位,通常作为一个整体进行考虑和处理。一个数据元素可由若干数据项组成,数据项是构成数据元素的不可分割的最小单位。例如,学生记录就是一个数据元素,它由学号、姓名、性别等数据项组成。 3.数据对象:数

池鱼 27万+

王道数据结构 | 第二章 线性表

王道数据结构整理 第二章线性表 顺序表 单链表 双链表 循环单/双链表 静态链表

emmm_Yeah的博客 1053

王道数据结构笔记02—线性表(C语言)

根据王道考研白嫖课程整理的笔记,学会数据结构中的线性表,看这一篇文章就够了!

qq_28356977的博客 1794

【王道考研】王道数据结构与算法详细笔记(全)

线性表是具有相同数据类型的n(n>0)个数据元素的有限序列。(其中n为表长,当n=0时线性表是一个空表。若用L命名线性表,则其一般表示为)1. 存在惟一的第一个元素。2. 存在惟一的最后一个元素。3. 除第一个元素之外,每个元素均只有一个直接前驱。4. 除最后一个元素之外,每个元素均只有一个直接后继1.是线性表中的“第i个”元素线性表中的位序。2.是表头元素;是表尾元素。

强哥的微博 7万+

王道计算机考研 数据结构 (绪论、线性表)

目录第一章、绪论1.1_数据结构的基本概念知识总览数据元素、数据项数据结构、数据对象数据结构的三要素数据类型、抽象数据类型1.2.1_算法的基本概念什么是算法算法的特性1.2.2_算法的时间复杂度1.2.3_算法的空间复杂度函数递归调用带来的内存开销第二章、线性表2.1_线性表的定义和基本操作线性表的基本操作2.2.1_顺序表的定义顺序表的实现-静态分配顺序表的实现-动态分配 第一章、绪论 1.1_数据结构的基本概念 知识总览 数据元素、数据项 数据元素是数据的基本单位,通常作为一个整体考虑 一个数据元

m0_51448653的博客 3438

408数据结构第二章:线性表

本篇文章为408王道数据结构第二章线性表的全部笔记,代码大部分为自己敲出后对比修改,可能会有出入和错误,若发现欢迎指正

m0_74983085的博客 1062
上一篇: 【数据结构】【王道】【线性表】双链表的实现及基本操作(可直接运行)
下一篇: 【数据结构】【王道】【栈与队列】顺序栈的实现及基本操作(可直接运行)
Silver  Star
Silver Star 新星创作者: 大数据技术领域 新星创作者: 大数据技术领域
博客等级 码龄7年 1万+粉丝 72原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

Silver Star

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

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

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

打赏作者

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

抵扣说明:

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

余额充值