数据结构
Posted HanaKoo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构相关的知识,希望对你有一定的参考价值。
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
以上是关于数据结构的主要内容,如果未能解决你的问题,请参考以下文章