数据结构之动态顺序表(附带完整程序)

🎈基本概念

🌈一.线性表、顺序表的定义

☀️(1)线性表:

是n个具有相同特性的数据元素的有限序列。线性表在逻辑上是线性结构,但在物理上存储时,通常以数组和链式结构的形式存储。

☀️(2)顺序表:

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。

🌈二.顺序表的分类

☀️(1)静态顺序表:

1.概念:使用定长数组存储元素
2.定义方法:数组使用方括号法,例如:

typedef struct
{int age;int height;double weight;
}Student;
typedef struct
{Student stu[100];//Student类型的数组int length;//元素的有效个数int listsize;//最多容纳多少个元素
}SqList;

3.缺陷:方括号[ ]内只能是定值,一旦定义了大小就不可改变

☀️(2)动态顺序表:

1.概念:使用动态开辟的数组存储元素
2.定义方法:用指针指向数组,例如:

typedef struct
{int age;int height;double weight;
}Student;
typedef struct
{Student* stu;//Student类型的数组int length;//元素的有效个数int listsize;//最多容纳多少个元素
}SqList;

3.相较于静态顺序表,动态顺序表可以改变数组大小,更合理的利用空间

🎈动态顺序表相关操作函数

为方便理解,以一个学生信息表为例。最开始先开辟5个结构体大小的位置,如果后面不够则每次多开辟2个位置;学生信息由年龄、身高、体重3个数据组成。

🌈定义部分

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 5
#define INCREASE 2
typedef struct
{int age;int height;double weight;
}Student;
typedef struct
{Student* stu;//Student类型的数组int length;//元素的有效个数int listsize;//最多容纳多少个元素
}SqList;

🌈一.初始化顺序表

int InitList(SqList* L)
{//1.申请空间L->stu = (Student*)malloc(LIST_INIT_SIZE * sizeof(Student));//2.判断是否申请成功if (!L->stu)exit(-1);//exit(-1)表示退出程序//3.如果拿到了内存空间,就初始化顺序表L->length = 0;L->listsize = LIST_INIT_SIZE;return 1;
}

步骤:
👻1.用malloc申请空间
👻2.判断是否申请成功
补:exit和return的区别:exit(-1)表示终止程序,而return只是结束当下函数
👻3.如果拿到了内存空间,就初始化顺序表
length表示有效元素个数,目前为0;listsize表示数组当前最大容量,假设初始最大容量LIST_INIT_SIZE为5

🌈二.销毁顺序表

int DeleteList(SqList* L)
{//1.判断顺序表是否存在if (L->stu == NULL)//说明不存在return 0;//不可以解引用NULL//2.如果存在,则释放对应的内存free(L->stu);L->stu = NULL;//3.释放内存后,恢复表的初始值L->length = 0;L->listsize = 0;return 1;
}

步骤:
👻1.判断顺序表是否存在
如果不存在,直接退出程序,没必要进行后续操作
👻2.如果存在,则释放对应的内存
注:好习惯是只要用完free,就将指针置为NULL
👻3.释放内存后,恢复表的初始值

🌈三.辅助操作函数

以下两个函数是增删查改过程中频繁用到的操作,为防止代码冗余,将重复工作的代码封装成相应的两个函数

☀️(1)元素复制函数(CopyValue)

//元素复制
void CopyValue(Student* s1, Student* s2)
{s1->age = s2->age;s1->height = s2->height;s1->weight = s2->weight;
}

注:需要传两组数据的地址,因为形参的改变不影响实参
s1是元素复制后的位置,s2是元素复制前的位置

☀️(2)输入信息函数(Print)

void Print(Student* onestu)
{printf("请输入:\n");printf("年龄:");scanf("%d", &onestu->age);printf("身高:");scanf("%d", &onestu->height);printf("体重:");scanf("%lf", &onestu->weight);
}

在首次大规模插入信息、插入单个信息、查找信息、改动信息等时候都需要输入信息

🌈四.(增)扩大顺序表长度

//扩大数组长度
void ExpandList(SqList* L)
{//1.申请内存Student* p = (Student*)realloc(L->stu, (L->listsize + INCREASE) * sizeof(Student));//2.判断是否申请成功if (!p)exit(-1);//3.如果申请到了内存,更新顺序表的信息(包括学生数组、最大容纳学生量)L->stu = p;L->listsize += INCREASE;
}

