基于二叉排序树写的通讯录

嵌入式 一个简单的个人通讯录(基于二叉排序树,带注释) TreeNode.h: [csharp] view plaincopyprint? #define N 50 typedef struct student { char name[N]; char studentID[N]; char brithday[N]; char tele[N]; }TreeData; typedef struct treenode { TreeData * 阅读详情
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
/****************************************************  
 copyright: self_chou  
 Filename:  carpark.c  
 AUthour : self_chou   Version: 1.0     Date: 2012.07  
 Description: 基于二叉排序树写的通讯录   
 Function List: 
              initdata()  初始化内置数据
              insert()    添加联系人
              find()      查找联系人
              change()    修改联系人信息
              delete()    删除联系人
              destory()   释放空间
*******************************************************/  

typedef struct student
{
    char name[10];
    char sno[10];
    char bir[10];
    char tel[10];
}student;

student class[50];
int current = 0;                  
int flag;                        //查找结果标记

typedef struct tree
{
    struct student *people;
    struct tree *left;
    struct tree *right;
}tree;

tree *root = NULL;

void initdata()                      //内置的联系人
{
    strcpy( class[current].name,"赵一");
    strcpy( class[current].bir,"19910214");
    strcpy( class[current].tel,"12345678");
    strcpy( class[current].sno,"20125");
    current++;
    strcpy( class[current].name,"钱二");
    strcpy( class[current].bir,"19900304");
    strcpy( class[current].tel,"09876543");
    strcpy( class[current].sno,"20126");
    current++;
    strcpy( class[current].name,"孙三");
    strcpy( class[current].bir,"19910708");
    strcpy( class[current].tel,"56780934");
    strcpy( class[current].sno,"20127");
    current++;
    strcpy( class[current].name,"李四");
    strcpy( class[current].bir,"19890506");
    strcpy( class[current].tel,"09874532");
    strcpy( class[current].sno,"20122");
    root = (tree *)malloc(sizeof(tree));
    root->people = &class[0];
    root->left = NULL;
    root->right = NULL;
}


void insert(tree * root,student *q)              //排序二叉树按学号递归插入
{
    flag = 0;
    if(strcmp(root->people->sno,q->sno) == 0)
    {
        printf("插入不成功,相同学号的人已存在\n");
	flag = 1;
	return;
    }
    if( strcmp(root->people->sno,q->sno) > 0 )
    {
        if(root->left == NULL)
	{
	    tree *p = (tree *)malloc(sizeof(tree));
	    p->people = q;
	    p->left = NULL;
	    p->right = NULL;
	    root->left = p;
	}
	else
	{
	    insert(root->left,q);
	}
    }
    else
    {
        if( root->right == NULL)
	{
	    tree *p = (tree *)malloc(sizeof(tree));
	    p->people= q;
	    p->left = NULL;
	    p->right = NULL;
	    root->right = p;
	}
	else
	{
	    insert(root->right,q);
	}
    }
}

int find(tree *root,char *p)                    //先跟遍历查找
{
     int flag;
     if( root!= NULL )
     {
         if( strcmp(root->people->name,p) == 0)
	 {
	     printf("已找到该联系人:\n");
             printf("姓名:%s      学号:%s      生日:%s      电话:%s\n",root->people->name,root->people->sno,root->people->bir,root->people->tel);
             return 1;                                  //查找成功标记
	 }
	 flag = find(root->left,p);
	 if(flag>0)
	 {
	     return 1;
	 }
	 flag = find(root->right,p);
	 if(flag > 0)
	 {
	     return 1;
	 }
     }
     return 0;
}

