c语言顺序表

目录

 

1.什么是顺序表?

2.定义顺序表的结构

2.1静态顺序表的定义

2.2动态顺序表的定义

3.顺序表的实现(创建,增,删,查,改)

3.1顺序表的创建

 

3.2顺序表的销毁 

 3.3尾插

 3.4头插

3.5顺序表的打印

3.5 头删

3.6尾删

 3.7删除指定位置的元素

3.8插入指定下标位置的元素 

 3.9顺序表的查找

 


 

 

 


 

1.什么是顺序表?

顺序表,全名顺序存储结构,是线性表的一种。通过《什么是线性表》一节的学习我们知道,线性表用于存储逻辑关系为“一对一”的数据,顺序表自然也不例外。

不仅如此,顺序表对数据的物理存储结构也有要求。顺序表存储数据时,会提前申请一整块足够大小的物理空间,然后将数据依次存储起来,存储时做到数据元素之间不留一丝缝隙。

例如,使用顺序表存储集合 {1,2,3,4,5},数据最终的存储状态如图 1 所示:


 

3ea81482a8c15ed0294e0409cb79eb04.gif


图 1 顺序存储结构示意图


由此我们可以得出,将“具有 '一对一' 逻辑关系的数据按照次序连续存储到一整块物理空间上”的存储结构就是顺序存储结构。

通过观察图 1 中数据的存储状态,我们可以发现,顺序表存储数据同数组非常接近。其实,顺序表存储数据使用的就是数组

2.定义顺序表的结构

2.1静态顺序表的定义

//静态顺序表
struct Seqlist
{
int arr[100];//定长数组
int size;//顺序表中有效的数据个数
}

2.2动态顺序表的定义

//动态顺序表
struct Seqlist
{
int* arr;
int size;//顺序表中有效的数据个数
int capacity;//每个节点的空间大小
};

这两种哪种更好呢?

 

显然是第二种更好,因为第一种,数据给大了,会导致空间浪费,数据给小了,会导致空间不够,第二种可以进行动态增容

3.顺序表的实现(创建,增,删,查,改)

我们一般分为两个文件来写

805319957da744debde24254f754627f.jpeg

 

3.1顺序表的创建

SeqList.h声明

#pragma once//防止该文件被重复包含
#include<stdio.h>
#include<stdlib.h>
//动态顺序表
typedef int SLDataType ;//搞个一键替换,可以一码多用
typedef struct Seqlist
{
SLDataType* arr;
int size;//顺序表中有效的数据个数
int capacity;//每个节点的空间大小
}SL;
void SLInit(SL* ps);

SeqList.c传址初始化

#include"SeqList.h"
void SLInit(SL* ps)
{
ps->arr=NULL;
ps->size=ps->capacity=0;
}

text.c测试

#define _CRT_DIRECTORY_DEFINED
#include"SeqList.h"

void SLTest01()//初始化测试
{
	SL s1;
	SLInit(&s1);
}
int main()
{

SLTest01();


return 0;
}

这里选择用指针传址初始化而不是传值初始化是因为没有给结构体元素初始化,传不了值,调试一下看看是否创建成功 

af59f8202027463c80d1dfb098c59fbd.png

 

3.2顺序表的销毁 

SeqList.h声明

//顺序表的销毁
void SLDestroy(SL* ps);

 SeqList.c实现

void SLDestroy(SL* ps)
{
if(ps->arr)
{
	free(ps->arr);
}
ps->arr=NULL;
ps->size=ps->capacity=0;
}

 3.3尾插

  SeqList.h声明

//开辟空间
void SLCheckCapacity(SL*ps);
//顺序表尾部插入
void SLPushBack(SL* ps,SLDataType x);

SeqList.c实现

//申请空间
void SLCheckCapacity(SL* ps)
{
	if(ps->capacity  ==  ps->size)//判断当前空间大小和有效数据个数是否相等,如果相等,空间不够得开辟空间
	{
	//	创建临时变量,realloc可能申请失败,防止原地址丢失返回NULL
  SLDataType newCapacity= ps->capacity== 0 ? 4 : 2 * ps->capacity;
  SLDataType* tmp =(SLDataType*)realloc(ps->arr,newCapacity * sizeof(SLDataType));
if(tmp==NULL)
{
perror("realloc");
exit(1);//直接退出程序,不再执行
}
ps->arr=tmp;
ps->capacity=newCapacity;
	}
}