步骤:
👻1.申请内存
由于初始化时已经由malloc初次申请了部分空间,以后每次增加空间都是在初始基础上增加,因此用realloc来扩大顺序表。
🌟realloc使用时的注意事项:
①realloc的第二个参数不是增加了多少空间,而是要扩大至多大的空间,即整个大空间的大小
②用一个新的Student类型的指针接收realloc的返回值,当返回值不为NULL时再将值赋给指向数组的指针L->stu
👻2.判断是否申请成功
👻3.如果申请到了内存,更新顺序表的信息(包括学生数组位置、最大容纳学生量)

☀️(1)对顺序表大规模插入信息

int InsertValue(SqList* L, int n)
{//1.确保有足够空间存放信息while (L->listsize < n){ExpandList(L);if (L->listsize >= n)break;}//2.有足够空间,开始插入信息for (int i = 0;i < n;i++){Print(&L->stu[i]);printf("已成功增加一组信息\n");L->length++;}return 1;
}

步骤:
1.确保有足够空间存放信息
2.有足够空间,开始插入信息

☀️(2)在顺序表尾部插入元素

//在顺序表尾部插入元素
void InsertLastList(SqList* L, Student* onestu)
{//1.判断数组满没满,满就扩大数组长度if (L->length >= L->listsize)ExpandList(L);//2.有足够空间,在尾部插入新元素(将新元素拷贝到数组末尾)CopyValue(&L->stu[L->length], onestu);//3.更新学生数量L->length++;
}

第二个参数onestu是被插入的信息
步骤:
👻1.判断数组满没满,满就用ExpandList函数扩大数组长度。
👻2.有足够空间,在尾部插入新元素(将新元素拷贝到数组末尾)
👻3.更新学生数量

☀️(3)在顺序表头部插入元素

//在顺序表头部插入元素
void InsertFirstList(SqList* L, Student* onestu)
{//1.判断数组满没满,满就扩大数组长度if (L->length >= L->listsize)ExpandList(L);//2.有足够空间,先将所有元素向后挪动1位,//  从后往前挪,要不然会被覆盖for (int i = L->length-1;i>=0;i--){CopyValue(&L->stu[i + 1], &L->stu[i]);}//3.将新元素拷贝到数组开头CopyValue(&L->stu[0], onestu);//4.更新学生数量L->length++;
}

第二个参数onestu是被插入的信息
步骤:
👻1.判断数组满没满,满就用ExpandList函数扩大数组长度。
👻2.有足够空间,先将所有元素向后挪动1位。
注:要从最后一个元素开始往前挪,如果从前往后挪的话,会将数组中的所有元素全部覆盖成第一个元素。
👻3.将新元素拷贝到数组开头
👻4.更新学生数量

☀️(4)在顺序表指定位置插入元素

//在顺序表指定位置插入元素
int InsertLocList(SqList* L, int i, Student* onestu)
{//1.判断位置是否合法if (i < 0 || i >= L->length){return 0;}//2.判断数组是否有空位,没有的话扩容if (L->length == L->listsize){ExpandList(L);}//3.将插入点及后面的元素向后移动1位for (int j = L->length - 1;j >= i;j--)//j>=i+1{//注1:要从数组的最后一个元素依次向后挪动1位,如果从插入点//     开始挪动的话,数组原先的内容会被覆盖//注2:j必须要能等于i,因为i是插入点,要连同插入点往后挪1位CopyValue(&L->stu[j + 1], &L->stu[j]);}//4.插入元素CopyValue(&L->stu[i], onestu);//5.更新表中的信息L->length++;return 1;
}

第二个参数onestu是被插入的信息
步骤:
👻1.判断位置是否合法
👻2.判断数组是否有空位,没有的话扩容
👻3.将插入点及后面的元素向后移动1位
注:
①要从数组的最后一个元素依次向后挪动1位,如果从插入点开始挪动的话,数组原先的内容会被覆盖
②j必须要能等于i,因为i是插入点,要连同插入点往后挪1位
👻4.插入元素
👻5.更新表中的信息

🌈五.(删)删除顺序表中的信息

