*一.列表的构造
由于列表是由一维数组和指针构成,当我们构造列表时首先应初始好列表的长度,大小,还有指针,可以用构造结构体来处理
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");
}
最后总结下,数据结构的学习,其实就是将所学知识综合运用,其中大量运用,数组,指针,结构体,以及函数构造,需要明白各个操作的含义及准确用法。