//尾插
void SLPushBack(SL* ps,SLDataType x)
	{assert(ps);
SLCheckCapacity(ps);//开辟空间
	//插入数据x,有效个数size +1
	ps->arr[ps->size++]=x;
}

 text.c测试

#define _CRT_DIRECTORY_DEFINED
#include"SeqList.h"

void SLTest01()//初始化测试
{
//顺序表的创建
SL sl;
SLInit(&sl);
//顺序表的销毁

//尾插
SLPushBack(&sl,1);
SLPushBack(&sl,2);
SLPushBack(&sl,3);
SLPushBack(&sl,4);
SLPushBack(&sl,5);
SLPushBack(&sl,6);
SLPushBack(&sl,7);
SLDestroy(&sl);
}
int main()
{

SLTest01();


return 0;
}

 

测试结果

d74c6eaef329424aad35b22eee0682b9.png

 3.4头插

SeqList.h声明

//开辟空间
void SLCheckCapacity(SL*ps);
//顺序表头部插入
void SLPushFront(SL* ps,SLDataType x);

SeqList.c实现

//申请空间
void SLCheckCapacity(SL* ps)
{
	if(ps->capacity  ==  ps->size)//判断当前空间大小和有效数据个数是否相等,如果相等,空间不够得开辟空间
	{
	//	创建临时变量,realloc可能申请失败,防止原地址丢失返回NULL
  SLDataType newCapacity= ps->capacity== 0 ? 4 : 2 * ps->capacity;
  SLDataType* tmp =(SLDataType*)realloc(ps->arr,newCapacity * sizeof(SLDataType));
if(tmp==NULL)
{
perror("realloc");
exit(1);//直接退出程序,不再执行
}
ps->arr=tmp;
ps->capacity=newCapacity;
	}
}
//头插

void SLPushFront(SL* ps,SLDataType x)
{int i;
	assert(ps);
	SLCheckCapacity(ps);
	//先让顺序表中的位置整体往后移动
	
	for(  i=ps->size;i>0;i--)
	{
	ps->arr[i]=ps->arr[i-1];//arr[0]=arr[1]  arr[1]=arr[2]...
	
	
	}
ps->arr[0]=x;

}

text.c测试

#define _CRT_DIRECTORY_DEFINED
#include"SeqList.h"

void SLTest01()//初始化测试
{
//顺序表的创建
SL sl;
SLInit(&sl);
//顺序表的销毁

//尾插
SLPushBack(&sl,1);
SLPushBack(&sl,2);
SLPushBack(&sl,3);
SLPushBack(&sl,4);
SLPushBack(&sl,5);
SLPushBack(&sl,6);
SLPushBack(&sl,7);
//头插
SLPushFront( &sl,8);
SLDestroy(&sl);
}
int main()
{

SLTest01();


return 0;
}

 测试结果e15b52bd103a40b998acc0bd6bcec559.png

 

 41ae12f6c5f543b28813e3d2895a6ef0.png

3.5顺序表的打印

SeqList.h声明

//打印顺序表
void SLPrint(SL s);

SeqList.c实现

void SLPrint(SL s)
{int i=0;//打印arr
	for(i=0;i<s.size;i++)
	{
		printf(" %d",s.arr[i]);
	}
	printf("\n");
}

效果展示

 

#define _CRT_DIRECTORY_DEFINED
#include"SeqList.h"

void SLTest01()//初始化测试
{
//顺序表的创建
SL sl;
SLInit(&sl);
//顺序表的销毁

//尾插
SLPushBack(&sl,1);
SLPushBack(&sl,2);
SLPushBack(&sl,3);
SLPushBack(&sl,4);
SLPushBack(&sl,5);
SLPushBack(&sl,6);
SLPushBack(&sl,7);
//头插
SLPushFront( &sl,8);
SLDestroy(&sl);
}
int main()
{

SLTest01();


return 0;
}

3.5 头删

SeqList.h声明

//头删
void SLPopFront(SL* ps);

 SeqList.c实现

