4.单链表ADT模板简单应用算法设计:单链表中前 m 个元素和后 n 个元素的互换

【信息科学与工程学】计算机科学与自动化——第三百零五篇 计算机系统中的各类运算操作01 编号类型领域运算操作运算类型算法算法的详细设计及数学分析参数列表及参数的数值设计应用场景 (100+条)集合运算​1集合运算关系代数并集 (Union)集合运算归并排序去重合并两个集合,去除重复元素。时间复杂度 O(n+m),n,m为两集合大小。输入:集合A, B。输出:A∪B。数据集成、多表结果合并、去重后的全量数据提取。2集合运算关系代数交集 (Intersection)集合运算哈希交集找出同时属于两个集合的元素。平均时间复杂度 O(min(n,m)),最坏 O(n*m)。输入:集合A, B。输出:A∩ 阅读详情

问题描述 :

目的:使用C++模板设计单链表的抽象数据类型(ADT)。并在此基础上,使用单链表ADT的基本操作,设计并实现单链表的简单算法设计。

内容:(1)请使用模板设计单链表的抽象数据类型。(由于该环境目前仅支持单文件的编译,故将所有内容都集中在一个源文件内。在实际的设计中,推荐将抽象类及对应的派生类分别放在单独的头文件中。参考网盘中的ADT原型文件。)

(2)ADT的简单应用:使用该ADT设计并实现单链表应用场合的一些简单算法设计。

应用1:假设有一个带头结点的单链表A,现要求设计一个算法,实现单链表的就地逆置,即利用原表的存储空间实现表中前m 个元素和后n 个元素的互换。

参考函数原型:

template<class ElemType>

void Exchange_L( LinkList<ElemType> &L, int m );

单链表ADT原型如下:

/* 单链表的结点定义 */
template<class ElemType>
struct LinkNode
{
    ElemType data;
    LinkNode<ElemType> *next;
    LinkNode(LinkNode<ElemType> *ptr = NULL){next = ptr;}
    LinkNode(const ElemType &item, LinkNode<ElemType> *ptr = NULL)   
    //函数参数表中的形参允许有默认值,但是带默认值的参数需要放后面
    {
        next = ptr;
        data = item;
    }
};

//带头结点的单链表
template<class ElemType>
class LinkList:public link<ElemType>
{
   private:
      LinkNode<ElemType> *head;   // 头指针
      LinkNode<ElemType> *tail;   // 尾指针

   public:
      //无参数的构造函数
      LinkList(){head = new LinkNode<ElemType>; tail =head;}
      //带参数的构造函数
      LinkList(const ElemType &item){head = new LinkNode<ElemType>(item); tail = head;}
      //拷贝构造函数
      LinkList(LinkList<ElemType> &List);
      //析构函数
      ~LinkList(){ListDestroy();}
      //重载函数:赋值
      LinkList<ElemType>& operator=(LinkList<ElemType> &List);
      //销毁链表
      void ListDestroy();
      //清空链表
      void ListClear();
      //返回链表的长度
      int ListLength() const;
      //判断链表是否为空表
      bool ListEmpty() const;
      //在首结点之前插入一个结点
      bool InsFirst( ElemType &e );
      //在尾结点之前插入一个结点
      bool InsTail( ElemType &e );

      //获取链表头指针
      LinkNode<ElemType>* GetHead() const{ return head;}
      //获取链表尾指针
      LinkNode<ElemType>* GetTail() const{ return tail;}

      //设置链表头指针
      void SetHead(LinkNode<ElemType> *p){ head = p;}      
      //设置链表尾指针
      void SetTail(LinkNode<ElemType> *p){ tail = p;}      