int change(tree *root,char *p)          //先根遍历,查找到后修改
{
    int flag;
    if(root != NULL)
    {
        if( strcmp(root->people->name,p) == 0)
	{
	     int accept = 0;
	     char buff[20];
	     while(1)
	     {
	         if(accept == 5)
                 {
		     system("clear");
		     break;
		 }
                 printf("姓名:%s      学号:%s      生日:%s      电话:%s\n",root->people->name,root->people->sno,root->people->bir,root->people->tel);
	         printf("请输入要修改的选项:\n");
                 printf("1 修改姓名\n");
		 printf("2 修改学号\n");
		 printf("3 修改生日\n");
		 printf("4 修改电话\n");
		 printf("5 退出\n");
	         printf("请输入:");
		 scanf("%d",&accept);
		 switch(accept)
		 {
		     case 1:
		           {
			       system("clear");
			       printf("你想把名字修改为:");
			       scanf("%s",buff);
			       strcpy(root->people->name,buff);
			       printf("修改成功\n");
			       break;
			   }
	             case 2:
		           {
			       system("clear");
			       printf("你想把学号修改为(5位2012开头):");
			       scanf("%s",buff);
			       strcpy(root->people->sno,buff);
			       printf("修改成功\n");
			       break;
			   }
	             case 3:
		           {
			       
			       system("clear");
			       printf("你想生日把修改为:");
			       scanf("%s",buff);
			       strcpy(root->people->bir,buff);
			       printf("修改成功\n");
			       break;
			   }
	             case 4:
		           { 
			       system("clear");
			       printf("你想把电话修改为(8位):");
			       scanf("%s",buff);
			       strcpy(root->people->tel,buff);
			       printf("修改成功\n");
			       break;
			   }
	             case 5:
		           {
			       break;
			   }
	             default:
		           {
			       printf("输入有误,请重新输入\n");
			       break;
			   }
		           
		 }

	     }
	     return 1;
	}
	flag = change(root->left,p);
	if(flag >0 )
	{
	    return 1;
	}
	flag = change(root->right,p);
	if(flag >0)
	{
	    return 1;
	}
    }
    return 0;
}

void print(tree *root)
{
    if(root != NULL)
    {
        printf("姓名:%s      学号:%s      生日:%s      电话:%s\n",root->people->name,root->people->sno,root->people->bir,root->people->tel);
        print(root->left);
	print(root->right);
    }
}

tree * findparent(char *p,tree *root,tree *parent)               //找寻待删除结点的父母结点
{
    if( root != NULL)
    {
        if( strcmp(root->people->name,p) == 0 )
	{
	    return parent;                                 //和返回结点所在层次类似
	}
        parent = findparent(p,root->left,root);
	if(parent != NULL)
	{
	    return parent;
	}
	parent = findparent(p,root->right,root);
	if(parent != NULL)
	{
	    return parent;
	}
    }
    return NULL;
}

void my_remove(tree *parent,tree *child)                 //删除结点
{
    if(child->left == NULL && child->right == NULL)       //叶子节点
    {
        tree *temp = child;
	if(temp == root)                        //删除的是根
	{
	    root = NULL;
	    free(temp);
	    return;
	}
	if(parent->left == child)                 //判断是父母的左孩子还是右孩子
	{
	    parent->left = NULL;
	}
	else
	{
	    parent->right = NULL;
	}
        free(temp);
    }
    else
    {
        if( child->left != NULL && child->right == NULL)          //1度结点
	{
	    if(parent == NULL)                             //删除的是根结点
	    {
	        root = root->left;
                free(child);
		return;
	    }
	    if( parent->left == child)                    //判断左右孩子,由其父母收养
	    {
	        parent->left = child->left;
	    }
	    else
	    {
	        parent->right = child->left;
	    }
	    free(child);
	}
	else
	if( child->left == NULL && child->right != NULL)
	{
	    if(parent == NULL)
	    {
	        root = root->right;
                free(child);
		return;
	    }
	    if( parent->left == child)
	    {
	        parent->left = child->right;
	    }
	    else
	    {
	        parent->right = child->right;
	    }
	    free(child);
	}
	else                                               //二度结点
	{
	    tree *temp,*temppar;
	    temp = child->right;
	    temppar = child;
	    while(temp->left != NULL)                //找其中根遍历下的后继结点
	    {
	        temppar = temp;
	        temp = temp->left;
	    }
	    strcpy(child->people->name,temp->people->name);
	    strcpy(child->people->bir,temp->people->bir);
	    strcpy(child->people->tel,temp->people->tel);
	    strcpy(child->people->sno,temp->people->sno);
	    if( temppar == child)                              //后继结点为待删除结点右孩子
	    {                                                  //注意这种情况
	        temppar->right = temp->right;
	    }
	    else
	    {
	        temppar->left = temp->right;
	    }
	    free(temp);
	}
    }
}