//头删
void SLPopFront(SL* ps)
{int i=0;
	assert(ps);
	assert(ps->size);
	//顺序表不为空才能进行删除
	
	for(i=0;i<ps->size-1;i++)
	{
		ps->arr[i]=ps->arr[i+1];// 1 2 3 4 arr[i]=arr[i+1]
		                       // 2 3 4    遍历dize-1次
	   //	有效个数-1			 

	}
--ps->size ;

}

text.c测试

 

#define _CRT_DIRECTORY_DEFINED
#include"SeqList.h"

void SLTest01()//初始化测试
{
//顺序表的创建
SL sl;
SLInit(&sl);
printf("这是尾插\n");
//尾插
SLPushBack(&sl,1);
SLPrint(sl);
SLPushBack(&sl,2);
SLPrint(sl);
SLPushBack(&sl,3);
SLPrint(sl);
SLPushBack(&sl,4);
SLPrint(sl);
SLPushBack(&sl,5);
SLPrint(sl);
SLPushBack(&sl,6);
SLPrint(sl);
SLPushBack(&sl,7);
SLPrint(sl);
//打印
printf("这是头插\n");
SLPrint(sl);
//头插
SLPushFront( &sl,8);
//打印
SLPrint(sl);
printf("这是尾删\n");
SLPopBack(&sl);//尾删一次,打印一次
SLPrint(sl);
SLPopBack(&sl);//尾删一次,打印一次
SLPrint(sl);
SLPopBack(&sl);//尾删一次,打印一次
SLPrint(sl);
printf("这是头删\n");
//头删
SLPopFront(&sl);//尾删一次,打印一次
SLPrint(sl);
SLPopFront(&sl);//尾删一次,打印一次
SLPrint(sl);
//销毁
SLDestroy(&sl);
}
int main()
{

SLTest01();


return 0;
}

效果展示

 cd2d0b4ea02e4cf1a533cedfc4614df2.png

 

3.6尾删

 

SeqList.h声明

//尾删
void SLPopBack(SL* ps);

SeqList.c实现

//尾删
void SLPopBack(SL* ps)
{
	assert(ps);
	assert(ps->size);
	//顺序表不为空才能进行删除

	ps->arr[ps->size]=-1;//这一步可为可不为,只需让size--即可,后面进行尾插的时候会被覆盖掉
	ps->size--;//	有效个数-1

}

测试text.c

#define _CRT_DIRECTORY_DEFINED
#include"SeqList.h"

void SLTest01()//初始化测试
{
//顺序表的创建
SL sl;
SLInit(&sl);
//顺序表的销毁

//尾插
SLPushBack(&sl,1);
SLPushBack(&sl,2);
SLPushBack(&sl,3);
SLPushBack(&sl,4);
SLPushBack(&sl,5);
SLPushBack(&sl,6);
SLPushBack(&sl,7);
//打印
SLPrint(sl);
//头插
SLPushFront( &sl,8);
//打印
SLPrint(sl);

SLPopBack(&sl);//尾删一次,打印一次
SLPrint(sl);
SLPopBack(&sl);//尾删一次,打印一次
SLPrint(sl);
SLPopBack(&sl);//尾删一次,打印一次
SLPrint(sl);
//销毁
SLDestroy(&sl);
}
int main()
{

SLTest01();


return 0;
}

效果展示

 

05e7e1d79d1f41bda09129901eae74a3.png

 3.7删除指定位置的元素

 SeqList.h声明

//删除指定下标位置数据
void SLErase(SL* ps,int pos);

SeqList.c实现

//在指定删除位置 删除下标为pos的元素
void SLErase(SL* ps,int pos)
{int i;
	assert(ps);
	assert(pos>=0&&pos<=ps->size);

	for(i=pos;i<ps->size-1;i++)
	{
		ps->arr[i]=ps->arr[i+1];//arr[i]=arr[i+1]
	}
	ps->size--;
}

 text.c测试

 