      //用e返回链表的第i个元素
      ElemType GetElem(int pos);
      //在链表的第pos个位置之前插入e元素
      bool ListInsert(int pos,ElemType e);
      //删除链表的首结点
      //bool DelFirst( ElemType &e);
      //表头插入法动态生成链表
      void CreateList_Head(vector<ElemType> &A);     
      //表尾插入法动态生成链表
      void CreateList_Tail(vector<ElemType> &A);    
      //删除链表的第pos个位置的元素
      ElemType ListDelete(int pos);
      //compare函数,用来判断a和b是否相等
      //bool compare(ElemType a, ElemType *b);
      //按指定条件查找,返回指向第一个符合条件(=e)的元素的指针
      bool LocateElem(const ElemType &e, LinkNode<ElemType> * &pos);
      //返回链表给定数据元素的前驱数据元素的值
      //bool PriorElem(ElemType cur_e, ElemType &pri_e);
      //返回链表给定数据元素的后继数据元素的值
      bool NextElem(LinkNode<ElemType> *p, ElemType &e);
      //遍历链表
      bool ListTraverse() const;
};

输入说明 :

第一行:顺序表A的数据元素的数据类型标记(0:int,1:double,2:char,3:string)

第二行:待逆置单链表的数据元素(数据元素之间以空格分隔)

第三行:逆置位置m

输出说明 :

如第一行输入值为0、1、2、3之外的值,直接输出“err”

否则:

第一行:待逆置单链表的遍历结果(数据元素之间以"->"分隔)

空行

第三行:逆置后单链表的遍历结果(数据元素之间以"->"分隔)

这是一条分割线 


题解

对于其中的关键exchange函数的解析:

可以参考某网友的图解

 

法一:在创建单链表时,cin>>elem一个一个输入节点

完整AC代码:

#include<iostream>
using namespace std;

template<class T>
 struct LNode{
	T data;
	LNode<T>* next=NULL;
};

//遍历输出 
template <class T>
void traverse(LNode<T>& L,int length){
	LNode<T>* p=&L;//p初始化指向头节点
	for(int i=1;i<length;++i)
	{
		p=p->next;
		cout<<p->data<<"->";
	}
	cout<<p->next->data;
}
//将前m个节点与后n个节点互换 
template <class T>
void exchange(LNode<T>& L,int  m,int length){
	LNode<T>* rear;//尾指针 
	LNode<T>* p=&L;//p初始化指向头节点 
	LNode<T>* pm;
	
	for(int i=1;i<=length;i++)
	{
		p=p->next;
		if(i==m)	pm=p;//pm指向第m个节点 
	}
	rear=p;
	
	rear->next=L.next;
	L.next=pm->next;
	rear=pm;
}
//用后插法创建单链表 
template <class T>
void create(LNode<T>& L,int & length){

	LNode<T>* rear=&L;//尾指针 
	LNode<T>* p;//p用来指向每一个新输入的节点 
	T elem;
	while(cin>>elem)
	{
		length++;
		p=new LNode<T>;
		p->data=elem;
		rear->next=p;
		rear=p;
		if(cin.get()=='\n')	break;
		//cin会跳过空格和tab,cin.get()不会跳过空格,tab,回车 
	}
}

int main(){
	int kind=0;
	cin>>kind;
	if(kind==0)
	{
		LNode<int> L;
		int len=0;
		create(L,len);
		int m=0;
		cin>>m;
		traverse(L,len);
		cout<<endl<<endl;
		exchange(L,m,len);
		traverse(L,len);
	}
	else if(kind==1)
	{
		LNode<double> L;
		int len=0;
		create(L,len);
		int m=0;
		cin>>m;
		traverse(L,len);
		cout<<endl<<endl;
		exchange(L,m,len);
		traverse(L,len);
	}
	else if(kind==2)
	{
		LNode<char> L;
		int len=0;
		create(L,len);
		int m=0;
		cin>>m;
		traverse(L,len);
		cout<<endl<<endl;
		exchange(L,m,len);
		traverse(L,len);
	}
	else if(kind==3)
	{
		LNode<string> L;
		int len=0;
		create(L,len);
		int m=0;
		cin>>m;
		traverse(L,len);
		cout<<endl<<endl;
		exchange(L,m,len);
		traverse(L,len);
	}
	else
	{
		cout<<"err";
	}
	
	
	
	return 0;
}

 其中中的create函数创建单链表的方法借鉴了,DHU另一位朋友的写法

本菜鸟学到了用cin>>elem,和用cin.get()=='\n',来进行输入。cin,get()不会跳过空格,tab,以及换行符。

