通讯录(C语言)

通讯录

  • 一、基本思路及功能介绍
  • 二、功能实现
    • 1.基础菜单的实现
    • 2.添加联系人信息功能实现
    • 3.显示联系人信息功能实现
    • 4.删除联系人信息功能实现
    • 5.查找联系人信息功能实现
    • 6.修改联系人信息功能实现
    • 7.排序联系人信息功能实现
    • 8.加载和保存联系人信息功能实现
  • 三、源文件展示
    • 1.test.c
    • 2.contact.c
    • 3.contact.h

一、基本思路及功能介绍

想要用C语言实现通讯录的功能,基本上涵概了C语言入门的一些知识运用,如:指针、结构体、文件操作、动态内存管理等相关的知识;

实现一个简单的通讯录的基本功能:

    1.添加联系人信息;2.删除联系人信息;3.查找联系人信息;4.修改联系人信息;5.显示联系人信息;6.排序联系人信息;   7.保存联系人信息;8.退出通讯录;

二、功能实现

1.基础菜单的实现

void menu()
{printf("\t\t\t\t************************************\n");printf("\t\t\t\t******    通讯录管理系统    ********\n");printf("\t\t\t\t************************************\n");printf("\t\t\t\t*      1.添加联系人       *\n");printf("\t\t\t\t*      2.删除联系人       *\n");printf("\t\t\t\t*      3.查找联系人	      *\n");printf("\t\t\t\t*      4.修改联系人       *\n");printf("\t\t\t\t*      5.显示联系人       *\n");printf("\t\t\t\t*      6.排序联系人       *\n");printf("\t\t\t\t*      0.退出通讯录       *\n");printf("\t\t\t\t************************************\n");printf("\t\t\t\t************************************\n");
}
enum
{EXIT,ADD,DEL,SEARCH,MODIFY,SHOW,SORT
};
int main()
{int input = 0;struct Contact con;InitContact(&con);//初始化通讯录do{menu();printf("请输入:>");scanf("%d", &input);switch (input){case ADD:AddContact(&con);//添加联系人信息break;case DEL:DelContact(&con);//删除联系人信息break;case SEARCH:SearchContact(&con);//查找联系人信息break;case MODIFY:ModifyContact(&con);//修改联系人信息break;case SHOW:ShowContact(&con);//显示联系人信息break;case SORT:SortContact(&con);//排序联系人信息break;case EXIT:SaveContact(&con);//保存信息DistroyContact(&con);//销毁通讯录信息printf("退出通讯录\n");break;default:printf("选择错误,请重新选择\n");break;}} while (input);return 0;
}

2.添加联系人信息功能实现

//扩充容量
void CheckContact(struct Contact* pc)
{if (pc->sz == pc->capacity){struct PeoInfo* ptr = (struct PeoInfo*)realloc(pc->data, (pc->capacity + 2) * sizeof(struct PeoInfo));if (ptr != NULL){pc->data = ptr;pc->capacity += 2;printf("扩容成功\n");}else{printf("扩容失败\n");exit(1);}}
}//初始化通讯录
void InitContact(struct Contact* pc)
{pc->sz = 0;pc->data = (struct PeoInfo*)malloc(DEFAULT_SZ * sizeof(struct PeoInfo));pc->capacity = DEFAULT_SZ;
}//添加联系人信息
void AddContact(struct Contact* pc)
{CheckContact(pc);printf("请输入联系人的姓名:>");scanf("%s", pc->data[pc->sz].name);printf("请输入联系人的年龄:>");scanf("%d", &pc->data[pc->sz].age);printf("请输入联系人的性别:>");scanf("%s", pc->data[pc->sz].sex);printf("请输入联系人的电话:>");scanf("%s", pc->data[pc->sz].tele);printf("请输入联系人的住址:>");scanf("%s", pc->data[pc->sz].addr);printf("添加成功\n");pc->sz++;
}

