《数据结构》复习之线性表(顺序表和链表)

数据结构与算法 复习笔记 第二章 线性表:概念/顺序表/链表 线性结构具有如下的结构特点: (1)均匀性:虽然不同线性表的数据元素可以是各种各样的,但在同一线性表中的各数据元素必定具有相同的数据类型和长度。 (2)有序性:各数据元素在线性表中都有自己的位置,且数据元素之间的相对位置是线性的、 按元素复杂度: 简单线性结构:顺序表、队列、散列表等 高级线性结构:广义表、多位数组等 2.1线性表的概念 2.1.1线性表的抽象数据类型 线性表(linear lis... 阅读详情

1.线性表的概念

  线性表的存储结构有顺序存储结构和链式存储结构两种。前者成为顺序表,后者称为链表。

  • 顺序表:
    顺序表就是把线性表中的所有元素按照其逻辑顺序,一次存储到从指定的存储 位置开始的一块连续的存储空间中,如下图所示。
    这里写图片描述
  • 链表
    在链表的存储中,每一个节点不仅包含所存元素本身的信息,还包含元素之间的逻辑关系的信息,即前驱节点包含后继节点的地址信息,这样就可以通过前驱节点中的地址信息方便地找到后继节点的位置,如下图所示。
    这里写图片描述
    本文中以单链表为例。

2.线性表的比较

  顺序表和链表各自有各自的优点和缺点,可以用下表表示:

比较类别顺序表链表
存储分配静态分配动态分配
存取方式随机存取顺序存取
插入删除时移动元素的个数需要移动近一半的元素不需要移动元素,只需修改指针

  由此可见,当需要随机存取的时候,适合使用顺序表;当需要做频繁插入删除操作时,适合使用链表。

3.线性表的数据结构

  • 顺序表
typedef struct
{
    T data[maxSize];
    int length;
}Sqlist;

  结构体中包括一个存储表元素数组data[]和指示元素个数的变量length。(其实顺序表就是数组)。

  • 链表
    单链表的节点定义:
template<class T>
struct Node
{
    T value;
    struct  Node* next; 
};

4.顺序表的算法操作

  • 顺序表的算法操作:
    下面是我写的比较中重要的顺序表的算法操作。
#define maxSize 1000
#include <iostream>
using namespace std;

//注意模板必须用class

template<class T>
class Sqlist
{
    private:
        T data[maxSize];
        int length;
    public:
        Sqlist()
        {
            length = 0;
        }
        Sqlist(T *A,int size)
        {
            for (int i = 0; i < size;i++)
            {
                data[i] = A[i];
            }
            length = size;
        }
        T at(int loc);  //loc为数组中位置,以0开始
        void insert(int loc, T value);
        void display();
        void push_back(T);
        T erase(int loc);  //loc为数组中位置,以0开始

};

template<class T>
T Sqlist<T>::erase(int loc)
{
    int i = 0;
    T x = data[loc];
    for (i = loc; i < length; i++)   //对于临界点的数,可以试着把临界点带进去
    {
        data[i] = data[i + 1];
    }
    length--;
    return x;
}

template<class T>
void Sqlist<T>::insert(int loc, T value)
{
    //for (int i = loc; i < length;i++)  //这样写是有问题的
    //{
    //  data[i + 1] = data[i];  //所有均向后移动
    //}
    int i = 0;
    for (i = length-1; i >= loc;i--)  //对于临界点的数,可以试着把临界点带进去
    {
        data[i + 1] = data[i];
    }
    data[loc] = value;  //不要写成i
    length++;
}

template<class T>
void Sqlist<T>::push_back(T value)
{
    data[length] = value;
    length++;
}

template<class T>
void Sqlist<T>::display()
{
    for (int i = 0; i < length;i++)
    {
        cout << data[i] << " ";
    }
    cout << endl;
}

template<class T>
T Sqlist<T>::at(int loc)
{
    return data[loc];
}

int main()
{
    int A[] = { 1, 2, 3, 4, 6, 7, 8, 9, 10 };
    Sqlist<int> ve(A, 9);
    ve.push_back(11);
    ve.display();  //1 2 3 4 6 7 8 9 10 11

    ve.insert(4, 5);  
    ve.display();   //1 2 3 4 5 6 7 8 9 10 11

    ve.erase(2);  
    ve.display();   //1 2 4 5 6 7 8 9 10 11

    // char A[] = { 'a', 'b', 'c', 'e', 'f','g', 'h' };
    // Sqlist<char> ve(A, 7);
    // ve.push_back('i');
    // ve.display();  //a b c e f g h i

    // ve.insert(3, 'd');   
    // ve.display();  //a b c d e f g h i

    // ve.erase(2);  
    // ve.display();  //a b d e f g h i
    return 0;
}

  顺序表中比较难的是插入(insert)和删除(erase)操作。再插入的过程中,要注意从最后一个元素开始至插入位置的元素,每一个元素向后移动一个单位,而不能从插入位置的元素向后移,因为这样后面的元素将被覆盖。而在删除操作时,需要从删除元素的后一个元素开始往前面移动一个单位一直移动到最后一个元素。
  

  • 单链表
    下面是我写的单链表的操作。
#include <iostream>
using namespace std;

template<class T>
struct Node
{
    T value;
    struct  Node* next;
};

template<class T>
class MyList
{
private:
    struct Node<T> * list;
public:
    MyList()
    {
        list = new struct Node<T>;
        list->next = NULL;
    }
    void CreateListR(T a[], int n);  //尾插法
    void CreateListF(T a[], int n);  //头插法
    void display();
    void insert(int loc, T x);  //插入操作
    int erase(T x);  //删除操作
    void inverse();  //逆置操作
    void inversePrint();  //逆序打印
    void recurPrint(struct Node<T>* p);    ///递归操作
};

template<class T>
void MyList<T>::inversePrint()
{
    recurPrint(list->next);
    cout << endl;
}

template<class T>
void MyList<T>::recurPrint(struct Node<T>* p)
{
    if (p!=NULL)
    {
        recurPrint(p->next);
        cout << p->value << " ";
    }
}

template<class T>
void MyList<T>::inverse()
{
    struct Node<T> *p = list->next;
    list->next = NULL;
    struct Node<T> *q;
    while (p != NULL)
    {
        q = p;
        p = p->next;

        q->next = list->next; //头插法
        list->next = q;
    }
}

template<class T>
int MyList<T>::erase(T x)
{
    //struct Node<T> *p = list->next;
    //struct Node<T> *q = list;  //删除的时候要知道删除节点的前一个节点
    //while (p != NULL)
    //{
    //  if (p->value==x)
    //  {
    //      break;
    //  }
    //  p = p->next;
    //  q = q->next;
    //}
    //if (p == NULL)
    //{
    //  return -1;//没有这样的节点无法删除
    //}
    //else
    //{
    //q->next = p->next;  //删除操作
    //delete p;
    //return 1;
    //}
    //另一种方法
    struct Node<T> *p = list;
    while (p->next != NULL)
    {
        if (p->next->value == x)
        {
            break;
        }
        p = p->next;
    }
    if (p == NULL)
    {
        return -1;
    }
    else
    {
        struct Node<T> *tmp = p->next;
        p->next = p->next->next;
        delete tmp;
        return 1;
    }
}

template<class T>
void MyList<T>::insert(int loc, T x)
{
    struct Node<T> *p = list;   //注意插入的时候要找到插入节点的前一个节点
    while (loc--)   //找到对应的位置
    {
        p = p->next;
    }
    struct Node<T>* tmp = new struct Node<T>;
    tmp->value = x;
    //插入操作
    tmp->next = p->next;    //可以发现插入操作和头插法很像,其实头插法就是在头结点后面插入(邪恶了)。
    p->next = tmp;
}

template<class T>
void MyList<T>::display()
{
    struct Node<T> *p = list->next;
    while (p != NULL)
    {
        cout << p->value << " ";
        p = p->next;  //不要忘记向后走
    }
    cout << endl;
}

template<class T>
void MyList<T>::CreateListF(T a[], int n) //头插法
{
    struct Node<T>* p = list;
    for (int i = 0; i < n; i++)
    {
        struct Node<T>* tmp = new struct Node<T>;
        tmp->value = a[i];
        tmp->next = p->next;
        p->next = tmp;
        /*
        若没有头结点则为
        tmp->next = list;
        list = tmp;
        */
    }
}

template<class T>
void MyList<T>::CreateListR(T a[], int n)  //尾插法
{
    struct Node<T>* p = list;
    for (int i = 0; i < n; i++)
    {
        struct Node<T>* tmp = new struct Node<T>;
        tmp->value = a[i];
        tmp->next = NULL;
        p->next = tmp;       //尾插法要保证有一个指针永远指向最后一个节点
        p = tmp;
    }
    p->next = NULL; //或许冗余
}

int main()
{
    int A[5] = { 1, 2, 3, 4, 5 };
    MyList<int> mylist1;
    mylist1.CreateListF(A, 5);
    mylist1.display();  //5 4 3 2 1

    cout << "************************" << endl;
    MyList<int> mylist2;
    mylist2.CreateListR(A, 5);
    mylist2.display();  //1 2 3 4 5

    mylist2.insert(2, 10);
    mylist2.display();  //1 2 10 3 4 5

    mylist2.erase(4);
    mylist2.display();  //1 2 10 3 5

    mylist2.inverse();
    mylist2.display();  // 5 3 10 2 1
    mylist2.inversePrint();  //1 2 10 3 5
    return 0;
}

  这里写了两种创建链表的方法,头插法(CreateListF)和尾插法(CreateListR)。头插法是在头结点后面不断插入结点,因此头插法的实现与链表元素的插入相似tmp->next = p->next; p->next = tmp;。且头插法最后得到的链表元素顺序与插入元素顺序相反(逆置的时候可以用头插法)。尾插法需要有一个指针一直指向最后一个元素,每次在链表末尾插入元素p->next = tmp; p = p->next;。
  此外链表比较重要的操作时插入(insert)和删除(erase)。两者的共同点是都要找到所需位置的前一个元素(插入要找到插入元素的前一个元素,删除要找到删除元素之前的元素),因此可以找一个临时指针进行跟踪。
  插入的代码(s为插入的节点,p为插入位置之前的元素)是:s->next=p->next; p->next=s;(可以发现头插法和这个是一样的,因为都是插入操作,注意两句语句顺序不能颠倒)。示意图如下。
  这里写图片描述
  删除也比较简单。要将单链表的第i个结点删去,必须先在单链表中找到第i-1个结点。假设p为删除节点的前一个节点。则删除代码是q=p->next; p->next=p->next->next; free(p); 。 示意图如下:
  这里写图片描述
  这边我还写如何把链表逆置(inverse头插法)和将链表元素倒着输出(inversePrint利用递归)。

5.双链表的补充

  补充一下双链表的插入节点和删除节点算法。
  双链表节点的数据结构如下:

struct Node
{
    T value;
    struct  Node* prior;
    struct  Node* next; 
};

  假设在双链表中p所指的节点之后插入一个节点s,其操作语句如下:

s->next=p->next;
s->prior=p;
p->next=s;
s->next->prior=s;

  其特点是,先将要插入的结点的两边链接好,这样就可以保证不会发生链断之后找不到阶段的情况。
  设要删除双链表中p结点的后继结点。其操作语句如下:

q=p->next;
p->next=q->next;
q->next->prior=p;
free(q);

6.总结

  顺序表对应于数组,因此并不是特别难。由于大一时观念的灌输,总觉得链表较难,但现在发现其实并不是如此,最重要的是相信自己克服恐惧大胆的写。若遇到较难的题目,可以借助画图来帮助理解。也要勇于设置相应的辅助指针。
  

算法实习准备之一:数据结构复习(一) 算法实习之一数据结构复习新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 数据结构复习 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了 阅读详情

相关推荐

数据结构总复习知识点

第一章 绪论 1、基本概念 数据结构,四种基本结构,逻辑结构和物理结构,元素(节点),抽象数据类型 2、算法,时间复杂度,频度(会计算) 第二章、线性表 1、基本概念 线性表:n个数据元素的有限序列,可插入和删除 数据项、记录、文件 2、顺序表 1)用一组地址连续的存储单元依次存储线性表的数据元素 2)顺序表特点:以相对(物理)位置来表示 3)是一种随机存取的存储结构 4)