另外在写各个函数时,我用LNode<T>* L来作形参老是出问题,暂时我不清楚问题出在哪儿了,所以先略过。

法二:用getline(cin,str)整行输入,再用stringstream 类将str转换为单个节点存入链表。

只是在

template <class T>
void create(LNode<T>& L,int & length,stringstream &stream){

	LNode<T>* rear=&L;//尾指针 
	LNode<T>* p;//p用来指向每一个新输入的节点 
	T elem;
	while(stream>>elem)
	{
		length++;
		p=new LNode<T>;
		p->data=elem;
		rear->next=p;
		rear=p;
	}
}

 和主函数main()中有略微差别

int kind=0;
	cin>>kind;
	cin.get();//跳过换行符 
	string str;
	getline(cin,str);//结束符'\n'不会放入缓存区,会将读入的'\n'直接去除 
	stringstream stream;
	stream<<str;
	if(kind==0)
	{
		LNode<int> L;
		int len=0;
		create(L,len,stream);
		int m=0;
		cin>>m;
		traverse(L,len);
		cout<<endl<<endl;
		exchange(L,m,len);
		traverse(L,len);
	}

完整AC代码: 

#include<bits/stdc++.h>
using namespace std;

template<class T>
 struct LNode{
	T data;
	LNode<T>* next=NULL;
};

//遍历输出 
template <class T>
void traverse(LNode<T>& L,int length){
	LNode<T>* p=&L;//p初始化指向头节点
	for(int i=1;i<length;++i)
	{
		p=p->next;
		cout<<p->data<<"->";
	}
	cout<<p->next->data;
}
//将前m个节点与后n个节点互换 
template <class T>
void exchange(LNode<T>& L,int  m,int length){
	LNode<T>* rear;//尾指针 
	LNode<T>* p=&L;//p初始化指向头节点 
	LNode<T>* pm;
	
	for(int i=1;i<=length;i++)
	{
		p=p->next;
		if(i==m)	pm=p;//pm指向第m个节点 
	}
	rear=p;
	
	rear->next=L.next;
	L.next=pm->next;
	rear=pm;
}
//用后插法创建单链表 
template <class T>
void create(LNode<T>& L,int & length,stringstream &stream){

	LNode<T>* rear=&L;//尾指针 
	LNode<T>* p;//p用来指向每一个新输入的节点 
	T elem;
	while(stream>>elem)
	{
		length++;
		p=new LNode<T>;
		p->data=elem;
		rear->next=p;
		rear=p;
	}
}

int main(){
	int kind=0;
	cin>>kind;
	cin.get();//跳过换行符 
	string str;
	getline(cin,str);//结束符'\n'不会放入缓存区,会将读入的'\n'直接去除 
	stringstream stream;
	stream<<str;
	if(kind==0)
	{
		LNode<int> L;
		int len=0;
		create(L,len,stream);
		int m=0;
		cin>>m;
		traverse(L,len);
		cout<<endl<<endl;
		exchange(L,m,len);
		traverse(L,len);
	}
	else if(kind==1)
	{
		LNode<double> L;
		int len=0;
		create(L,len,stream);
		int m=0;
		cin>>m;
		traverse(L,len);
		cout<<endl<<endl;
		exchange(L,m,len);
		traverse(L,len);
	}
	else if(kind==2)
	{
		LNode<char> L;
		int len=0;
		create(L,len,stream);
		int m=0;
		cin>>m;
		traverse(L,len);
		cout<<endl<<endl;
		exchange(L,m,len);
		traverse(L,len);
	}
	else if(kind==3)
	{
		LNode<string> L;
		int len=0;
		create(L,len,stream);
		int m=0;
		cin>>m;
		traverse(L,len);
		cout<<endl<<endl;
		exchange(L,m,len);
		traverse(L,len);
	}
	else
	{
		cout<<"err";
	}
	
	
	
	return 0;
}

本菜鸟学到了:

1.getline(cin,str),可以输入整行,对于行末结束符'\n'不会放入缓存区,直接舍弃

2.stringstream  stream:常用于string字符串数据类型转换,详细信息请参考关于stringstream的使用

