数据结构是什么
数据机构是计算机存储、组织数据的一种方式,他是将逻辑关系和物理关系它们的相互关系结合在一起,并利用这种关系实现在计算机上来对数据的存储和组织,并对他们做出适当的计算和做出一些优秀的算法,但最终不会改变数据的结构类型;
数据结构 = 结构定义 + 结构操作
结构定义:
结构定义分为两个物理结构和逻辑结构
物理结构定义,在数据结构的静态部分,它定义了数据元素之间的关系和布局,以及每个元素的属性。例如这个文章中的顺序表,他的物理结构定义就是:
typedef struct Vector {int size;//顺序表的长度int len;//顺序表现有的元素个数void *data;//数据存储区} Vector;
而它的逻辑结构定义就是,每个元素物理结构和逻辑结构都是连续的,也就是每个元素之间的地址也是连续的;
结构操作:
结构操作就是在不破坏结构定义的前提下,去对定义结构里的数据进行操作,比如增删改查;例如对于顺序表的插入元素:
int add_element(Vector *v, int ind, int val) {//插入元素//在顺序表的ind位置插入元素valif (!v) return 0;if (ind v->len) return 0;//因为元素之间必须连续,所以插入元素位置必须在[0, v->len)区间内if (v->len == v->size) return 0;//超过了结构定义的长度,无法再插入元素,这里可以去扩容,这里你们自己实现以下,也是对自己对能力的提升for (int i = v->len; i > ind; i--) {//将ind位置和以后的位置向后移,将ind的位置空出来放valv->data[i] = v->data[i - 1];}v->data[ind] = val;(v->len)++;return 1;}
顺序表
大概讲述了以下数据结构是什么,现在来说顺序表;
顺序表就是把它里面的元素的物理结构,逻辑结构都是连续起来的,也就是他们的地址是连续的,在我们的思想里也是连续的;
它其实和数组是差不太多的,但是它里面存了元素,每个元素是必须连续的,而数组你可以想存在那个数组的位置就可以存在那个位置,没有结构定义的逻辑限制;所以我上面说了在对结构操作时不能去违背结构定义;不然就像你女朋友给你买了一包搽脸巾,而你拿来擦py;你破坏了结构定义,就是你违背了你女朋友的想法;
不要想着去违背女人的想法,所以不要去违背结构定义,这样你就会很轻松的拿捏女朋友,呸,数据结构;
顺序表的物理结构定义很简单
1.他的总长度
2.他现在的长度
3.存储元素的空间(也就是数组)
而它的逻辑结构定义就是,元素的物理结构,逻辑结构都是连续起来的;
有了这几个条件就可以去实现顺序表了,然后我用的是C语言,因为C语言没有封装好的这些数据结构,只能通过自己去实现定义啊,操作啊这些,当你能用C语言自己来实现这些东西了,你用封装好的那不是手手到擒来;
代码实现:
#include #include #include typedef struct Vector {int size;//顺序表的长度int len;//顺序表现有的元素个数int *data;//数据存储区} Vector;Vector *init(int n) {//向计算机借空间,记得还回去Vector *v = (Vector *)calloc(sizeof(Vector), 1); v->data = (int *)calloc(sizeof(int), n);v->size = n;v->len = 0;return v;}int add_element(Vector *v, int ind, int val) {if (!v) return 0;if (ind v->len) return 0;//因为元素之间必须连续,所以插入元素位置必须在[0, v->len)区间内 if (v->len == v->size) return 0;//超过了结构定义的长度,无法再插入元素,这里可以去扩容,这里你们自己实现以下,也是对自己对能力的提升for (int i = v->len; i > ind; i--) {//讲ind位置和以后的位置向后移,讲ind的位置空出来放valv->data[i] = v->data[i - 1];}v->data[ind] = val;(v->len)++;return 1;} int erase(Vector *v, int ind) {//删除ind位置的元素if (!v) return 0;if (ind = v->len) return 0;//删除肯定要删除区间里的元素,区间外是没有元素的for (int i = ind + 1; i len; i++) {//直接从ind + 1往前覆盖,最终覆盖掉ind位置的元素v->data[i - 1] = v->data[i];}(v->len)--;return 1;}void output(Vector *v) {if (!v) return ;printf("Vector(%d) = [", v->len);for (int i = 0; i len; i++) {i && printf(",");printf("%d", v->data[i]);}printf("]\n");return ;}void clear(Vector *v) {//你用了就要还回去,你是借的计算机的不是你的if (!v) return ;free(v->data);free(v);return ;}int main() {//测试srand(time(0));Vector *v = init(10);int op, ind, val;for (int i = 0; i len + 2) - 1;val = rand() % 100;switch (op) {case 0:case 1:case 2: { printf("%d insert in Vector %d is %d\n", val, ind, add_element(v, ind, val)); } break;case 3: {printf("erase in Vector %d is %d\n", ind, erase(v, ind));} break;}output(v);}clear(v);//最后记得释放动态开辟的空间!!数据结构基本都会动态开辟空间return 0;}
顺序表比较简单没有什么可以说的了,如果还是没有懂,可以评论,我会对应的回复;
如果觉得对你有帮助可以点个赞谢谢