void DropOneValue(SqList*L,Student* onestu4)
{//1.判断是否有该组数据int ret = FindOneList(L, onestu4);if (ret == -1){printf("没有该信息\n");return;}//2.进行删除for (int i = ret + 1;i <= L->length - 1;i++){CopyValue(&L->stu[i - 1], &L->stu[i]);}printf("删除成功\n");//3.成员数量信息变动L->length--;
}

第二个参数onestu4是要被删除的信息
步骤:
👻1.判断是否有该组数据
👻2.有信息的话进行删
将删除点后面的所有元素向前挪动1位
👻3.成员数量信息变动

🌈六.(查)查找顺序表中的某个元素

int FindOneList(SqList* L, Student* onestu3)
{int i = 0;while (i < L->length){if ((L->stu[i].age == onestu3->age)&& (L->stu[i].height == onestu3->height)&& (L->stu[i].weight == onestu3->weight))return i;i++;}return -1;
}

第二个参数onestu3是被查找的信息
👻1.找到的话返回这个元素在数组中的下标;找不到的话返回-1(为什么不返回0,因为下标也有可能是0)
👻2.需要增加一组Student类型的数据作为对照信息(你肯定要先告诉我你要找的人的信息我才能找到这个人存不存在、存在的话是几号)

🌈七.(改)改变顺序表中某元素信息

void ModifyOneValue(SqList* L, Student* onestu5, Student* onestu6)
{//1.判断该信息是否存在int ret=FindOneList(L, onestu5);if (ret == -1){printf("没有该信息\n");return;}//2.信息存在,进行修改printf("请输入修改后信息:\n");Print(onestu6);CopyValue(&L->stu[ret], onestu6);
}

参数二onestu5是改变前的信息,第三个参数onestu6是改变后的信息
步骤:
👻1.判断该信息是否存在
👻2.信息存在,进行修改

🌈八.遍历顺序表打印出所有元素

//遍历顺序表
void FindAllList(SqList* L)
{int i = 0;for (i = 0;i < L->length;i++){printf("age=%d,height=%d,weight=%lf\n", L->stu[i].age,L->stu[i].height, L->stu[i].weight);}
}

🎈用动态顺序表实现学生信息操作程序

(完整程序,连着的三部分)

🌈一.声明与定义

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 5
#define INCREASE 2
typedef struct
{int age;int height;double weight;
}Student;
typedef struct
{Student* stu;//Student类型的数组int length;//元素的有效个数int listsize;//最多容纳多少个元素
}SqList;

🌈二.被调用函数

