数据结构——顺序表

数据结构是什么

        数据机构是计算机存储、组织数据的一种方式,他是将逻辑关系和物理关系它们的相互关系结合在一起,并利用这种关系实现在计算机上来对数据的存储和组织,并对他们做出适当的计算和做出一些优秀的算法,但最终不会改变数据的结构类型;      

        数据结构 = 结构定义 + 结构操作

        结构定义:

        结构定义分为两个物理结构和逻辑结构

        物理结构定义,在数据结构的静态部分,它定义了数据元素之间的关系和布局,以及每个元素的属性。例如这个文章中的顺序表,他的物理结构定义就是:

typedef struct Vector {
    int size;//顺序表的长度
    int len;//顺序表现有的元素个数
    void *data;//数据存储区
} Vector;

        而它的逻辑结构定义就是,每个元素物理结构和逻辑结构都是连续的,也就是每个元素之间的地址也是连续的;

        结构操作:

        结构操作就是在不破坏结构定义的前提下,去对定义结构里的数据进行操作,比如增删改查;例如对于顺序表的插入元素:

        

int 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语言自己来实现这些东西了,你用封装好的那不是手手到擒来;

        代码实现:

        

#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 < 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;
}

        顺序表比较简单没有什么可以说的了,如果还是没有懂,可以评论,我会对应的回复;

如果觉得对你有帮助可以点个赞谢谢 

你可能感兴趣的:(数据结构)