我们总是想的太多,说的太多,做的太少。
写作动机
很早之前就想着有时间建立一个博客,记录自己的学习笔记。但是由于课程较多,再加上自己比较懒,这个想法便一而再,再而三地被搁置。刚好最近放假在家里没什么事情,就想着把这个事情重新捡起来,思来想去决定先从数据结构写起。回想我初学数据结构的时候,道理感觉自己都懂,但是真当自己动手coding的时候就傻了眼,不是这里有语法错误,就是那里有红色波浪线。等好不容易把代码写完,编译和运行又有一堆bug,不是xxx未定义,就是segmention fault。而且很多时候明明是对着书敲的代码,但是就是不对,问题也不知道出在哪里。我想这可能是初学者的一个痛点了,因此我想写一个系列的博客来记录一下在学习数据结构的过程中出现的一些问题,从如何搭建编译环境,到如何编译运行,再到如何debug都做一个简单的介绍。当然,本人水平有限,如有错误,请不吝赐教。最后本系列中所有出现的代码都会放到我的GitHub上。
约定
一般来说,数据结构都是使用C语言来实现的,本系列将依旧使用C语言实现。这里和读者约定一下C语言编程规范,方便各位后面阅读和debug,当然如果各位有自己的规范那就不用可以修改了,适合自己的才是最好的。
- 与命名相关
- 宏定义、常量、枚举值使用全大写命名法
- 文件名、函数、结构体使用大驼峰命名法,变量使用小驼峰命名法
- 命名使用有意义的英文单词,不要使用拼音,或者一个字母
- 与排版相关
- 代码缩进统一使用四个空格
- 导入头文件的时候,
#
和头文件名之间要有空格 - 花括号左边需要空一格,花括号右边如果还有代码也需要空一格,若是
;
就不用空格 - 每个函数定义结束后,相对独立的程序块之间(逻辑密切除外)、变量说明和程序块中间之后必须加空行
- 注释
- 单行注释使用
//
,与之前的语句相距两个空格 - 多行注释使用
/**...*/
,结尾的/
与开头的第二个*
对齐 - 注释可以写中文也可以写英文,但是在一个文件中必须保持一致
- 单行注释使用
下面贴一段我写的代码,让大家更好的了解上述的约定
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 128
typedef int ElemType;
typedef struct DemoStruct {
ElemType elem[MAXSIZE]; // ElemType类型的数组
char *info; // char类型的变量
} DemoStruct, *DemoStuctPtr;
/** printInfo(const DemoStruct &demo) -> none
* 用于打印实例demo中的elem的元素
* @params:
* @param demo: 一个DemoStruct类型的数据结构
* @return: none
*/
void PrintInfo(const DemoStruct &demo) {
for(int i = 0; i < MAXSIZE; i++) {
// 格式化打印信息(避免一行代码过长,这里在上一行写注释)
printf("elem[%d] = %d\n", i, demo.elem[i]);
}
}
int main() {
// 创建多个实例时,可以用变量名后接下划线数字的方式进行区分
DemoStruct demo_1;
DemoStructPtr demo_2;
PrintInfo(demo_1);
return 0;
}
开发环境搭建
我是用的开发环境是从Windows 10商店下载的Ubuntu 18.04子系统,安装的编译器是gcc 7.5.0,使用的编辑器是Vim,这样一套开发环境搭建起来比较简单,也是我所推荐的,这里并不强制要求,不论是Windows 的Visio studio + MSVC,还是Mac的xcode + clang都可以,只要用着顺手就行。下面推荐几个博客,可以参考一下如何进行环境搭建,如果搭建过程中出现了错误可以自行百度(会搜索也是一项技能!)
Windows 10 下安装Ubuntu(Wsl)
Windows 10安装 WSL2 (Ubuntu 20.04)
wsl2的Error 0x80370102 解决方案
等到子系统安装完成,并且设置好账户之后,先输入如下指令安装gcc(切换权限到root用户,然后使用apt 包管理工具安装gcc,apt会很“智能”的帮助我们选择合适的版本下载安装),待一切安装完成之后就可以快乐地coding啦~
sudo apt install gcc
最后还得多说一下,因为&
在C和C++中有不同的意义,而后面写代码的时候,我们会经常用到&
,如果用C
标准去编译就可能出问题,所以我们在编译代码的时候使用c++
的标准进行编译。我推荐大家把源代码的后缀名改成.cpp
或者.c++
这样编译器会自动选择用C++
的标准去编译,或者也可以直接在编译的时候用g++
(使用编译器为gcc)进行编译,当然这都是后话了,等到正式动手的时候我们再详细介绍。