//初始化顺序表
int InitList(SqList* L)
{//1.申请空间L->stu = (Student*)malloc(LIST_INIT_SIZE * sizeof(Student));//2.判断是否申请成功if (!L->stu)exit(-1);//exit(-1)表示退出程序//3.如果拿到了内存空间,就初始化顺序表L->length = 0;L->listsize = LIST_INIT_SIZE;return 1;
}
//销毁顺序表
int DeleteList(SqList* L)
{//1.判断顺序表是否存在if (L->stu == NULL)//说明不存在return 0;//不可以解引用NULL//2.如果存在,则释放对应的内存free(L->stu);L->stu = NULL;//3.释放内存后,恢复表的初始值L->length = 0;L->listsize = 0;return 1;
}
//遍历顺序表
void FindAllList(SqList* L)
{int i = 0;for (i = 0;i < L->length;i++){printf("age=%d,height=%d,weight=%lf\n", L->stu[i].age,L->stu[i].height, L->stu[i].weight);}
}
//查找学生数组中的某个元素,找到返回元素对应下标,找不到返回0
int FindOneList(SqList* L, Student* onestu3)
{int i = 0;while (i < L->length){if ((L->stu[i].age == onestu3->age)&& (L->stu[i].height == onestu3->height)&& (L->stu[i].weight == onestu3->weight))return i;i++;}return -1;
}
//扩大数组长度
void ExpandList(SqList* L)
{//1.申请内存Student* p = (Student*)realloc(L->stu, (L->listsize + INCREASE) * sizeof(Student));//2.判断是否申请成功if (!p)exit(-1);//3.如果申请到了内存,更新顺序表的信息(包括学生数组、最大容纳学生量)L->stu = p;L->listsize += INCREASE;
}
//元素复制
void CopyValue(Student* s1, Student* s2)
{s1->age = s2->age;s1->height = s2->height;s1->weight = s2->weight;
}
//在顺序表尾部插入元素
void InsertLastList(SqList* L, Student* onestu)
{//1.判断数组满没满,满就扩大数组长度if (L->length >= L->listsize)ExpandList(L);//2.有足够空间,在尾部插入新元素(将新元素拷贝到数组末尾)CopyValue(&L->stu[L->length], onestu);//3.更新学生数量L->length++;
}
//在顺序表头部插入元素
void InsertFirstList(SqList* L, Student* onestu)
{//1.判断数组满没满,满就扩大数组长度if (L->length >= L->listsize)ExpandList(L);//2.有足够空间,先将所有元素向后挪动1位,//  从后往前挪,要不然会被覆盖for (int i = L->length-1;i>=0;i--){CopyValue(&L->stu[i + 1], &L->stu[i]);}//3.将新元素拷贝到数组开头CopyValue(&L->stu[0], onestu);//4.更新学生数量L->length++;
}
//在顺序表指定位置插入元素
int InsertLocList(SqList* L, int i, Student* onestu)
{//1.判断位置是否合法if (i < 0 || i >= L->length){return 0;}//2.判断数组是否有空位,没有的话扩容if (L->length == L->listsize){ExpandList(L);}//3.将插入点及后面的元素向后移动1位for (int j = L->length - 1;j >= i;j--)//j>=i+1{//注1:要从数组的最后一个元素依次向后挪动1位,如果从插入点//     开始挪动的话,数组原先的内容会被覆盖//注2:j没必要等于i,j--时值为i-1,会把插入点之前的值也往后移动1位CopyValue(&L->stu[j + 1], &L->stu[j]);}//4.插入元素CopyValue(&L->stu[i], onestu);//5.更新表中的信息L->length++;return 1;
}
//提示输入信息
void Print(Student* onestu)
{printf("请输入:\n");printf("年龄:");scanf("%d", &onestu->age);printf("身高:");scanf("%d", &onestu->height);printf("体重:");scanf("%lf", &onestu->weight);
}
//大规模插入数据
int InsertValue(SqList* L, int n)
{//1.确保有足够空间存放信息while (L->listsize < n){ExpandList(L);if (L->listsize >= n)break;}//2.有足够空间,开始插入信息for (int i = 0;i < n;i++){Print(&L->stu[i]);printf("已成功增加一组信息\n");L->length++;}return 1;
}
//删除一个元素(一组学生信息)
void DropOneValue(SqList*L,Student* onestu4)
{//1.判断是否有该组数据int ret = FindOneList(L, onestu4);if (ret == -1){printf("没有该信息\n");return;}//2.有信息的话进行删除for (int i = ret + 1;i <= L->length - 1;i++){CopyValue(&L->stu[i - 1], &L->stu[i]);}printf("删除成功\n");//3.成员数量信息变动L->length--;
}
//更改一个元素(一组学生信息)
void ModifyOneValue(SqList* L, Student* onestu5, Student* onestu6)
{//1.判断该信息是否存在int ret=FindOneList(L, onestu5);if (ret == -1){printf("没有该信息\n");return;}//2.信息存在,进行修改printf("请输入修改后信息:\n");Print(onestu6);CopyValue(&L->stu[ret], onestu6);
}

🌈三.主函数