(有问题欢迎在评论区讨论)

RGB接口电容触摸屏驱动(二)接口与时序说明 阅读详情

相关推荐

FPGA实现Gardner环定时同步:Verilog代码与Testbench实战解析

本文深入解析了在FPGA上实现Gardner环定时同步的完整过程,详细阐述了其非数据辅助的定时误差检测原理。通过Verilog代码实战,展示了内插滤波器、定时误差检测器、环路滤波器和数控振荡器等核心模块的设计,并提供了完整的Testbench验证方法,帮助开发者解决数字通信系统中的时钟同步难题。

gpt4scribbler的博客 576

顺序表ADT模板设计及简单应用:将顺序表中前 m 个元素和后 n 个元素进行互换(数据结构OJ练习)(样例4553 WA)

顺序表ADT模板设计及简单应用:将顺序表中前 m 个元素和后 n 个元素进行互换 问题描述 目的:使用STL中的vector模板,设计并实现顺序表应用场合的一些简单算法设计。 应用1:试设计一个算法,用尽可能少的辅助空间将顺序表中前 m 个元素和后 n 个元素进行互换,即将线性表(a1,a2,…,am,b1,b2,…,bn) 改变成(b1,b2,…,bn,a1,a2,…,am)。 参考函数原型:template void Exchange( vector &A,int m );// 本算法实现顺序表

Blackoutdragon的博客 4449

UltraScale+ FPGA中GTY收发器参考时钟的跨Bank共享机制解析

本文深入解析了UltraScale+ FPGA中GTY收发器参考时钟的跨Bank共享机制,详细介绍了时钟布线架构、SLR区域限制及Vivado工程配置要点。通过实际案例和优化建议,帮助工程师解决高速串行通信中的时钟共享问题,提升系统性能。

weixin_29280219的博客 632

首尾交换数组元素

首尾交换数组元素

weixin_43401773的博客 1916

ArcGIS将以大西洋居中的世界地图以中国居中显示

ArcGIS将以大西洋居中的世界地图以中国居中显示 并进行经纬度格网的调整输出

jiekeheiguanglan的博客 5705

Cox构建预测模型(5):如何用R语言绘制校准曲线(附全套代码)

这篇文献通过绘制两个模型的DCA曲线来评估模型的临床决策实际需求,一个是列线图模型,包括纳入列线图的全部变量,一个是TNM模型,只纳入TNM分期3个变量。A图是训练集1年、3年、5年患者的总生存期的DCA曲线;B图是训练集1年、3年、5年患者的总生存期的DCA曲线,红色线条代表列线图模型(包括构建模型的10个变量),黄色线条代表TNM模型(仅纳入TNM分期3个变量),两个模型对比,在绘制校准图之前,必须要完成数据的导入、拆分数据集的工作、预测因子的筛选,校准图的绘制是分别在训练集与验证集独立进行的。

qq_37610365的博客 1360

单链表的逆转:(头尾互换)

单链表的逆转:(头尾互换) 1 迭代反转(适用于反转不带头节点的链表) 从当前链表的首元节点开始,一直遍历到链表的最后一个节点,这期间逐个改变所遍历到的节点的指针域,另其指向前一个节点。 方法是借用三个指针, 首先三个指针 begin mid end 分别指向 null 第一个节点 第二个节点 然后遍历就是各向后移动一个节点,直至mid指向链表中最后一个节点(此时end 为null)。 代码:head为无头节点链表的头指针 link * iterat...

芸芸众生 912

Delphi解决 openssl DLL 与 Indy 的SSL/TLS 连接问题

​ 使用 SSL 连接时出错。错误 1409442E:SSL 例程:ssl3_read_bytes:tlsv1 警报协议版本 由于我使用的是最新版本的Indy,根据Delphi Praxis 上的此线程,这种情况不应该发生。事实证明,不知何故,一个非常旧版本的 openssl DLLlibeay32.dll和ssleay32.dll已被放置在我计算机上的 sarch 路径中(版本 1.0.0e)。

Delphi开发局QQ群:32422310 2495

C语言链表移动

