线性表和顺序表的学习

*一.列表的构造

由于列表是由一维数组和指针构成,当我们构造列表时首先应初始好列表的长度,大小,还有指针,可以用构造结构体来处理

typedef struct Vector {
    int size, length;
    int *data;
} Vector;

即完成列表的构造的第一步
然后开始初始化列表数据,这一步可以用构造函数来解决

void init(Vector *vector, int size) {
    vector->size = size;
    vector->length = 0;
    vector->data = (int *)malloc(sizeof(int) * size);
}

注意此处指针和结构体的混用,然后注意第四行代码,这里是为指针申请空间,即申请一个大小为4的指针空间,让data连续指向一段连续size个int空间。
接着列表一个很重要的工作是清除多余的空间这时需要用到free函数即

void clear(Vector *vector) {
    free(vector->data);
    free(vector);
}

此时我们就完成了列表的构造

二.列表的插入

列表的插入我们可以直接构造函数来实现插入工作,在开始工作前,我们要理解该工作分为哪几部,大体上来说,由判断,挪位,赋值组成。
首先我们进行第一步判断,选择的位置是否合法

if (loc<0||loc>vector->length){
    return ERROR;}

当其小于0或者大于列表长度时均不合法

接下来需要判断当前元素数量是否达到容量上限。即

if (vector->length>=vector->size){
     return ERROR;   
    } 

然后进行最关键的一步挪位,即把size以后的每一个元素往后挪一位
即把每一个元素的值赋给后一个元素的值,使用for循环和指针即可。

for (int i=vector->length;i>loc;--i)
    {
        vector->data[i]=vector->data[i-1];
    }

最后将你选择的元素插入你想要的那个位置,完成赋值操作,再将列表长度增加一

vector->data[loc]=value;
    vector->length++;
    return OK;

到这里就完成了列表中指定位置的元素插入

四.列表的搜索操作

即用for循环遍历列表,当找到你需要的值时返回其下表,找不到时返回-1。

int search(Vector *vector, int value) {
    for (int i = 0; i < vector->length; ++i) {
        if (vector->data[i] == value) {
            return i;
        }
    }
    return -1;
}

五.列表的删除

和插入操作类似,先判断删除值的位置是否合法,然后进行赋值操作,将其后面的值往前赋值,然后再将列表的长度减一。

int delete_node(Vector *vector, int index) {
    if (index < 0 || index >= vector->length) {
        return ERROR;
    }
    for (int i = index + 1; i < vector->length; ++i) {
        vector->data[i - 1] = vector->data[i];
    }
    vector->length = vector->length - 1;
    return OK;
}

这里需注意,往前赋值的操作,与插入操作刚好相反。

六.遍历列表

遍历列表即打印列表,运用循环结构,将列表的数值打印出来,这时需注意格式控制。

void print(Vector *vector) {
    for(int i=0;i<vector->length;++i){
       if(i>0){
           printf(" ");
       }
        printf("%d",vector->data[i]);
    }
    printf("\n");
}

最后总结下,数据结构的学习,其实就是将所学知识综合运用,其中大量运用,数组,指针,结构体,以及函数构造,需要明白各个操作的含义及准确用法。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页