SL sl;
SLInit(&sl);
printf("这是尾插\n");
//尾插
SLPushBack(&sl,1);
SLPrint(sl);
SLPushBack(&sl,2);
SLPrint(sl);
SLPushBack(&sl,3);
SLPrint(sl);
SLPushBack(&sl,4);
SLPrint(sl);
SLPushBack(&sl,5);
SLPrint(sl);
SLPushBack(&sl,6);
SLPrint(sl);
SLPushBack(&sl,7);
SLPrint(sl);
//打印
printf("这是头插\n");
SLPrint(sl);
//头插
SLPushFront( &sl,8);
//打印
SLPrint(sl);
printf("这是尾删\n");
SLPopBack(&sl);//尾删一次,打印一次
SLPrint(sl);
SLPopBack(&sl);//尾删一次,打印一次
SLPrint(sl);
SLPopBack(&sl);//尾删一次,打印一次
SLPrint(sl);
printf("这是头删\n");
//头删
SLPopFront(&sl);//尾删一次,打印一次
SLPrint(sl);
SLPopFront(&sl);//尾删一次,打印一次
SLPrint(sl);
printf("这是在删除指定下标的元素\n");
//在指定删除位置
 SLErase(&sl,2);
 SLPrint(sl);
//销毁
SLDestroy(&sl);
}
int main()
{
SLTest01();
return 0;
}

效果

da1eb306932a44efa11a718e8428a30d.png

3.8插入指定下标位置的元素 

SeqList.h声明

//指定位置前插入
void SLInsert(SL* ps,int pos,SLDataType x);

SeqList.c实现

//指定位置前插入 在下标为pos之前插入x
void SLInsert(SL* ps,int pos,SLDataType x)
{	
	int i;
	assert(ps);
	assert(pos>=0&&pos<=ps->size);
    SLCheckCapacity(ps);//判断是否要增容
for(i=ps->size;i>pos;i--)//在pos之后的元素全部后移一位
	{
 ps->arr[i]=ps->arr[i-1];
	}
 ps->arr[pos]=x;//插入x
 ps->size++;
}

text.c测试

#define _CRT_DIRECTORY_DEFINED
#include"SeqList.h"

void SLTest01()//初始化测试
{
//顺序表的创建
SL sl;
SLInit(&sl);
printf("这是尾插\n");
//尾插
SLPushBack(&sl,1);
SLPrint(sl);
SLPushBack(&sl,2);
SLPrint(sl);
SLPushBack(&sl,3);
SLPrint(sl);
SLPushBack(&sl,4);
SLPrint(sl);
SLPushBack(&sl,5);
SLPrint(sl);
SLPushBack(&sl,6);
SLPrint(sl);
SLPushBack(&sl,7);
SLPrint(sl);
//打印
printf("这是头插\n");
SLPrint(sl);
//头插
SLPushFront( &sl,8);
//打印
SLPrint(sl);
printf("这是尾删\n");
SLPopBack(&sl);//尾删一次,打印一次
SLPrint(sl);
SLPopBack(&sl);//尾删一次,打印一次
SLPrint(sl);
SLPopBack(&sl);//尾删一次,打印一次
SLPrint(sl);
printf("这是头删\n");
//头删
SLPopFront(&sl);//尾删一次,打印一次
SLPrint(sl);
SLPopFront(&sl);//尾删一次,打印一次
SLPrint(sl);
printf("这是在删除指定下标的元素\n");
//在指定删除位置
 SLErase(&sl,2);
 SLPrint(sl);
 printf("这是在指定位置之前插入\n");
//在指定位置之前插入数,下标为0,2
SLInsert(&sl,0,9);
SLPrint(sl);
SLInsert(&sl,2,8);
SLPrint(sl);
//销毁
SLDestroy(&sl);
}
int main()
{
SLTest01();
return 0;
}

效果

8914c87dc45a44a1a7a6843d5592cff8.png

 3.9顺序表的查找

 

SeqList.h声明

//查找数据
int SLFind(SL* ps,SLDataType x);

SeqList.c实现

//查找
int SLFind(SL* ps,SLDataType x)
{int i,count=0;
	assert(ps);
	for(i=0;i<ps->size;i++)
	{
		if(ps->arr[i]==x)
		{//找到了
			return i;
	    }

	
	}
	//没找到
	return -1;
}

text.c测试

#define _CRT_DIRECTORY_DEFINED
#include"SeqList.h"