3.显示联系人信息功能实现

 
//显示联系人信息
void ShowContact(struct Contact* pc)
{if (pc->sz == 0){printf("通讯录为空,显示失败!!!\n");return;}int i = 0;printf("\t\t--------------------------------------------------------------------------\n");printf("\t\t--------------------------------------------------------------------------\n");printf("\t%15s\t%15s\t%15s\t%15s\t%15s\n\n","姓名", "年龄", "性别", "电话", "住址");for (i = 0; i < pc->sz; i++){printf("\t%15s\t%15d\t%15s\t%15s\t%15s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);}printf("\t\t--------------------------------------------------------------------------\n");printf("\t\t--------------------------------------------------------------------------\n");
}

4.删除联系人信息功能实现

 
//删除联系人信息
int FindContactByName(const struct Contact* pc, char* name)
{int i = 0;for (i = 0; i < pc->sz; i++){if (strcmp(pc->data[i].name, name) == 0){return i;}}return -1;
}void DelContact(struct Contact* pc)
{if (pc->sz == 0){printf("联系人为空,操作失败\n");return;}char name[NAME_MAX] = { 0 };printf("请输入要删除的联系人姓名:>");scanf("%s", name);int pos = FindContactByName(pc, name);if (pos == -1){printf("查找的联系人不存在!!!\n");}else{for (int i = pos; i < pc->sz - 1; i++){pc->data[i] = pc->data[i + 1];}pc->sz--;printf("删除成功\n");}
}

5.查找联系人信息功能实现

//查找联系人信息
void SearchContact(struct Contact* pc)
{if (pc->sz == 0){printf("通讯录为空,查找失败!!!\n");return;}char name[NAME_MAX] = { 0 };printf("请输入要查找的联系人的名字:>");scanf("%s", name);int pos = FindContactByName(pc, name);if (pos == -1){printf("联系人不存在!!!\n");return;}else{printf("\t%15s\t%15s\t%15s\t%15s\t%15s\n\n","姓名", "年龄", "性别", "电话", "住址");printf("\t%15s\t%15d\t%15s\t%15s\t%15s\n",pc->data[pos].name,pc->data[pos].age,pc->data[pos].sex,pc->data[pos].tele,pc->data[pos].addr);}
}

6.修改联系人信息功能实现

//修改联系人信息
void ModifyContact(struct Contact* pc)
{if (pc->sz == 0){printf("通讯录为空,查找失败!!!\n");return;}char name[NAME_MAX] = { 0 };printf("请输入要修改的联系人姓名:>");scanf("%s", name);int pos = FindContactByName(pc, name);if (pos == -1){printf("联系人不存在!!!\n");return;}else{printf("请输入新的联系人姓名:>");scanf("%s", pc->data[pos].name);printf("请输入新的联系人年龄:>");scanf("%d", &pc->data[pos].age);printf("请输入新的联系人性别:>");scanf("%s", pc->data[pos].sex);printf("请输入新的联系人电话:>");scanf("%s", pc->data[pos].tele);printf("请输入新的联系人住址:>");scanf("%s", pc->data[pos].addr);}printf("修改成功\n");
}

7.排序联系人信息功能实现

//排序联系人信息
void SortContact(struct Contact* pc)
{if (pc->sz == 0){printf("通讯录为空,无法排序!!!\n");return;}int i = 0;int j = 0;struct PeoInfo tmp;for (i = 0; i < pc->sz - 1; i++){int flag = 1;for (j = 0; j < pc->sz - i - 1; j++){if (strcmp(pc->data[j].name, pc->data[j + 1].name) < 0){tmp = pc->data[j];pc->data[j] = pc->data[j + 1];pc->data[j + 1] = tmp;flag = 0;}}if (flag == 1){return;}}printf("排序成功\n");
}

8.加载和保存联系人信息功能实现

//加载有效信息到通讯录中
void LoadContact(struct Contact* pc)
{FILE* pf = fopen("contact.txt", "rb");if (pf == NULL){perror("contact:fopen");return;}struct PeoInfo tmp = { 0 };while (fread(&tmp, sizeof(struct PeoInfo), 1, pf)){CheckContact(pc);pc->data[pc->sz] = tmp;pc->sz++;}fclose(pf);pf = NULL;
}//保存信息
void SaveContact(struct Contact* pc)
{//1.打开文件FILE* pf = fopen("contact.txt", "wb");if (pf == NULL){perror("SaveContact:fopen");return;}//2.写数据int i = 0;for (i = 0; i < pc->sz; i++){fwrite(&(pc->data[i]), sizeof(struct PeoInfo), 1, pf);}//3.关闭文件fclose(pf);pf = NULL;
}

三、源文件展示

1.test.c

void menu()
{printf("\t\t\t\t************************************\n");printf("\t\t\t\t******    通讯录管理系统    ********\n");printf("\t\t\t\t************************************\n");printf("\t\t\t\t*      1.添加联系人       *\n");printf("\t\t\t\t*      2.删除联系人       *\n");printf("\t\t\t\t*      3.查找联系人	      *\n");printf("\t\t\t\t*      4.修改联系人       *\n");printf("\t\t\t\t*      5.显示联系人       *\n");printf("\t\t\t\t*      6.排序联系人       *\n");printf("\t\t\t\t*      0.退出通讯录       *\n");printf("\t\t\t\t************************************\n");printf("\t\t\t\t************************************\n");
}
enum
{EXIT,ADD,DEL,SEARCH,MODIFY,SHOW,SORT
};
int main()
{int input = 0;struct Contact con;InitContact(&con);//初始化通讯录do{menu();printf("请输入:>");scanf("%d", &input);switch (input){case ADD:AddContact(&con);//添加联系人信息break;case DEL:DelContact(&con);//删除联系人信息break;case SEARCH:SearchContact(&con);//查找联系人信息break;case MODIFY:ModifyContact(&con);//修改联系人信息break;case SHOW:ShowContact(&con);//显示联系人信息break;case SORT:SortContact(&con);//排序联系人信息break;case EXIT:SaveContact(&con);//保存信息DistroyContact(&con);//销毁通讯录信息printf("退出通讯录\n");break;default:printf("选择错误,请重新选择\n");break;}} while (input);return 0;
}

2.contact.c

#include "contact.h"//扩充容量
void CheckContact(struct Contact* pc)
{if (pc->sz == pc->capacity){struct PeoInfo* ptr = (struct PeoInfo*)realloc(pc->data, (pc->capacity + 2) * sizeof(struct PeoInfo));if (ptr != NULL){pc->data = ptr;pc->capacity += 2;printf("扩容成功\n");}else{printf("扩容失败\n");exit(1);}}
}//加载有效信息到通讯录中
void LoadContact(struct Contact* pc)
{FILE* pf = fopen("contact.txt", "rb");if (pf == NULL){perror("contact:fopen");return;}struct PeoInfo tmp = { 0 };while (fread(&tmp, sizeof(struct PeoInfo), 1, pf)){CheckContact(pc);pc->data[pc->sz] = tmp;pc->sz++;}fclose(pf);pf = NULL;
}//初始化通讯录
void InitContact(struct Contact* pc)
{pc->sz = 0;pc->data = (struct PeoInfo*)malloc(DEFAULT_SZ * sizeof(struct PeoInfo));pc->capacity = DEFAULT_SZ;LoadContact(pc);//加载有效信息到通讯录中
}//添加联系人信息
void AddContact(struct Contact* pc)
{CheckContact(pc);printf("请输入联系人的姓名:>");scanf("%s", pc->data[pc->sz].name);printf("请输入联系人的年龄:>");scanf("%d", &pc->data[pc->sz].age);printf("请输入联系人的性别:>");scanf("%s", pc->data[pc->sz].sex);printf("请输入联系人的电话:>");scanf("%s", pc->data[pc->sz].tele);printf("请输入联系人的住址:>");scanf("%s", pc->data[pc->sz].addr);printf("添加成功\n");pc->sz++;
}//销毁通讯录
void DistroyContact(struct Contact* pc)
{free(pc->data);pc->data = NULL;pc->sz = 0;pc->capacity = 0;
}//显示联系人信息
void ShowContact(struct Contact* pc)
{if (pc->sz == 0){printf("通讯录为空,显示失败!!!\n");return;}int i = 0;printf("\t\t--------------------------------------------------------------------------\n");printf("\t\t--------------------------------------------------------------------------\n");printf("\t%15s\t%15s\t%15s\t%15s\t%15s\n\n","姓名", "年龄", "性别", "电话", "住址");for (i = 0; i < pc->sz; i++){printf("\t%15s\t%15d\t%15s\t%15s\t%15s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);}printf("\t\t--------------------------------------------------------------------------\n");printf("\t\t--------------------------------------------------------------------------\n");
}//删除联系人信息
int FindContactByName(const struct Contact* pc, char* name)
{int i = 0;for (i = 0; i < pc->sz; i++){if (strcmp(pc->data[i].name, name) == 0){return i;}}return -1;
}void DelContact(struct Contact* pc)
{if (pc->sz == 0){printf("联系人为空,操作失败\n");return;}char name[NAME_MAX] = { 0 };printf("请输入要删除的联系人姓名:>");scanf("%s", name);int pos = FindContactByName(pc, name);if (pos == -1){printf("查找的联系人不存在!!!\n");}else{for (int i = pos; i < pc->sz - 1; i++){pc->data[i] = pc->data[i + 1];}pc->sz--;printf("删除成功\n");}
}//查找联系人信息
void SearchContact(struct Contact* pc)
{if (pc->sz == 0){printf("通讯录为空,查找失败!!!\n");return;}char name[NAME_MAX] = { 0 };printf("请输入要查找的联系人的名字:>");scanf("%s", name);int pos = FindContactByName(pc, name);if (pos == -1){printf("联系人不存在!!!\n");return;}else{printf("\t%15s\t%15s\t%15s\t%15s\t%15s\n\n","姓名", "年龄", "性别", "电话", "住址");printf("\t%15s\t%15d\t%15s\t%15s\t%15s\n",pc->data[pos].name,pc->data[pos].age,pc->data[pos].sex,pc->data[pos].tele,pc->data[pos].addr);}
}//修改联系人信息
void ModifyContact(struct Contact* pc)
{if (pc->sz == 0){printf("通讯录为空,查找失败!!!\n");return;}char name[NAME_MAX] = { 0 };printf("请输入要修改的联系人姓名:>");scanf("%s", name);int pos = FindContactByName(pc, name);if (pos == -1){printf("联系人不存在!!!\n");return;}else{printf("请输入新的联系人姓名:>");scanf("%s", pc->data[pos].name);printf("请输入新的联系人年龄:>");scanf("%d", &pc->data[pos].age);printf("请输入新的联系人性别:>");scanf("%s", pc->data[pos].sex);printf("请输入新的联系人电话:>");scanf("%s", pc->data[pos].tele);printf("请输入新的联系人住址:>");scanf("%s", pc->data[pos].addr);}printf("修改成功\n");
}//排序联系人信息
void SortContact(struct Contact* pc)
{if (pc->sz == 0){printf("通讯录为空,无法排序!!!\n");return;}int i = 0;int j = 0;struct PeoInfo tmp;for (i = 0; i < pc->sz - 1; i++){int flag = 1;for (j = 0; j < pc->sz - i - 1; j++){if (strcmp(pc->data[j].name, pc->data[j + 1].name) < 0){tmp = pc->data[j];pc->data[j] = pc->data[j + 1];pc->data[j + 1] = tmp;flag = 0;}}if (flag == 1){return;}}printf("排序成功\n");
}//保存信息
void SaveContact(struct Contact* pc)
{//1.打开文件FILE* pf = fopen("contact.txt", "wb");if (pf == NULL){perror("SaveContact:fopen");return;}//2.写数据int i = 0;for (i = 0; i < pc->sz; i++){fwrite(&(pc->data[i]), sizeof(struct PeoInfo), 1, pf);}//3.关闭文件fclose(pf);pf = NULL;
}

3.contact.h

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define NAME_MAX 20
#define SEX_MAX 20
#define TELE_MAX 20
#define ADDR_MAX 20
#define DEFAULT_SZ 3struct PeoInfo
{char name[NAME_MAX];//姓名int age;			//年龄char sex[SEX_MAX];  //性别char tele[TELE_MAX];//电话char addr[ADDR_MAX];//住址
};struct Contact
{struct PeoInfo* data;//能够动态存储联系人的信息int sz;				 //记录当前联系人的个数int capacity;		 //记录当前通讯录的容量
};//初始化通讯录
void InitContact(struct Contact* pc);//添加联系人信息
void AddContact(struct Contact* pc);//销毁通讯录信息
void DistroyContact(struct Contact* pc);//显示联系人信息
void ShowContact(struct Contact* pc);//删除联系人信息
void DelContact(struct Contact* pc);//查找联系人信息
void SearchContact(struct Contact* pc);//修改联系人信息
void ModifyContact(struct Contact* pc);//排序联系人信息
void SortContact(struct Contact* pc);//加载有效信息到通讯录中
void LoadContact(struct Contact* pc);//保存信息
void SaveContact(struct Contact* pc);

#四、演示效果

没有联系人
在这里插入图片描述

存入联系人
在这里插入图片描述

查找联系人
在这里插入图片描述

修改联系人
在这里插入图片描述

显示联系人
加粗样式

排序联系人
在这里插入图片描述

退出通讯录
在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/63117.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YOKOGAWA CP461-50处理器模块

数据处理能力&#xff1a; CP461-50 处理器模块具有强大的数据处理能力&#xff0c;用于执行各种控制和数据处理任务。 多通道支持&#xff1a; 该模块通常支持多通道输入和输出&#xff0c;允许与多个传感器和执行器进行通信。 通信接口&#xff1a; CP461-50 处理器模块通常…

每日一题(复制带随机指针的链表)

每日一题&#xff08;复制带随机指针的链表&#xff09; 138. 复制带随机指针的链表 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 由于每个链表还包含了一个random节点指向了链表中的随机节点&#xff0c;所以并不能直接照搬复制原链表。首先想到的暴力思路是复…

Redis的介绍

Redis的架构介绍如下: 1. 概述 Redis是一个基于内存的高性能NoSQL键值数据库,支持网络访问和持久化特性。 2. 功能架构 Redis提供字符串、哈希、列表、集合、有序集合、位数组等多种数据结构,支持事务、Lua脚本、发布订阅、流水线等功能。 3. 技术架构 Redis使用单线程的…

oracle批量导出字段注释,并且相同字段注释为空的情况取有数据的第一行赋值

SELECT ‘comment on column ‘|| t.table_name||’.’||t.colUMN_NAME||’ is ’ || ‘’‘’ || (CASE WHEN T1.COMMENTS IS NULL THEN (SELECT T2.COMMENTS FROM User_Col_Comments T2 WHERE T1.colUMN_NAMET2.colUMN_NAME AND T2.COMMENTS IS NOT NULL and rownum1) ELSE N…

字节后端社招凉经

一面 1.聊项目。项目方案&#xff0c;技术 2.代码&#xff1a;K个一组翻转链表 3.GC如何排查及解决GC 4.说一下linux命令 grep用法&#xff0c;端口号查询 5.mybatis 注入 6.sql优化 二面 1.聊项目&#xff0c;项目方案&#xff0c;项目技术 2.代码&#xff1a;输入N,输出0-…

嵌入式学习笔记(1)ARM的编程模式和7种工作模式

ARM提供的指令集 ARM态-ARM指令集&#xff08;32-bit&#xff09; Thumb态-Thumb指令集&#xff08;16-bit&#xff09; Thumb2态-Thumb2指令集&#xff08;16 & 32 bit&#xff09; Thumb指令集是对ARM指令集的一个子集重新编码得到的&#xff0c;指令长度为16位。通常在…

Thymeleaf

这就是自动装配的原理 1) .SpringBoot启动会加载大量的自动配置类 2)、我们看我们需要的功能有没有在SpringBoot默认写好的自动配置类当中; 3)、我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件存在在其中&#xff0c;我们就不需要再手动配置了) 4)、给容器…

【Linux】linux nfs共享存储服务

linux nfs共享存储服务 目录 一、nfs服务 二、nfs优点 三、配置文件 四、共享文件配置过程 五、实验 1.创建共享文件&#xff08;两台终端共享&#xff09; 一、nfs服务 概念&#xff1a;网络上共享文件系统的协议&#xff0c;运行多个服务器之间通过网络共享文件和目…

【C++】内联函数 ( 概念简介 )

文章目录 一、内联行数简介1、内联函数引入 一、内联行数简介 1、内联函数引入 在 C 中 , 定义常量 const int a 10可以替换 C 语言中的 宏定义 #define a 10使用 常量 可以 替代 宏定义 ; 宏定义分为两种 , 一种是 宏常数 , 另外一种是 宏代码片段 ; C 中使用 常量 替代 宏…

渣土车识别监测 渣土车未盖篷布识别抓拍算法

渣土车识别监测 渣土车未盖篷布识别抓拍算法通过yolov7深度学习训练模型框架&#xff0c;渣土车识别监测 渣土车未盖篷布识别抓拍算法在指定区域内实时监测渣土车的进出状况以及对渣土车未盖篷布违规的抓拍和预警。YOLOv7 的策略是使用组卷积来扩展计算块的通道和基数。研究者将…

webRtc 示例

1、使用socket.io进行会话 2、为了方便&#xff0c;参数写死在前端了&#xff0c;前端界面1代码如下&#xff08;由界面1发起视频&#xff09;&#xff1a; <!DOCTYPE html> <html><head><title>Socket.IO chat</title><meta charset"…

数字化新零售平台系统提供商,门店商品信息智慧管理-亿发进销存

传统的批发零售业务模式正面临着市场需求变化的冲击。用户日益注重个性化、便捷性和体验感&#xff0c;新兴的新零售模式迅速崛起&#xff0c;改变了传统的零售格局。如何在保持传统业务的基础上&#xff0c;变革发展&#xff0c;成为了业界亟需解决的问题。 在这一背景下&…

JixiPix Artista Impresso Pro for mac(油画滤镜效果软件)

JixiPix Artista Impresso pro Mac是一款专业的图像编辑软件&#xff0c;专为Mac用户设计。它提供了各种高质量的图像编辑工具&#xff0c;可以帮助您创建令人惊叹的图像。该软件具有直观的用户界面&#xff0c;使您可以轻松地浏览和使用各种工具。 它还支持多种文件格式&…

前端是leyui后端sqlserver和maraDB进行分页

项目场景&#xff1a; 前端是leyui后端sqlserver和maraDB进行分页,两种数据库在后端分页的不同写法 解决方案&#xff1a; 前端: 定义table,表格的格式在接口返回时进行创建,根据id进行绑定 <div class"layui-tab-item layui-show" style"padding-top: 10…

@XmlType,@XmlRootElement,@XmlAttribute的作用与区别

XmlType、XmlRootElement 和 XmlAttribute 都是 Java 标准库中 javax.xml.bind.annotation 包提供的注解&#xff0c;用于在使用 JAXB&#xff08;Java Architecture for XML Binding&#xff09;或其他 XML 绑定技术时&#xff0c;控制 Java 类与 XML 数据之间的映射关系。 它…

C++的基类和派生类构造函数

基类的成员函数可以被继承&#xff0c;可以通过派生类的对象访问&#xff0c;但这仅仅指的是普通的成员函数&#xff0c;类的构造函数不能被继承。构造函数不能被继承是有道理的&#xff0c;因为即使继承了&#xff0c;它的名字和派生类的名字也不一样&#xff0c;不能成为派生…

rate-based 拥塞控制吞吐测量

要点&#xff1a;一个方法无法精确刻画链路画像&#xff0c;就用多种方法组合刻画&#xff0c;设计一个 “自定义平均”。 当前 Linux kernel TCP 实现的 TCP delivery rate 测量机制(BBR 有使用到)如下图&#xff1a; 简略后可展示为下图&#xff1a; 详见 net/ipv4/tcp_…

5G NR:RACH流程 -- Msg1发送时RA-RNTI的计算及功率控制

前言 如果阅读了这两篇博文《如何产生PRACH preamble》和《如何选择合适的时频资源发送preamble》&#xff0c;那么对msg1有了基本了解&#xff0c;但是真到了Msg1发送的时候&#xff0c;该怎么处理呢&#xff0c;这里涉及到两个问题&#xff1a; 问题1&#xff1a;发…

数据结构:排序解析

文章目录 前言一、常见排序算法的实现1.插入排序1.直接插入排序2.希尔排序 2.交换排序1.冒泡排序2.快速排序1.hoare版2.挖坑版3.前后指针版4.改进版5.非递归版 3.选择排序1.直接选择排序2.堆排序 4.归并排序1.归并排序递归实现2.归并排序非递归实现 5.计数排序 二、排序算法复杂…

安装cx_Oracle

1&#xff0c;好久不使用的环境安装cx_Oracle 执行 conda install cx_Oracle 报 Invalid version spec: 2. 7 我都python版本是>3.7的 然后根据博客&#xff0c;执行了 conda create -n conda_env_name python3.7 conda4.9.2 下载了一大堆东西。然后重新执行&#xff0c;还…