misamisa_xj的博客 944

重学数据结构之顺序表和链表的比较

1. 优点 1.1 顺序表的主要优点: 没有使用指针,不用花费额外开销; 线性表元素的读访问非常简洁便利 1.2 链表的主要优点: 无需事先了解线性表的长度 允许线性表的长度动态变化 能够适应经常删除内部元素的情况 顺序表是存储静态数据的不二之选 链表是存储动态变化的良方 2. 存储密度 n表示线性表当前元素的个数 p表示指针的存储单元大小(通常为4bytes) E表示数据元素的存储单元大小 D表...

wyffeige的博客 400

python解析通达信dat与blk数据文件【附源码】

本文介绍了一个完整的通达信金融数据解析器项目,该项目攻克了通达信专有二进制文件格式解析的技术难题。项目采用模块化架构,从基础二进制解析到增强数据分类,最终实现智能语义化列名生成,形成完整的数据处理链路。核心技术包括自适应编码检测、智能数据类型推断和基于业务规则的语义化处理,解决了逆向工程、多编码兼容性等挑战。项目成果显著,解析成功率达100%,数据可读性大幅提升,开发效率提高50%,为量化交易、可视化分析等场景提供了可靠数据支持。该方案不仅具备技术创新性,更具有实际工程应用价值,为金融数据分析领域提供了可复