void SLTest01()//初始化测试
{int find;
//顺序表的创建
SL sl;
SLInit(&sl);
printf("这是尾插\n");
//尾插
SLPushBack(&sl,1);
SLPrint(sl);
SLPushBack(&sl,2);
SLPrint(sl);
SLPushBack(&sl,3);
SLPrint(sl);
SLPushBack(&sl,4);
SLPrint(sl);
SLPushBack(&sl,5);
SLPrint(sl);
SLPushBack(&sl,6);
SLPrint(sl);
SLPushBack(&sl,7);
SLPrint(sl);
//打印
printf("这是头插\n");
SLPrint(sl);
//头插
SLPushFront( &sl,8);
//打印
SLPrint(sl);
printf("这是尾删\n");
SLPopBack(&sl);//尾删一次,打印一次
SLPrint(sl);
SLPopBack(&sl);//尾删一次,打印一次
SLPrint(sl);
SLPopBack(&sl);//尾删一次,打印一次
SLPrint(sl);
printf("这是头删\n");
//头删
SLPopFront(&sl);//尾删一次,打印一次
SLPrint(sl);
SLPopFront(&sl);//尾删一次,打印一次
SLPrint(sl);
printf("这是在删除指定下标的元素\n");
//在指定删除位置
 SLErase(&sl,2);
 SLPrint(sl);
 printf("这是在指定位置之前插入\n");
//在指定位置之前插入数,下标为0,2
SLInsert(&sl,0,9);
SLPrint(sl);
SLInsert(&sl,2,8);
SLPrint(sl);
//查找

 find=SLFind(&sl, 8);
if(find>0)
	 printf("找到了下标为%d\n",find);
//销毁
SLDestroy(&sl);
}
int main()
{
SLTest01();
return 0;
}

效果

4c15190edf734e05948536f8743b5f72.png

 全部代码

SeqList.h声明

#pragma once//防止该文件被重复包含
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
//动态顺序表
typedef int SLDataType ;//搞个一键替换,可以一码多用
typedef struct Seqlist
{
SLDataType* arr;//指向存储SLDataType类型的数据的地址
int size;//顺序表中有效的数据个数
int capacity;//每个节点的空间大小
}SL;
//顺序表的创建
void SLInit(SL* ps);

//顺序表的销毁
void SLDestroy(SL* ps);

//开辟空间
void SLCheckCapacity(SL*ps);

//顺序表尾部插入
void SLPushBack(SL* ps,SLDataType x);

//顺序表头部插入
void SLPushFront(SL* ps,SLDataType x);
//

//打印顺序表
void SLPrint(SL s);
//尾删
void SLPopBack(SL* ps);
//头删
void SLPopFront(SL* ps);
//指定位置前插入
void SLInsert(SL* ps,int pos,SLDataType x);
//删除指定下标位置数据
void SLErase(SL* ps,int pos);
//查找数据
int SLFind(SL* ps,SLDataType x);

SeqList.c实现

#include"SeqList.h"
//创建顺序表
void SLInit(SL* ps)
{
ps->arr=NULL;
ps->size=ps->capacity=0;
}
//顺序表的销毁
void SLDestroy(SL* ps)
{
if(ps->arr)
{
	free(ps->arr);
}
ps->arr=NULL;
ps->size=ps->capacity=0;
}
//申请空间
void SLCheckCapacity(SL* ps)
{
	if(ps->capacity  ==  ps->size)//判断当前空间大小和有效数据个数是否相等,如果相等,空间不够得开辟空间
	{
	//	创建临时变量,realloc可能申请失败,防止原地址丢失返回NULL
  SLDataType newCapacity= ps->capacity== 0 ? 4 : 2 * ps->capacity;
  SLDataType* tmp =(SLDataType*)realloc(ps->arr,newCapacity * sizeof(SLDataType));
if(tmp==NULL)
{
perror("realloc");
exit(1);//直接退出程序,不再执行
}
ps->arr=tmp;
ps->capacity=newCapacity;
	}
}

//尾插
void SLPushBack(SL* ps,SLDataType x)
	{assert(ps);
SLCheckCapacity(ps);//开辟空间
	//插入数据x,有效个数size +1
	ps->arr[ps->size++]=x;
}



//头插