int main()
{//1.创建变量SqList L;Student onestu, onestu2,onestu3,onestu4,onestu5,onestu6,onestu7;//2.初始化(初步申请空间)InitList(&L);//3.初步整体性插入学生信息printf("1.整体插入信息\n");int n = 0;printf("请输入学生个数:\n");scanf("%d", &n);InsertValue(&L, n);//4.在末尾处插入学生信息printf("2.在数组末尾处插入学生信息\n");Print(&onestu);InsertLastList(&L, &onestu);//5.在开头处插入学生信息printf("3.在数组开头处插入学生信息\n");Print(&onestu7);InsertFirstList(&L, &onestu7);//6.在指定位置插入学生信息printf("4.在指定位置处插入学生信息\n");printf("请输入要插入的位置:");int i = 0;scanf("%d", &i);Print(&onestu2);InsertLocList(&L, i, &onestu2);//7.查找学生数组中的某个元素printf("5.查找某名学生\n");Print(&onestu3);int ret = FindOneList(&L, &onestu3);if (ret == 0)printf("没有该名学生\n");elseprintf("该名学生的编号是%d\n", ret);//8.删除表中元素printf("6.删除表中一组信息:\n");printf("请输入要删除的学生信息:\n");Print(&onestu4);DropOneValue(&L, &onestu4);//9.修改信息printf("7.修改表中信息\n");printf("请输入被修改学生信息:\n");Print(&onestu5);ModifyOneValue(&L, &onestu5, &onestu6);//10.展示最终顺序表(所有插入的信息)printf("8.展示最终学生信息表\n");FindAllList(&L);//10.释放空间DeleteList(&L);
}

🌈运行结果

我在输入学生信息的时候用数字代替了😂
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

感谢浏览,如有错误请及时指正!❤️

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

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

相关文章

c# 此程序集中已使用了资源标识符

严重性 代码 说明 项目 文件 行 禁止显示状态 错误 CS1508 此程序集中已使用了资源标识符“BMap.NET.WindowsForm.BMapControl.resources” BMap.NET.WindowsForm D:\MySource\Decompile\BMap.NET.WindowsForm\CSC 1 活动 运行程序时&a…

Mock-MOCO使用过程

一、jar包下载&#xff1a;https://github.com/dreamhead/moco 二、准备mock的json文件 data.json内容&#xff1a; ####GET请求 [{"description": "response使用Content-Type为charsetGBK编码格式来查看返回信息为中文的内容","request": {&q…

《Elasticsearch 源码解析与优化实战》第5章:选主流程

《Elasticsearch 源码解析与优化实战》第5章&#xff1a;选主流程 - 墨天轮 一、简介 Discovery 模块负责发现集群中的节点&#xff0c;以及选择主节点。ES 支持多种不同 Discovery 类型选择&#xff0c;内置的实现称为Zen Discovery ,其他的包括公有云平台亚马逊的EC2、谷歌…

Ansible单yaml文件部署Zabbix5.0监控平台

文章目录 Ansible单yaml文件部署Zabbix5.0监控平台节点规划案例实施基础环境准备编写剧本文件ZabbixWeb界面(1)改中文(2)添加监控主机 Ansible单yaml文件部署Zabbix5.0监控平台 节点规划 IP主机名节点192.168.200.10ansibleAnsible节点192.168.200.20zabbix-serverZabbix-ser…

深度学习入门(一):神经网络基础

一、深度学习概念 1、定义 通过训练多层网络结构对位置数据进行分类或回归&#xff0c;深度学习解决特征工程问题。 2、深度学习应用 图像处理语言识别自然语言处理 在移动端不太好&#xff0c;计算量太大了&#xff0c;速度可能会慢 eg.医学应用、自动上色 3、例子 使用…

Effective Java 案例分享(八)

39、使用注解而不是通过命名规则分类 如果需要对定义class&#xff0c;property&#xff0c;或者method进行分类管理&#xff0c;推荐的做法是使用注解对其添加类别&#xff0c;而不是通过命名规则分类。这里以JUnit为例&#xff1a; 在JUnit 3中&#xff0c;如果要写测试的方…

linux环境安装mysql数据库

一&#xff1a;查看是否自带mariadb数据库 命令&#xff1a;rpm -qa | grep mariadb 如果自带数据库则卸载掉重新安装 命令&#xff1a;yum remove mariadb-connector-c-3.1.11-2.el8_3.x86_64 二&#xff1a;将压缩文件上传到/user/local/mysql文件夹 或者直接下载 命令&a…

基于ssm+mysql+html道路养护管理系统

基于ssmmysqlhtml道路养护管理系统 一、系统介绍二、功能展示1.道路信息管理2.损害类型信息管理3.损害类型信息管理4.评定等级信息管理5.日常巡查信息管理6.定期检查信息管理 四、获取源码 一、系统介绍 系统主要功能&#xff1a;道路信息管理、损害类型信息管理、评定等级信息…

【网络原理】 (1) (应用层 传输层 UDP协议 TCP协议 TCP协议段格式 TCP内部工作机制 确认应答 超时重传 连接管理)