qq_36224726的博客 2688

【5.线性表的全部基本操作 】

数据结构线性表

爱喝阔落的猫的博客 689

从外包到转正:一个华为OD亲历者的真实工作体验与避坑指南

本文分享了一位华为OD员工从外包到转正的真实经历与实用建议。通过详细解析华为OD的日常工作、转正核心指标、机试备考技巧及职场突围策略,为读者提供了一份全面的避坑指南。特别针对机试E卷的高频考点和刷题方法,给出了具体的数据分析和实战经验。

weixin_33686714的博客 692

DisplayPort信号通道深度解析:从物理层到协议栈

DisplayPort(DP)是一种面向高速串行通信的数字显示接口标准,其核心在于嵌入式时钟、自适应均衡与链路训练三位一体的物理层架构。不同于HDMI依赖独立时钟的TMDS方案,DP通过差分主链路(Main Link)承载编码数据流,以8b/10b或128b/132b编码实现高带宽与强鲁棒性。该技术价值体现在多速率自适应、误码恢复能力及对PCB布线与阻抗控制的严苛要求,广泛应用于8K显示、工业视觉、GPU直连等高性能场景。本文聚焦DP信号通道的管脚级实现、三层协议解耦(物理层/数据链路层/事务层)及链路训练

weixin_34214500的博客 253

