数据结构是什么
数据机构是计算机存储、组织数据的一种方式,他是将逻辑关系和物理关系它们的相互关系结合在一起,并利用这种关系实现在计算机上来对数据的存储和组织,并对他们做出适当的计算和做出一些优秀的算法,但最终不会改变数据的结构类型;
数据结构 = 结构定义 + 结构操作
结构定义:
结构定义分为两个物理结构和逻辑结构
物理结构定义,在数据结构的静态部分,它定义了数据元素之间的关系和布局,以及每个元素的属性。例如这个文章中的顺序表,他的物理结构定义就是:
cpptypedef struct Vector { int size;//顺序表的长度 int len;//顺序表现有的元素个数 void *data;//数据存储区 } Vector;
而它的逻辑结构定义就是,每个元素物理结构和逻辑结构都是连续的,也就是每个元素之间的地址也是连续的;
结构操作:
结构操作就是在不破坏结构定义的前提下,去对定义结构里的数据进行操作,比如增删改查;例如对于顺序表的插入元素:
cppint add_element(Vector *v, int ind, int val) {//插入元素 //在顺序表的ind位置插入元素val if (!v) return 0; if (ind < 0 || 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的位置空出来放val v->data[i] = v->data[i - 1]; } v->data[ind] = val; (v->len)++; return 1; }
顺序表
大概讲述了以下数据结构是什么,现在来说顺序表;
顺序表就是把它里面的元素的物理结构,逻辑结构都是连续起来的,也就是他们的地址是连续的,在我们的思想里也是连续的;
它其实和数组是差不太多的,但是它里面存了元素,每个元素是必须连续的,而数组你可以想存在那个数组的位置就可以存在那个位置,没有结构定义的逻辑限制;所以我上面说了在对结构操作时不能去违背结构定义;不然就像你女朋友给你买了一包搽脸巾,而你拿来擦py;你破坏了结构定义,就是你违背了你女朋友的想法;
不要想着去违背女人的想法,所以不要去违背结构定义,这样你就会很轻松的拿捏女朋友,呸,数据结构;
顺序表的物理结构定义很简单
1.他的总长度
2.他现在的长度
3.存储元素的空间(也就是数组)
而它的逻辑结构定义就是,元素的物理结构,逻辑结构都是连续起来的;
有了这几个条件就可以去实现顺序表了,然后我用的是C语言,因为C语言没有封装好的这些数据结构,只能通过自己去实现定义啊,操作啊这些,当你能用C语言自己来实现这些东西了,你用封装好的那不是手手到擒来;
代码实现:
cpp#include <stdio.h> #include <time.h> #include <stdlib.h> 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 < 0 || 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的位置空出来放val v->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 < 0 || ind >= v->len) return 0;//删除肯定要删除区间里的元素,区间外是没有元素的 for (int i = ind + 1; i < v->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 < v->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 < 20; i++) { op = rand() % 4;//1/4概率删除,3/4概率添加 ind = rand() % (v->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; }
顺序表比较简单没有什么可以说的了,如果还是没有懂,可以评论,我会对应的回复;
如果觉得对你有帮助可以点个赞谢谢