文章目录 应用层传输层UDP协议TCP协议TCP协议段格式TCP内部工作机制确认应答超时重传 网络原理部分我们主要学习TCP/IP协议栈这里的关键协议(TCP 和 IP),按照四层分别介绍.(物理层,我们不涉及). 应用层 我们需要学会自定义一个应用层协议. 自定义协议的原因? 当前的软件(应用…

【JAVASE】顺序和选择结构

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;浅谈Java &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; 顺序和选择 1. 顺序结构2. 分支结构2.1 …

Ubuntu18.04 下配置Clion

配置Clion 安装gcc、g、make Ubuntu中用到的编译工具是gcc©&#xff0c;g&#xff08;C&#xff09;&#xff0c;make(连接)。因此只需安装对应的工具包即可。Ubuntu下使用命令安装这些包&#xff1a; &#xff08;1&#xff09;安装gcc sudo apt install gcc&am…

解决Cannot resolve plugin org.apache.maven.plugins:xxxxxxxx

解决Cannot resolve plugin org.apache.maven.plugins:xxxxxxxx 方法一、检查配置设置 下图中三个方框圈出来的地方设置为自己的下载的maven地址&#xff0c;配置文件地址&#xff0c;仓库地址。刷新maven。 我个人试过没用&#xff0c;不过网上有的朋友用这个方法解决了。 …

Day 69-70:矩阵分解

代码&#xff1a; package dl;import java.io.*; import java.util.Random;/** Matrix factorization for recommender systems.*/public class MatrixFactorization {/*** Used to generate random numbers.*/Random rand new Random();/*** Number of users.*/int numUsers…

FANUC机器人实现2个RO输出信号互锁关联(互补)的具体方法

FANUC机器人实现2个RO输出信号互锁关联(互补)的具体方法 一般情况下,为了方便用户控制工装夹具上的电磁阀等控制工具,FANUC机器人出厂时给我们提供了8个RO输出信号,如下图所示,这8个RO信号可以各自单独使用。 那么,如果为了安全控制,需要将2个RO信号成对的进行安全互锁…

linux服务器安装redis

一、安装下载 下载安装参考文章 下载安装包地址&#xff1a;https://download.redis.io/releases/ 亲测有效&#xff0c;但是启动的步骤有一些问题 安装完成&#xff01;&#xff01;&#xff01; 二、启动 有三种启动方式 默认启动指定配置启动开机自启 说明&#xff1a…

下载JMeter的历史版本——个人推荐5.2.1版本

官网地址&#xff1a;https://archive.apache.org/dist/jmeter/binaries/

JVM-提问纯享版

一、内存区域 介绍下 Java 内存区域&#xff08;运行时数据区&#xff09;内存分配方式内存分配并发问题对象的访问定位的两种方式&#xff08;句柄和直接指针两种方式&#xff09; 二、垃圾回收 如何判断对象是否死亡&#xff08;两种方法&#xff09;。简单的介绍一下强引…

POI 导出 树形结构

参考文章&#xff1a;(327条消息) Excel树状数据绘制导出_excel导出树形结构_Deja-vu xxl的博客-CSDN博客https://blog.csdn.net/weixin_45873182/article/details/120132409?spm1001.2014.3001.5502 Overridepublic void exportPlus(String yearMonth, HttpServletRequest re…

【C语言】从零开始学习数组

&#x1f341; 博客主页:江池俊的博客 &#x1f4ab;收录专栏&#xff1a;C语言——探索高效编程的基石 &#x1f4bb; 其他专栏&#xff1a;数据结构探索 &#x1f4a1;代码仓库&#xff1a;江池俊的代码仓库 &#x1f3aa; 社区&#xff1a;C/C之家社区 &#x1f341; 如果觉…

【C++ 进阶】学习导论:C/C++ 进阶学习路线、大纲与目标

目录 一、C 学习路线 二、C 课程大纲与学习目标 &#xff08;1&#xff09;第一阶段&#xff1a;C 语言基础 &#xff08;2&#xff09;第二阶段&#xff1a;C 高级编程 &#xff08;3&#xff09;第三阶段&#xff1a;C 核心编程与桌面应用开发 &#xff08;4&#xf…