void delete(char *q)
{
    tree *parent;
    parent = findparent(q,root,NULL);
    if( parent == NULL && ( strcmp( root->people->name,q) != 0 ))
    {
        printf("通讯录中没有此联系人,删除失败\n");
	return;
    }
    if( parent == NULL)                                //删除分两步,先找到其父母结点,再
    {                                                  //分情况删除
        my_remove(parent,root);
    }
    else
    {
        if(  parent->left != NULL && (strcmp(parent->left->people->name,q) == 0 ) )
	{
	    my_remove(parent,parent->left);
	}
	else
	{
	    my_remove(parent,parent->right);
	}
    }
}

void destory(tree *root)
{
    if(root != NULL)                    //释放空间
    {
        destory(root->left);
	destory(root->right);
	free(root);
    }
}

void disp()
{
    int fun;
    char accept[20];
    while(1)
    {
        printf("现有联系人按先序遍历如下:\n");
        print(root);
        printf("         请输入要选择的功能\n");
        printf("/************************************/\n");
        printf("         1.添加联系人\n");
	printf("         2.修改联系人信息\n");
	printf("         3.查找联系人\n");
	printf("         4.删除联系人\n");
	printf("         5.退出\n");
        printf("/************************************/\n");
	printf("请输入:");
        scanf("%d",&fun);
	switch(fun)
	{
	    case 1:
	          {
		      system("clear");
		      if(root == NULL)
		      {
		          current++;
		          root = (tree *)malloc(sizeof(tree));
		          printf("请输入要添加的联系人姓名\n");
		          scanf("%s",accept);
                          strcpy(class[current].name,accept);
		          printf("请输入要添加联系人学号(5位:2012开头)\n");
		          scanf("%s",accept);
                          strcpy(class[current].sno,accept);
		          printf("请输入要添加的联系人生日\n");
		          scanf("%s",accept);
                          strcpy(class[current].bir,accept);
		          printf("请输入要添加的联系人电话(8位)\n");
		          scanf("%s",accept);
                          strcpy(class[current].tel,accept);
			  root->people = &class[current];
			  root->left = NULL;
			  root->right = NULL;
			  printf("添加完成\n");
			  break;
		      }
		      current++;
		      printf("请输入要添加的联系人姓名\n");
		      scanf("%s",accept);
                      strcpy(class[current].name,accept);
		      printf("请输入要添加的联系人学号(5位:2012开头)\n");
		      scanf("%s",accept);
                      strcpy(class[current].sno,accept);
		      printf("请输入要添加的联系人生日\n");
		      scanf("%s",accept);
                      strcpy(class[current].bir,accept);
		      printf("请输入要添加的联系人电话(8位)\n");
		      scanf("%s",accept);
                      strcpy(class[current].tel,accept);
		      insert(root,&class[current]);
		      if(flag == 1)
		      {
		          break;
		      }
		      printf("添加完成\n");
		      break;
		  }
            case 2:
	          {
		       system("clear");
		       if(root == NULL)
		       {
		           printf("通讯录为空\n");
			   break;
		       }
		       printf("请输入要修改的联系人姓名:\n");
		       scanf("%s",accept);
		       fun = change(root,accept);
		       if(fun == 0)
		       {
		           printf("没有你要联系人\n");
		       }
		       break;
		  }
            case 3:
	          {
		       system("clear");
		       if(root == NULL)
		       {
		           printf("通讯录为空\n");
			   break;
                       }
		       printf("请输入要查找的联系人姓名:\n");
		       scanf("%s",accept);
		       fun = find(root,accept);
		       if(fun == 0)
		       {
		           printf("联系人未找到\n");
		       }
		       break;
		  }
            case 4:
	          {
		      system("clear");
		      if( root == NULL)
		      {
		          printf("通讯录为空\n");
			  break;
		      }
		      printf("请输入要删除的联系人姓名:");
		      scanf("%s",accept);
		      delete(accept);
		      break;
		  }
            case 5:
	          {
		      system("clear");
		      printf("正在清除数据\n");
		      destory(root);
		      printf("欢迎使用本通讯录,seeyou!\n");
                      exit(0);
		  }
            default:
	           {
		       system("clear");
		       printf("输入有误,请重新输入!\n");
		       break;
	           }

	}
    }
}

