学好数据结构和算法,是我的追求,这并不容易。
基础不牢,C语言学不好,数据结构你就推不动,数组,指针之类的东西都不会,怎么学?今天从头开始,一点儿一点儿弄懂。文章里面的代码都是天勤数据结构里面的,我按照这本书复习,加上自己的理解,写清楚思路。
1.结构体。
结构体相当于一个集合,里面一般存放一些类型不同的数据,方便应用。
用人来举例子①姓名是一个数据,假设为字符型
②身高是一个数据,假设为浮点类型
③年龄是一个数据,假设为整数类型
这三个数据是一个人的属性,分开来看没什么价值,所以把它们综合在一起,形成一个整体,这就成了结构体。
struct
{
char name;
float height;
int age;
}
以上是一个结构体。
我们可以给这个结构体起一个名字,将它打造成一个新的数据类型。
typedef struct Person
{
char name;
float height;
int age;
}Person;
用数组来类比结构体。数组里面存放的是相同类型的变量,结构体里面存放的是不同类型的变量。
2.指针
内存是由一个一个存储单元构成的,每个存储单元都有一个地址,知道地址,就知道这个存储单元。
我们用整数类型来类比指针类型。
整数类型是一种数据类型,可以声明一个整数类型的变量,这个变量里面存放的是整数;
指针类型是一种数据类型,可以声明一个指针类型的变量,这个变量里面存放的是地址。
int a;
上面这行代码,声明了一个int 类型的变量,叫做a,a中存放的是int类型的值;
int *a;
上面这行代码,声明了一个指针类型的变量,叫做a,a这个指针类型的变量里面存放着一个地址,这个地址代表的内存单元里面存放着一个int类型的值。
讲清楚了吧,这个表达能力还是很厉害的。
3.构造结点的写法
这个结点在数据结构里面到处都是。把每个结点看成一个整体,就跟把人看成一个整体一样,结点和结点之间的关系,组成了数据结构,人和人之间的关系组成了社会结构。说的虽然不太严谨,但是意思差不多。
①链表结点的构造。
跳一下知识点,这里直接把链表结点拿出来讲,不影响的。
typedef struct Node
{
int data;
struct Node *next;
}Node;
上面这个代码在定义结构体的同时,把结构体重新打造成了一个数据类型;
这个结构体分两部分,第一部分用来存放数据,第二部分用来存放地址,这个地址用来找到下一个结点。
第一句里面假设数据的数据类型为int,如有需要,可以替换。
第二句定义了一个指针变量,叫做next,用来存放下一个结点的地址。这行代码的意思是,定义了一个指针变量,用来指向和其所在结构体类型相同的结构体。这一句写的时候,整个结点还没定义完,所以要把这一句写完整。
②二叉树结点的构造
二叉树里面,子结点分左右,于是相同的定义方法。
typedef struct BTNode
{
int data;
struct BTNode *lchild;
struct BTNode *rchild;
}BTNode;
③malloc()函数
这个函数用来申请内存空间。
就等于要盖房子,去申请地皮,要不然没地方。你要多大,我就给你多大,不多不少。要完后,我把地址给你,你去盖房子。malloc()是一个函数,那么就有参数和返回值,它的返回值就是一个地址。如果有多个内存单元,返回的是它们的首地址。
这一行代码声明了一个指针变量,叫做p;
p = (int *)malloc(sizeof(int));
这一行代码,先看sizeof(int),这是说明要按照每个int类型的大小分配内存;
再看malloc(sizeof(int)),这是说明得到了已申请到的结点的地址;
(int *)是强制类型转换,把得到的地址强制转换为指向int变量的地址;
再看左边的p = ,这个意思是把刚才得到的内存单元的首地址给p,这边一定记住是首地址。
又讲清楚了吧,多厉害。
基础知识1到此结束,如有错误,请提出。