链表移动

m0_74284464的博客 297

naca翼型_STARCCM+计算二维翼型气动性能

STAR-CCM+计算二维翼型气动性能一算例背景机翼理论主要研究翼型在流体中运动时的力学特性。在工程领域中,机翼以升力面、控制面、叶片或桨叶等形式出现。舰船上的舵、水翼、减摇鳍等都是机翼,螺旋桨、汽轮机叶片和压缩机叶片也都是利用机翼原理工作的,而在研究船舶操纵性时,甚至还可把船体的水下部分看作一个巨大的机翼。随着航空科学的发展,世界各主要航空发达的国家建立了各种翼型系列。美国有NACA系...

weixin_39863741的博客 1万+

5、自适应 RBF 神经网络控制方法解析

本文详细解析了基于RBF神经网络的多种自适应控制方法,包括针对函数未知、参数未知以及存在外部干扰的非线性系统的控制策略。通过李雅普诺夫稳定性理论设计自适应律,确保闭环系统稳定,并结合仿真示例和MATLAB代码实现,展示了方法的有效性。文章还对比了不同控制方法的适用场景,并给出了实际应用流程,为复杂系统控制提供了系统性解决方案。

ol789012的博客 74

反转链表

给定一个链表进行反转 1->2->3->4->null null->4->3->2->1 双指针法 public ListNode reverseList2(ListNode head){ ListNode pre=null; ListNode cur=head; ListNode temp; while (cur!=null){ temp=cur.next

BetterCbx的博客 250

Cesium教程(十七):淹没分析

淹没分析是根据某片区域的地形及洪水流量速度,动态模拟该地形区域水位逐渐上涨的淹没过程。该功能可适用于山区、丘陵等地形起伏较大区域,模拟洪水涨到安全限定高度的淹没过程,为防洪水救灾提供一定的参考。此外,还可以为河谷地带修建水利工程设计与选址提供参考依据。

WwLK123的博客 3008

4 单链表ADT模板简单应用算法设计:单链表中前 m 个元素和后 n 个元素的互换

问题描述: 目的:使用C++模板设计单链表的抽象数据类型(ADT)。并在此基础上,使用单链表ADT的基本操作,设计并实现单链表的简单算法设计。 内容:(1)请使用模板设计单链表的抽象数据类型。(由于该环境目前仅支持单文件的编译,故将所有内容都集中在一个源文件内。在实际的设计中,推荐将抽象类及对应的派生类分别放在单独的头文件中。参考网盘中的ADT原型文件。) (2)ADT的简单应用:使用该ADT设计并实现单链表应用场合的一些简单算法设计。 应用1:假设有一个带头结点的单链表A,现要求设计一个算法,实现单链表

m0_51727949的博客 1374

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

单链表ADT模板简单应用算法设计:单链表中前 m 个元素和后 n 个元素的互换

问题描述 目的:使用C++模板设计单链表的抽象数据类型(ADT)。并在此基础上,使用单链表ADT的基本操作,设计并实现单链表的简单算法设计。 内容:(1)请使用模板设计单链表的抽象数据类型。(由于该环境目前仅支持单文件的编译,故将所有内容都集中在一个源文件内。在实际的设计中,推荐将抽象类及对应的派生类分别放在单独的头文件中。参考网盘中的ADT原型文件。) (2)ADT的简单应用:使用该ADT设计并实现单链表应用场合的一些简单算法设计。 应用1:假设有一个带头结点的单链表A,现要求设计一个算法,实现单链表的就

Blackoutdragon的博客 2177

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

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

DHU数据结构-单链表-ADT应用-单链表中前m个元素和后n个元素的互换

1.题目 个元素的互换 作者: 冯向阳时间限制: 1S章节: DS:线性表 问题描述 : 目的:使用C++模板设计单链表的抽象数据类型(ADT)。并在此基础上,使用单链表ADT的基本操作,设计并实现单链表的简单算法设计。 内容:(1)请使用模板设计单链表的抽象数据类型。(由于该环境目前仅支持单文件的编译,故将所有内容都集中在一个源文件内。在实际的设计中,推荐将抽象类及对应的派生类分别放在单独的头文件中。参考网盘中的ADT原型文件。) (2)ADT的简单应用:使用该ADT设计并实现单...

m0_49843646的博客 1759

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

【东华大学oj】单链表ADT模板简单应用算法设计:单链表中前 m 个元素和后 n 个元素的互换

内容:(1)请使用模板设计单链表的抽象数据类型。应用1:假设有一个带头结点的单链表A,现要求设计一个算法,实现单链表的就地逆置,即利用原表的存储空间实现表中前m 个元素和后n 个元素的互换。并在此基础上,使用单链表ADT的基本操作,设计并实现单链表的简单算法设计。第一行:顺序表A的数据元素的数据类型标记(0:int,1:double,2:char,3:string)(2)ADT的简单应用:使用该ADT设计并实现单链表应用场合的一些简单算法设计。第一行:待逆置单链表的遍历结果(数据元素之间以"->"分隔)

的博客 541

【单链表】19 单链表ADT模板简单应用算法设计:单链表中前 m 个元素和后 n 个元素的互换

问题描述 : 目的:使用C++模板设计单链表的抽象数据类型(ADT)。并在此基础上,使用单链表ADT的基本操作,设计并实现单链表的简单算法设计。 内容:(1)请使用模板设计单链表的抽象数据类型。(由于该环境目前仅支持单文件的编译,故将所有内容都集中在一个源文件内。在实际的设计中,推荐将抽象类及对应的派生类分别放在单独的头文件中。参考网盘中的ADT原型文件。) (2)ADT的简单应用:使用该ADT设计并实现单链表应用场合的一些简单算法设计。 应用6:假设2个线性表分别由单链表A和B存储,其..

windyuan~ 876

c语言指针实现有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数...

好的,我来帮你解决这个问题。 在 C 语言中,要使用指针实现将前面的数顺序向后移 m 个位置,最后的 m 个数变成最前面的 m 个数,你可以这样做: 声明一个整型数组和一个指向整型的指针变量,并将指针变量指向数组的第一个元素,即:int arr[N]; int *p = arr; 使用一个循环,将前面的数向后移 m 个位置,并将最后的 m 个数赋值给最前面的 m 个位置,如下所示:for (...

weixin_35756892的博客 2703

数组循环位移(前m个和后n个调换)

数组循环位移(前m个和后n个调换)

weixin_45653543的博客 382

#数据结构# 位运算实现数组头尾元素依次对调(C++)

#include<iostream> #include<string> using namespace std; void implace_swap(int *x,int *y){ *y = *x ^ *y; *x = *x ^ *y; *y = *x ^ *y; } void reverse_array(int a[],int l){ for(int i = 0,j = l-1;i < j;i++,j--){ implace_swap(&a[i],&am

wsmazh的博客 522

链表移动。

编写一个函数,将给定的带有头结点的单向链表的前m个节点移到链尾。 结构的定义: struct node { int num; struct node *next; } 函数的原型:struct node *monenode( struct node *head,int m ), 其中:参数head 是单向链表的头指针;参数m 是要移动的节点数。函数的返回值是单向链表的头指针。...

weixin_61972874的博客 1230

c语言头尾数据交换反转字符串,C++ 字符串的反转五种方法实例

//通过不同的方法,实现对所输入字符串的反转,可以很好地复习巩固 C++ 基础知识/*分析过程:假设要使传递的字符串为常量const字符串,这样操作更加灵活,可直接传递字符串字面值进行反转,常见的解决方法就是,定义一个新的与传递过来字符串长度相等的字符数组,然后进行字符串拷贝,把str字符按从左到右放置到字符数组中,然后采用循环来对字符数组中字符反转*//*第一种,采用以上思路解法,传递为cons...

weixin_33266645的博客 1205

将链表后k个节点移到链表头

给一个链表和整数k,将后k个节点移到链表头。 For example: Given:1-2-3-4-5,k =2, return:4-5-1-2-3.

Ananbei的博客 1617
下一篇: 单链表ADT模板简单应用算法设计:单链表的逆置
Biggoose-wl
博客等级 码龄6年 1粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值