int main()
{
    int i;
    printf("正在初始化系统\n");
    initdata();
    for(i = 1;i <= current;i++)
    {
        insert(root,&class[i]);
    }
    disp();
    return 0;
}



 

二叉排序树删除操作:从理论到实战的完整解析 本文深入解析了二叉排序树删除操作的难点与解决方案。针对新手程序员常遇到的困惑,文章通过生活化类比和保姆级图解,详细拆分了删除叶子节点、单子树节点和双子树节点三种核心场景的处理逻辑,并提供了完整的C++代码实现与可运行示例,帮助读者从理论到实战彻底掌握这一关键数据结构操作。 阅读详情

相关推荐

二叉树学生通信录

用MFC写的同学通讯录,是数据结构的作业

一个简单的个人通讯录(基于二叉排序树)(加注释版~~~~)

TreeNode.h: /********************************************************************************** * 基于二叉排序树的个人通信录 * * * * * * 文 件: Treenode.h * 作 者: 邹亚鹏 * 部 门: 南京工程学...

yuanlanjun 1191

二叉树写的学生信息通信录

这是一个用二叉树写的一个学生通信录 class student{ private: char number[20]; char name[20]; char banji[20]; char address[50]; char phonenumber[20]; char email[70]; public: student *left,*right;

微信HOOK之二叉树获取信息 201-12-25

微信获取二叉树信息

weixin_44183918的博客 1399

基于二叉搜索树实现的电话簿程序

该程序是在VC2005下基于二叉搜索树实现的,主要功能包括查找、删除、添加、修改等基本操作,另外还有关于MFC位图显示,文件读写的操作

基于二叉排序数的个人通信录(附课程设计文档)

在日常生活中,个人通信录是我们不可少的,不管是纸式的个人通信录 还是我们手机中的个人通信录,查寻是其最基本的操作,几乎所有的操作都是在查寻的基础上进行的,所以,查寻时间的快慢很大程度上决定了整个通信录的性能。所以,一个有着良好界面、查寻速快的通信录,是人们所追求的。 本课程设计应用折半查寻法[1] [5]的技术思想进行查寻,从本思想出发,可以有两种数据组织方式:一是应用链表进行组织数据,由于折半查寻法的特殊性,所要进行查寻的数据列必须是有序的数据列,这样要求对数据列进行排序。出于系统实时查寻的考虑,每次对通信录进行改变后都得进行重新排序,这样才能保证数据列是实时有序的。这样当操作量大时,排序所消耗的时间对整个系统有很大的影响。 二是应用二叉排序树来组织数据,由于二叉排序树是应用折半查寻法思想进行对数据进行存储的,所以,其左孩子大于双亲结点、右孩子小于双亲结点(或者左孩子小于双亲结点、右孩子大于双亲结点),这样就可以应用折半查寻法的思想进行查寻,从而减少对排序时所消耗的时间。 本课程设计采用第二种方法,即应用二叉排序树进行组织数据,在此基础上进行对个人通信录的各种操作。

PC微信读取微信好友列表(联系人)

开篇 PC微信端读取联系人有三种常规方法: hook相关call来实现拦截联系人数据 读取内存中的包含联系人的二叉树结构 解密读取微信本地数据库 其实前两种方法只是利用微信启动后已经读取联系人放到内存。第一种是拦截过程,第二种是直接获取内存的结果。 第一种方法 找CALL请看:https://blog.youkuaiyun.com/qq_38474570/article/details/95889507 ...

Qwertyuiop2016的博客 1万+

STM32H743必要外围电路分析

写在前面:这篇博客是我第一次绘制STM32最小系统板的过程记录。 2020-1-11 BOOT STM32采用ARM内核,和ARM处理器一样,都有专门的boot脚决定单片机从何处启动。 在官方数据手册的第105页,我们可以看到 系统复位后,在SYSTICK的第四个上升沿锁存BOOT引脚的值,复位后,BOOT引脚可以由用户自由配置而不会影响系统正常运行。 BOOT引脚决定了自举存储器地址,当BO...

Cui_Hongwei的博客 1万+

二叉排序树实现简单的通讯录

头文件#ifndef TOU_H_INCLUDED #define TOU_H_INCLUDED #include<stdio.h> #include<stdlib.h> #include<iostream> using namespace std; typedef struct { char Name[20]; char PhoneNumber[20]; char Adre

蜕变中的Programmer 1845

深入NAND Flash信号与接口:结合ONFI 5.0协议,聊聊DBI、ODT和差分信号到底在解决什么实际问题

本文深入探讨了NAND Flash信号与接口设计,结合ONFI 5.0协议,详细解析了DBI、ODT和差分信号等技术如何解决高速数据传输中的信号完整性问题。通过实际案例和数据,展示了这些技术在降低功耗、减少噪声和提升抗干扰能力方面的显著效果,为存储工程师提供了宝贵的实践参考。

weixin_33736649的博客 341

CentOS7.9 安装 ImageMagick,图片转换为HEIC图像格式

由于ImageMagick7以下不支持heic等图片格式,所以重新安装了ImageMagick7.1版本支持heic格式,在网上找了很多资料,归纳总结并写此文章记录一下。在Linux(CentOS7.9)上安装ImageMagick7.1.1-38。

shmily_i的博客 1939

二叉排序树的应用(基于二叉排序树的个人通信录)

在日常生活中,个人通信录是我们不可少的,不管是纸式的个人通信录还是我们手机中的个人通信录,查寻是其最基本的操作,几乎所有的操作都是在查寻的基础上进行的,所以,查寻时间的快慢很大程度上决定了整个通信录的性能。所以,一个有着良好界面、查寻速快的通信录,是人们所追求的。 本设计应用折半查寻法的技术思想进行查寻,从本思想出发,可以有两种数据组织方式:一是应用链表进行组织数据,由于折半查寻法的特殊性,所要

zhouxf的专栏 3891

VPI与Matlab协同仿真:相干光通信接收端DSP算法全解析

本文详细解析了如何利用VPI与Matlab协同仿真,构建完整的相干光通信接收端DSP算法处理闭环。重点介绍了从VPI导出数据后,在Matlab中实现时钟恢复、偏振解复用和载波相位估计等核心算法的步骤与原理,并阐述了如何通过误码率计算完成仿真验证,为相干光通信系统算法研究与验证提供了高效实用的方法。

ll5678的博客 609

通讯录管理系统(C/C++)

问题描述 设计与实现一个通讯录管理系统,实现按姓名、电话号、QQ 号查找。 功能要求 要求能够管理通讯录,即具有通讯录的建立、增、删、改记录功能; 要求实现在指定通讯录中按姓名、电话号、QQ 号查找功能。 系统描述 ## 信息结构 通讯录查找子系统 二分查找(QQ号) 先给QQ号排序 void sort_QQ(SqList &p)//qq排序 { int i,j,w; ElemType *temp; for(i=0; i<n; i++) for(

二琳爱吃肉的博客 3390

广告推荐算法 - 学习笔记(持续更新中)

本篇博客,是我用来记录学习广告推荐算法的一些笔记和总结。王喆:"深度"学习计算广告计算广告系统的核心目标是通过数据、算法和技术,在合适的场景下,将最相关的广告精准推送给目标用户,同时实现广告主媒体平台和用户之间的多方利益最大化。广告主:需求方核心目标:通过精准投放广告,最大化转化(如点击、购买)并控制成本,提升投资回报率(ROI)。关键行为:广告创建,定向设置,预算与出价策略,效果监控媒体平台:供给方核心目标:最大化广告收入,同时保持用户体验以避免用户流失。

qq_39748832的博客 2196

基于Simulink的永磁同步电机三闭环(位置/速度/电流)伺服仿真

本文详细介绍了基于Simulink的永磁同步电机三闭环伺服控制系统的设计与实现,针对机器人关节控制场景。系统采用位置环(外环)、速度环(中环)和电流环(内环)的嵌套结构,通过精确的带宽匹配(电流环1kHz、速度环200Hz、位置环20Hz)实现亚微米级位置跟踪。文中提供了完整的Simulink建模步骤,包括主电路搭建、三环PI控制器实现及坐标变换模块,并验证了系统性能:阶跃响应时间35ms,位置误差<0.05°,正弦跟踪误差<0.15°,负载突加恢复时间0.08s。最后提出了参数自适应整定、前馈

amy_mhd的博客 279

C++实现的简单的通讯录管理系统

C++实现的简单的通讯录管理系统 一、代码 #include <iostream> #include <string> #include <cstring> #include <fstream> using namespace std; //自定义一个联系人结点类型 typedef struct node1 { string name; //姓名 string tel; //手机号 string emai

xjfyt0129的博客 537

2023年全国青少年信息素养大赛复赛真题(C++智能算法复赛真题:带解析)

2023年全国青少年信息素养大赛复赛真题(C++智能算法复赛真题:带解析)

王老师青少年编程 2113

通讯录管理系统详细实现

源代码 #include<stdio.h> #include<iostream> #include<string.h> #include<iomanip> #define MAXSIZE 1000 using namespace std; typedef char *KeyType; /*---------------------------------------信息结构--------------------------------------*/ typ