void SLPushFront(SL* ps,SLDataType x)
{int i;
	assert(ps);
	SLCheckCapacity(ps);
	//先让顺序表中的位置整体往后移动
	
	for(  i=ps->size;i>0;i--)
	{
	ps->arr[i]=ps->arr[i-1];//arr[0]=arr[1]  arr[1]=arr[2]...
	
	
	}
ps->arr[0]=x;//插入x
ps->size++;//头插完有效个数+1

}
void SLPrint(SL s)
{int i=0;//打印arr
	for(i=0;i<s.size;i++)
	{
		printf(" %d",s.arr[i]);
	}
	printf("\n");
}
//尾删
void SLPopBack(SL* ps)
{
	assert(ps);
	assert(ps->size);
	//顺序表不为空才能进行删除

	ps->arr[ps->size]=-1;//这一步可为可不为,只需让size--即可,后面进行尾插的时候会被覆盖掉
	ps->size--;//	有效个数-1

}
//头删
void SLPopFront(SL* ps)
{int i=0;
	assert(ps);
	assert(ps->size);
	//顺序表不为空才能进行删除
	
	for(i=0;i<ps->size-1;i++)
	{
		ps->arr[i]=ps->arr[i+1];// 1 2 3 4 arr[i]=arr[i+1]
		                       // 2 3 4    遍历dize-1次
	   //	有效个数-1			 

	}
--ps->size ;

}

//指定位置前插入 在下标为pos之前插入x
void SLInsert(SL* ps,int pos,SLDataType x)
{	
	int i;
	assert(ps);
	assert(pos>=0&&pos<=ps->size);
    SLCheckCapacity(ps);//判断是否要增容
for(i=ps->size;i>pos;i--)//在pos之后的元素全部后移一位
	{
 ps->arr[i]=ps->arr[i-1];
	}
 ps->arr[pos]=x;//插入x
 ps->size++;
}//有效个数+1//在指定删除位置 删除下标为pos的元素
void SLErase(SL* ps,int pos)
{int i;
	assert(ps);
	assert(pos>=0&&pos<=ps->size);

	for(i=pos;i<ps->size-1;i++)
	{
		ps->arr[i]=ps->arr[i+1];//arr[i]=arr[i+1]
	}
	ps->size--;
}
//查找
int SLFind(SL* ps,SLDataType x)
{int i,count=0;
	assert(ps);
	for(i=0;i<ps->size;i++)
	{
		if(ps->arr[i]==x)
		{//找到了
			return i;
	    }

	
	}
	//没找到
	return -1;
}

text.c

#define _CRT_DIRECTORY_DEFINED
#include"SeqList.h"

void SLTest01()//初始化测试
{int find;
//顺序表的创建
SL sl;
SLInit(&sl);
printf("这是尾插\n");
//尾插
SLPushBack(&sl,1);
SLPrint(sl);
SLPushBack(&sl,2);
SLPrint(sl);
SLPushBack(&sl,3);
SLPrint(sl);
SLPushBack(&sl,4);
SLPrint(sl);
SLPushBack(&sl,5);
SLPrint(sl);
SLPushBack(&sl,6);
SLPrint(sl);
SLPushBack(&sl,7);
SLPrint(sl);
//打印
printf("这是头插\n");
SLPrint(sl);
//头插
SLPushFront( &sl,8);
//打印
SLPrint(sl);
printf("这是尾删\n");
SLPopBack(&sl);//尾删一次,打印一次
SLPrint(sl);
SLPopBack(&sl);//尾删一次,打印一次
SLPrint(sl);
SLPopBack(&sl);//尾删一次,打印一次
SLPrint(sl);
printf("这是头删\n");
//头删
SLPopFront(&sl);//尾删一次,打印一次
SLPrint(sl);
SLPopFront(&sl);//尾删一次,打印一次
SLPrint(sl);
printf("这是在删除指定下标的元素\n");
//在指定删除位置
 SLErase(&sl,2);
 SLPrint(sl);
 printf("这是在指定位置之前插入\n");
//在指定位置之前插入数,下标为0,2
SLInsert(&sl,0,9);
SLPrint(sl);
SLInsert(&sl,2,8);
SLPrint(sl);
//查找

 find=SLFind(&sl, 8);
if(find>0)
	 printf("找到了下标为%d\n",find);
//销毁
SLDestroy(&sl);
}
int main()
{
SLTest01();
return 0;
}

 

 

 

  • 33
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

熬夜苦读学习

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

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

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

打赏作者

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

抵扣说明:

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

余额充值