第4周项目1-建立单链表

问题及代码: /* *Copyright (c)2015,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:项目1.cbp *作 者:王聪 *完成日期:2015年9月21日 *版 本 号:v1.0 * *问题描述:定义单链表存储结构,用头插法和尾插法建立单链表,并显示建立好以后的结果。 *输入描述:无 *程序输出:输出头插法尾插发链表

进击的葱 833

多普勒效应及多普勒频移的简单推导

多普勒频移的简单推导

m0_47867419的博客 3万+

数据结构-线性表-链表的代码详解

继上篇文章对顺序表的介绍,这篇文章介绍链表,作为数据结构中最重要的一大模块,链表也是以后常用的 单链表是其中的核心,理解了单链表,其实链表的知识你也就掌握了。 代码附在最后!!!!    思路在程序注释。详解 一。 1.代码部分 一包    三类        节点类,链表类,测试类                  在学习过程中可以对着左侧行序号更改代码 2.节点类 3.链表...

飞鸟无痕丶的博客 1049

【RV1126/RV1109学习笔记】#基础篇#(2)基础入门使用

一、调试方式 1、串口调试 2、ADB调试 3、网络调试 二、基础外设使用 音频使用(aplay,arecord,amixer) 三、WIFI连接 四、屏幕背光控制

丨晋丨 1854

服务器搭建原神私服教程

项目的稳定版分支提供了编译好的服务端程序,但是博主觉得还是用dev版本的比较好。dev版本需要自己编译的,不要听到编译这两个字就头大,相反,这个服务端的编译相当简单。把文件中的两个IP地址127.0.0.1修改为你服务器的地址,修改完成后按 esc 输入 :wq。Mongodb作为服务端的数据库使用,我们这里安装最新版的Mongodb5。注意:如果想要使用最新版的服务端,必须安装>=17版本的java。tmux可以保证你关掉控制台的时候,程序依然继续运行。至此,服务端所需要的运行环境全部配置完成。

用最简单的方式说最重要的事!服务器、存储、云计 算、A智能的大数据产品、游戏开发技术。致力于广 大开发者、政企用户、各项机构等,构建云上世界提供全方位云计算解决方案。旨在打造差异化的开放式闭环生态系统帮助用户快速构建稳定、安全的云计算环境。 1万+

数据结构复习指导之线性表的链式表示(双链表,循环链表,静态链表,顺序表和链表的比较)

顺序表的存储位置可以用一个简单直观的公式表示,它可以随机存取表中任一元素,但插入和删除操作需要移动大量元素。 链式存储线性表时,不需要使用地址连续的存储单元,即不要求逻辑上相邻的元素在物理位置上也相邻,它通过“链”建立元素之间的逻辑关系,因此插入和删除操作不需要移动元素,而只需修改指针,但也会失去顺序表可随机存取的优点。

心碎烤肠的博客 1292

WPF用户控件间属性传递的艺术

本文详细介绍了WPF中父控件向子控件传递属性的方法。针对常见的绑定失效问题,重点讲解了使用RelativeSource绑定技术,通过指定AncestorType确保正确访问父控件属性。文章通过实例演示了从ParentModel传递属性到ChildUserControl依赖属性的完整实现过程,包括模型定义、XAML结构设计和代码实现。这种方法有效解决了数据上下文混淆问题,为WPF开发中的控件交互提供了可靠解决方案,有助于提升应用的灵活性和可维护性。

2501_90323865的博客 56

数据结构01——线性表及其相关操作(增删改查)java版

数据结构 —— 线性表——顺序表和单链表的增删改查(java实现版) 前言:最近在复习数据结构,进行分章总结复习到的知识点,当作笔记以加深记忆。同时以java语言进行具体的操作实现(eclipse实现),需要的同学可以适当作为参考,有不正确的地方欢迎指正。 #一:线性表的定义 什么是线性表呢?首先我们得明白,线性表是一种用来存储数据的线性结构! 一般我们这样来定义线性表:线性表是n(n...

北城落花雨的博客 3129

Jetson agx Orin 适配Xenomai4

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。

xiaoning132的专栏 465

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

HDU数据结构期末复习-2.线性表

《数据结构》复习笔记 由HDU-STEA_banjiu修改于2021年1月9日 参考书目:严蔚敏《数据结构(第二版)》、王导论坛《数据结构考研复习指导》、HDU-STEA_YY《<数据结构>复习笔记》 第二章 线性表 1.线性表的定义 相同数据类型n(n≥0)n(n\ge0)n(n≥0)个数据元素的有限序列,其中nnn为表长,当n=0n=0n=0时,线性表是一个空表。 若用LLL命名线性表,则一般表示为: L=(a1,a2,...,ai,ai+1,...,an) L=(a_1,a_2,...

weixin_48464590的博客 383

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

408个人复习记录,数据结构强化①

绪论与线性表部分 个人自用,欢迎提建议,不喜勿喷。

qq_58790067的博客 780

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

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

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

【Python】数据结构——线性表(顺序表、单链表、循环单链表、双链表、循环双链表)

线性表是由若干个具有相同特性的数据元素组成的有限序列 空表就是线性表中不包含任何元素,长度为零。当线性表非空时,线性表长度即线性表内数据元素的个数。 直接前驱:线性表某一个元素的前一个元素 直接后继:线性表某一个元素的后一个元素

二琳爱吃肉的博客 3666

数据结构复习篇:线性表

数据结构与算法,是编写高质量程序的内功之一,在打算步入社会寻找自己的第一份工作之际,我准备用一周左右的时间来复习一遍数据结构与算法。在任何时候重视基础知识,都不是一件多余的事。复习用书:《数据结构与算法分析 C++版》第二版 [美] Clifford A.Shaffer著,张铭、刘晓丹 等译 电子工业出版社一、线性表线性表是这样一种表结构,它的元素element存放在一个连续的表中,这

Chinainvent的专栏 3318

【Lico-数据结构1】线性表

数据结构考研,线性表:顺序表、链表

2301_76723906的博客 622

数据结构01——顺序表的插入运算

题目:在升序线性表中插入一个数据,使新的线性表仍是升序排列数组:#include&lt;iostream&gt; using namespace std; int main(){ int ary[1005]; int n,m,i,tmp,flag=0; cin&gt;&gt;n; for(i=0;i&lt;n;i++){ cin&gt;&gt;ary[i]; } cin&gt;...

chengchencheng的博客 4396

线性表算法题库_线性表算法试题 数据结构

数据结构复习题:线性表算法分析题1、己知一个顺序表L,其中的元素按值非递减有序排列,设计一个算法插入一个元素x后保持该顺序表仍按递减有序排列。要求算法的空间复杂度为O(1)。2、设计一个算法从顺序表L中删除所有值为X的元素。要求算法的空间复杂度为O(1)。3、从顺序表L中删除重复的元素,并使剩余元素间的相应次序保持不变.要求本算法的空间复杂记度为O(1)。4、有一个单链表(不同结点的数据域值可能相...

weixin_39636609的博客 556

数据结构复习

目录 第一章 绪论 第二章 线性表 顺序表 单链表 循环链表 第三章 栈和队列 栈 队列 矩阵的压缩存储 第四章 树与二叉树 树 二叉树 线索二叉树 树、森林 树和二叉树的应用 平衡二叉树 哈夫曼树 第五章 图 图的存储和基本操作 第六章 排序 直接插入排序 希尔排序 冒泡排序 快速排序 简单选择排序 归并排序 第一章 绪论 1、数据元...

m0_37579232的博客 1687

数据结构期末复习1

定义:算法是对特定问题求解步骤的一种描述,它是指令的有限序列特性有穷性:在执行有穷步之后结束,且每一步都可在有穷时间内完成确定性:对于相同的输入只能得出相同的输出,不能有二义性可行性:算法的每一个操作都能被机械地执行有输入:一个算法有0个或多个输入有输出:一个算法有0个或多个输出第4、5点表示存在数据处理描述:算法描述是指对算法进行清晰、简洁、易懂的表述。常用的算法描述方法有自然语言描述、流程图、伪代码和程序描述等。注意:&,引用型形参​ x=y;y=tmp;

f666665849的博客 1060

数据结构复习笔记

一、绪论 1、数据结构术语 1.数据:是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并 输入给计算机处理的符号集合。 2.数据对象:性质相同的数据元素的集合,数据的一个子集。 3.数据元素:数据元素是数据的基本单位,也叫做节点或记录。在计算机程序中通常作为一个整体进行考虑和处理。 4.数据项:数据项是数据的不可分割的最小单位。一个数据元素可由若干个数据项组成 2、数据结构三要素 数据存储结构:物理结构,数据真实存在计算机中的样子 顺序存储:存放在地址连续的存储单位里 链式存储:数据

wuyaxin 672
上一篇: 从Java虚拟机来看Java对象的等价性
下一篇: 《数据结构》复习之线性表(栈和队列)
King来写代码
博客等级 码龄12年 68粉丝 30原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值