二琳爱吃肉的博客 1230

Vue3 - 详细实现虚拟列表前端虚拟滚动列表解决方案,vue3长列表优化之虚拟列表,解决列表动态高度不固定高度及图片视频图文异步请求加载问题,虚拟列表DOM大量数据同时加载渲染卡顿太慢及下滑列表闪烁

vue3,vue3虚拟列表,用vue3实现一个虚拟列表,长列表高度不一致如何实现虚拟滚动加载列表,虚拟列表有图片视频,图文列表,上万条数据同时渲染解决,长列表dom渲染太卡,列表滚动条加载超多数据,瀑布流,在Vue3中如何实现列表的虚拟滚动,虚拟列表滑动白屏闪烁闪一下,虚拟列表每个项的高度不确定,可动态改变高度,vue3虚拟滚动列表,页面数据太多加载很慢怎么办,vue3实现不定高的虚拟列表,定高和不定高,虚拟列表非固定高度,vue3长列表优化之虚拟列表实现,vue3虚拟列表高度不固定,用vue3实现一个虚拟

🏆 前端领域优质创作者 1万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

电子通讯录(C语言)

用二叉排序树建立。建立时未用平衡二叉树。因此,时间性能上会较差。 #include #include #include typedef struct AdNode { char name[20]; char tel_num[11]; struct AdNode *lchild,*rchild; }AdNode; AdNode *a=NULL; void Ins

Apple.Daily的专栏 752

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

二叉排序树

Time Limit: 1000MS Memory limit: 65536K 题目描写叙述 二叉排序树的定义是:或者是一棵空树。或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上全部结点的值均小于它的根结点的值; 若它的右子树不空。则右子树上全部结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。 今天我们要推断两序列是否为同一二叉排序树...

weixin_33869377的博客 2434

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

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

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

第十四周项目一 之【二叉排序树】

/*问题及代码 *Copyright(c)2016,烟台大学计算机学院 *All right reserved. *文件名称:验证算法.cpp *作者:李潇 *时间:12月8日 *版本号;v1.0 *问题描述: 认真阅读并验证二叉排序树相关算法。 认真阅读并验证平衡二叉树相关算法。 *输入描述:无 *程序输出:根据要求输出 */ 代码: #

sdlixiao6的博客 342
上一篇: 二叉排序树的应用(基于二叉排序树的个人通信录)
下一篇: Linux下面time.h时间函数总结
zhouxf_cn
博客等级 码龄14年 54粉丝 24原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值