当前位置: 首页 > news >正文

c实现顺序表

 目录

c语言实现顺序表

完整代码实现


 c语言实现顺序表

顺序表的结构定义:

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;                                 // 存储个数初始化为0p->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,先定义一个指针,先给这个指针赋予reallocif( 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;                                 // 存储个数初始化为0p->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 10vector *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 ; 删除 为 0printf("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;
}

http://www.lryc.cn/news/297496.html

相关文章:

  • 微软为新闻编辑行业推出 AI 辅助项目,记者参加免费课程
  • openssl3.2 - exp - buffer to BIO
  • Android 13.0 系统framework修改低电量关机值为3%
  • 【EAI 013】BC-Z: Zero-Shot Task Generalization with Robotic Imitation Learning
  • 一文讲透ast.literal_eval() eval() json.loads()
  • 微软.NET6开发的C#特性——类、结构体和联合体
  • naiveui 上传图片遇到的坑 Upload
  • 安全之护网(HVV)、红蓝对抗
  • Leetcode 213 打家劫舍 II
  • 【C语言】三子棋游戏实现代码
  • docker常用10条容器操作命令
  • 《MySQL 简易速速上手小册》第2章:数据库设计最佳实践(2024 最新版)
  • 利用YOLOv8 pose estimation 进行 人的 头部等马赛克
  • 【Python 千题 —— 基础篇】查找年龄
  • 前后端通讯:前端调用后端接口的五种方式,优劣势和场景
  • Mysql大表添加字段失败解决方案
  • (52)只出现一次的数字III
  • Linux增删ip
  • 【计算机网络】时延,丢包,吞吐量(分组交换网络
  • 张楠辞任抖音集团CEO;东方甄选将开服饰号;小红书新增“附近”一级入口;华为分红770亿元
  • ES监控方法以及核心指标
  • 无人机应用场景和发展趋势,无人机技术的未来发展趋势分析
  • JavaGuide
  • IDEA创建SpringBoot+Mybatis-Plus项目
  • 第9章 SpringBoot综合项目实战——个人博客系统
  • 怎么理解 Redis 事务
  • react中的diff算法
  • 【医学大模型 尘肺病】PneumoLLM:少样本大模型诊断尘肺病新方法
  • 【SpringBootStarter】自定义全局加解密组件
  • 【射影几何15】python双曲几何工具geometry_tools