赞
踩
顺序表的结构定义:
typedef struct vector { int size; // 顺序表的容量 int count; // 顺序表现在存储了多少个数据 int *data; // 指针指向连续的整型存储空间 } vector;顺序表的结构操作:
1、初始化顺序表
vector *getNewVector(int n) // 获取一个存储上限为n的顺序表 { vector *p = (vector *)malloc(sizeof(vector)); // 为顺序表结构体动态开辟空间 p->size = n; // 上限 p->count = 0; // 存储个数初始化为0 p->data = (int *)malloc(sizeof(int *) * n); // 指针指向连续的存出区 return p; }2、销毁顺序表
void clear(vector *v) { if (v == NULL) return; // 如果没有顺序表则返回 free(v->data); // 先销毁连续的存储区 free(v); // 再销毁顺序表本身的存储空间 return; }3、插入数据
int insert(vector *v, int pos, int value) // 在pos位置插入 { if (pos < 0 || pos > v->count) return 0; // 插入位置合不合法 // if (v->size == v->count) // return 0; if(v->size == v->count && !expand(v)) return 0; // 判断表是否满了 for (int i = v->count - 1; i >= pos; i--) // 逆序遍历,后移 { v->data[i + 1] = v->data[i]; } v->data[pos] = value; // 插入 v->count += 1; // 维护数据 return 1; }4、删除数据
int erase(vector *v, int pos) // 在pos位置删除数据 { if (pos < 0 || pos >= v->count) return 0; // 删除位置合法不 if (v->count == 0) return 0; // 无数据 for (int i = pos + 1; i < v->size; i++) // 前序遍历,前移 { v->data[i - 1] = v->data[i]; } v->count -= 1; // 维护数据 return 1; }5、输出数据
// 5、输出数据 void output_vector(vector *v) { int len = 0; for (int i = 0; i < v->size; i++) { len += printf("%3d", i); } printf("\n"); for (int i = 0; i < len; i++) printf("-"); printf("\n"); for (int i = 0; i < v->count; i++) { printf("%3d", v->data[i]); } printf("\n"); printf("\n"); return; }6、扩容数据
注意:
realloc的三种工作方式
1、试着在原内存的基础上向后延展内存空间
2、当后面的内存不够用了,会重新找一块内存将原来的复制过来然后向后延展
3、若重新找的内存没有足够大的,就返回NULL。
int expand(vector* v) { if(v == NULL) return 0; int * p = (int *)realloc(v->data,sizeof(int) * 2 * v->size); //为了避免realloc工作原理产生的bug,先定义一个指针,先给这个指针赋予realloc if( p == NULL) return 0; //若p返回NULL,则扩容空间失败 返回就可以了 v->data = p; v->size *= 2; return 1; }
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
-
- // 顺序表 结构定义
- typedef struct vector
- {
- int size; // 顺序表的容量
- int count; // 顺序表现在存储了多少个数据
- int *data; // 指针指向连续的整型存储空间
- } vector;
-
- // 顺序表 结构操作
- // 1、初始化顺序表
- vector *getNewVector(int n) // 获取一个存储上限为n的顺序表
- {
- vector *p = (vector *)malloc(sizeof(vector)); // 为顺序表结构体动态开辟空间
- p->size = n; // 上限
- p->count = 0; // 存储个数初始化为0
- p->data = (int *)malloc(sizeof(int *) * n); // 指针指向连续的存出区
- return p;
- }
- // 2、销毁顺序表
- void clear(vector *v)
- {
- if (v == NULL)
- return; // 如果没有顺序表则返回
- free(v->data); // 先销毁连续的存储区
- free(v); // 再销毁顺序表本身的存储空间
- return;
- }
- //6、扩容
- int expand(vector* v)
- {
- if(v == NULL) return 0;
- int * p = (int *)realloc(v->data,sizeof(int) * 2 * v->size);
- if( p == NULL) return 0;
- v->data = p;
- v->size *= 2;
- return 1;
- }
- // 3、插入
- int insert(vector *v, int pos, int value) // 在pos位置插入
- {
- if (pos < 0 || pos > v->count)
- return 0; // 插入位置合不合法
- // if (v->size == v->count)
- // return 0;
- if(v->size == v->count && !expand(v)) return 0; // 判断表是否满了
- for (int i = v->count - 1; i >= pos; i--) // 逆序遍历,后移
- {
- v->data[i + 1] = v->data[i];
- }
- v->data[pos] = value; // 插入
- v->count += 1; // 维护数据
- return 1;
- }
- // 4、删除
- int erase(vector *v, int pos) // 在pos位置删除数据
- {
- if (pos < 0 || pos >= v->count)
- return 0; // 删除位置合法不
- if (v->count == 0)
- return 0; // 无数据
- for (int i = pos + 1; i < v->size; i++) // 前序遍历,前移
- {
- v->data[i - 1] = v->data[i];
- }
- v->count -= 1; // 维护数据
- return 1;
- }
- // 5、输出数据
- void output_vector(vector *v)
- {
- int len = 0;
- for (int i = 0; i < v->size; i++)
- {
- len += printf("%3d", i);
- }
- printf("\n");
- for (int i = 0; i < len; i++)
- printf("-");
- printf("\n");
- for (int i = 0; i < v->count; i++)
- {
- printf("%3d", v->data[i]);
- }
- printf("\n");
- printf("\n");
- return;
- }
-
- int main(void)
- {
- srand(time(0)); //实现随机数
- #define MAX_OP 10
- vector *v = getNewVector(2);
- for (int i = 0; i < MAX_OP; i++)
- {
- int op = rand() % 4, pos, val, ret;
- switch (op)
- {
- //75% 插入
- case 0:
- case 1:
- case 2:
- pos = rand() % (v->count + 2); //随机位置
- val = rand() % 100; //随机值
- ret = insert(v, pos, val); //插入 为 1 ; 删除 为 0
- printf("insert %d at %d to vector = %d\n",
- val, pos, ret);
- break;
- //25% 删除
- case 3:
- pos = rand() % (v->count + 2);
- ret = erase(v, pos);
- printf("erase item at %d in vector = %d\n",
- pos, ret);
- break;
- }
- output_vector(v);
- }
- clear(v); //销毁表
-
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。