1、 #includestdio.h#includestdlib.h#includetime.h//类型重命名typedef struct Vector {int *data;int size, length;}Vector;//初始化1个存储n个元素的顺序表Vector* init(int n) {//申请一个顺序表的空间Vector* vec = (Vect
1、
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//类型重命名
typedef struct Vector
{
int *data;
int size, length;
}Vector;
//初始化1个存储n个元素的顺序表
Vector* init(int n)
{
//申请一个顺序表的空间
Vector* vec = (Vector*)malloc(sizeof(Vector));
//申请顺序表中连续存储区的存储空间
vec->data = (int*)malloc(sizeof(int) * n);
vec->size = n;
vec->length = 0;
return vec;
}
//顺序表的插入操作(顺序表,插入位置,插入值)
int insert(Vector* vec,int ind,int val)
{
//排除异常
if (vec == NULL)return 0;
if (vec->length == vec->size)return 0;
if (ind < 0 || ind > vec->length)return 0;
//将插入位置后方数据后移一位
for (int i = vec->length; i > ind; i--)
{
vec->data[i] = vec->data[i - 1];
}
vec->data[ind] = val;
vec->length += 1;
return 1;
}
//顺序表的删除操作(顺序表,位置)
int erase(Vector* vec, int ind)
{
//排除异常
if (vec == NULL)return 0;
if (vec->length == vec->size)return 0;
if (ind < 0 || ind >= vec->length)return 0;
//将后方位置元素向前移动一位
for (int i = ind + 1; i < vec->length; i++)
{
vec->data[i - 1] = vec->data[i];
}
vec->length -= 1;
return 1;
}
//输出顺序表
void output(Vector* vec)
{
printf("Vector(%d) = [", vec->length);
for (int i = 0; i < vec->length; i++)
{
if (i != 0)printf(", ");
printf("%d", vec->data[i]);
}
printf("]\n");
return;
}
//顺序表的销毁操作
void clear(Vector* vec)
{
if (vec == NULL)return;
//先顺序表销毁数据区
free(vec->data);
//再顺序表销毁本身空间
free(vec);
return;
}
//主函数
int main()
{
//传入当前时间作为随机数种子
srand(time(0));
//随机操作20组数
#define MAX_OP 20
Vector* vec = init(MAX_OP);
int op, ind, val;
for (int i = 0; i < MAX_OP; i++)
{
op = rand() % 2;//得到的 op 为0或1
ind = rand() % (vec->length + 1);//随机数索引
val = rand() % 100;//0-100之内随机生成一个值
//判断操作功能 0:插入、1:删除
switch (op)
{
case 0:
{
printf("insert %d at %d to vector = %d\n",
val, ind, insert(vec, ind, val));
} break;
case 1:
{
printf("erase item at %d from vector = %d\n",
ind, erase(vec, ind));
} break;
}
output(vec);
}
return 0;
}
2、上述代码只能存储最大为20个空间的数据,故一下代码进行升级可以扩容操作
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//类型重命名
typedef struct Vector
{
int *data;
int size, length;
}Vector;
//初始化1个存储n个元素的顺序表
Vector* init(int n)
{
//申请一个顺序表的空间
Vector* vec = (Vector*)malloc(sizeof(Vector));
//申请顺序表中连续存储区的存储空间
vec->data = (int*)malloc(sizeof(int) * n);
vec->size = n;
vec->length = 0;
return vec;
}
//对顺序表扩容操作
int expand(Vector* vec)
{
int new_size = vec->size * 2;
int* p = (int*)realloc(vec->data, sizeof(int) * new_size);//重新分配
if (p == NULL) return 0;
vec->size = new_size;
vec->data = p;
return 1;
}
//顺序表的插入操作(顺序表,插入位置,插入值)
int insert(Vector* vec,int ind,int val)
{
//排除异常
if (vec == NULL)return 0;
if (vec->size == vec->length)
{
if (!expand(vec))return;//分配空间失败则return
printf("expand vector size to %d success\n", vec->size);
}
if (ind < 0 || ind > vec->length)return 0;
//将插入位置后方数据后移一位
for (int i = vec->length; i > ind; i--)
{
vec->data[i] = vec->data[i - 1];
}
vec->data[ind] = val;
vec->length += 1;
return 1;
}
//顺序表的删除操作(顺序表,位置)
int erase(Vector* vec, int ind)
{
//排除异常
if (vec == NULL)return 0;
if (vec->length == vec->size)return 0;
if (ind < 0 || ind >= vec->length)return 0;
//将后方位置元素向前移动一位
for (int i = ind + 1; i < vec->length; i++)
{
vec->data[i - 1] = vec->data[i];
}
vec->length -= 1;
return 1;
}
//输出顺序表
void output(Vector* vec)
{
printf("Vector(%d) = [", vec->length);
for (int i = 0; i < vec->length; i++)
{
if (i != 0)printf(", ");
printf("%d", vec->data[i]);
}
printf("]\n");
return;
}
//顺序表的销毁操作
void clear(Vector* vec)
{
if (vec == NULL)return;
//先顺序表销毁数据区
free(vec->data);
//再顺序表销毁本身空间
free(vec);
return;
}
//主函数
int main()
{
//传入当前时间作为随机数种子
srand(time(0));
//随机操作20组数
#define MAX_OP 20
Vector* vec = init(1);
int op, ind, val;
for (int i = 0; i < MAX_OP; i++)
{
op = rand() % 2;//得到的 op 为0或1
ind = rand() % (vec->length + 1);//随机数索引
val = rand() % 100;//0-100之内随机生成一个值
//判断操作功能 0:插入、1:删除
switch (op)
{
case 0:
{
printf("insert %d at %d to vector = %d\n",
val, ind, insert(vec, ind, val));
} break;
case 1:
{
printf("erase item at %d from vector = %d\n",
ind, erase(vec, ind));
} break;
}
output(vec);
printf("\n");
}
return 0;
}
自此完成
Love for Ever Day