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

详解数据结构中的顺序表的手动实现,顺序表功能接口【数据结构】

文章目录

  • 线性表
    • 顺序表
      • 接口实现
        • 尾插
        • 尾删
        • 头插
        • 头删
        • 指定位置插入
        • 指定位置删除
      • 练习

线性表

线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串…
线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储

顺序表

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改

(顺序表就是数组,但是是在数组的基础上,另外还要求数据是从头开始存储 ,并且数据是连续存储的,不能跳跃间隔)

顺序表一般可以分为:

  • 静态顺序表:使用定长数组存储元素
  • 动态顺序表:使用动态开辟的数组存储

接口实现

尾插

 typedef struct SeqList
{SLDaTaType * a;int size; // 数组中存了多少个数int capacity; //数组实际容量个数
}SL;void SeqListPushBack(SL* ps, SLDaTaType x)   //尾插
{assert(ps);//空间不足则扩容 if (ps->capacity == ps->size){int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;   // 若空间为0  就放4个字节  , 否则capacity *2  SLDaTaType * tmp  = ( SLDaTaType* )realloc(ps->a, newcapacity * sizeof(SLDaTaType));if (tmp == NULL) //开辟失败{printf("realloc fail \n");exit(-1);  }ps->a = tmp;ps->capacity = newcapacity;}ps->a[ps->size] = x;  // 空间足够 ps->size++;
} 

void SeqListDestory(SL* ps) //销毁 ,防止内存泄露
{assert(ps);free(ps->a);ps->a = NULL; ps->size = ps->capacity = 0;
}

尾删

void SeqListPopBack(SL* ps)// 尾删
{assert(ps);// ps->a[ps->size - 1] = 0;assert(ps->size > 0);ps->size--;  
}

头插

最后一个数向后挪动
在这里插入图片描述

void SeqListPushFront(SL* ps, SLDaTaType x) // 头插
{assert(ps);// 挪动 int end = ps->size - 1;while (end >= 0){ps->a[end + 1] = ps->a[end];end--;}ps->a[0] = x;ps->size++;
}

头删

void SeqListPopFront(SL* ps) // 头删
{assert(ps);assert(ps->size > 0);//挪动数据int begin =1 ;while (begin<=ps->size){ps->a[begin - 1] = ps->a[begin];begin++;}ps->size--;
}

在这里插入图片描述

找到了返回x位置下标 若没有找到返回-1

int SeqListFind(SL* ps, SLDaTaType  x)
{assert(ps);for (int i = 0; i < ps->size; i++){if (ps->a[i] == x){return i;}}return -1; 
}

指定位置插入

void SeqListInsert(SL* ps, int pos, SLDaTaType x) // 指定位置插入
{assert(ps);assert(pos >=0 && pos <= ps->size);int end = ps->size -1 ;SeqListCheckCapacity(ps); //防止后面空间不足 挪动的时候越界访问while (end >= pos){//挪动 ps->a[end + 1] = ps->a[end];end--;}//插入数据ps->a[pos] = x;ps->size++;
}

在这里插入图片描述

指定位置删除

void SeqListErase(SL* ps, int pos) // 指定位置删除
{assert(ps);assert(pos >= 0 && pos < ps->size);int begin = pos + 1;while (begin < ps->size){ps->a[begin - 1] = ps->a[begin];begin++;}ps->size--;
}

在这里插入图片描述

练习

https://leetcode.cn/problems/remove-element/

思路一 : 找到所有的val ,一次挪动数据覆盖删除
时间复杂度最坏的情况是数组中绝大部分值是val甚至全部是val

假设数组中有N个数据 第一个数据是val ,这时候需要挪动N-1 个元素 ,
第二个数据是val ,得挪动N-2个元素
依次类推 第n个数据是val ,得挪动N-n
不难发现是一个等差数列 ,时间复杂度为O(N^2)

思路二:

依次遍历整个数组 ,把不是val 得值放到tmp 数组中 ,再把tmp数组得值拷贝到nums数组中 ,这样我们将时间复杂度优化到 O(N) ,但是空间复杂度 为O(N)
在这里插入图片描述

思路三 src去找nums 数组中不是val 的值 , 放到dst 指向的位置中 ,再++src ++dst
这样时间复杂度是O(N) ,空间复杂度是O(1)

在这里插入图片描述

int removeElement(int* nums, int numsSize, int val)
{int src = 0;int dst =0 ;while (src < numsSize ){if( nums[src]!=val ){nums[dst] = nums[src];src++ ;dst ++ ;    }else {src++;}}return dst;
}

https://leetcode.cn/problems/remove-duplicates-from-sorted-array/
在这里插入图片描述


在这里插入图片描述

int removeDuplicates(int* nums, int numsSize)
{if (numsSize==0  ){return 0 ;}int j =1;int i = 0;int dst = 0 ;// j 没有越界 while( j<numsSize){// 判断 i和j是否相等 不相等就继续往下找if(nums[i] ==nums[j]){j++ ;}else   // 不相等就把 nums[dst]=nums[i]{nums[dst]=nums[i];i=j;dst++;j++;}}//j越界nums[dst]=nums[i];++dst;return dst ; // 返回dst的下标
}

如果你觉得这篇文章对你有帮助,不妨动动手指给点赞收藏加转发,给鄃鳕一个大大的关注
你们的每一次支持都将转化为我前进的动力!!!

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

相关文章:

  • 【二】kubernetes操作
  • 如何在 C++ 中调用 python 解析器来执行 python 代码(五)?
  • 八 SpringMVC【拦截器】登录验证
  • PhotoShop基础使用
  • 借助阿里云 AHPA,苏打智能轻松实现降本增效
  • 美团2面:如何保障 MySQL 和 Redis 数据一致性?这样答,让面试官爱到 死去活来
  • react hooks学习记录
  • 创新型中小企业认定评定标准
  • 记录一次nginx转发代理skywalking白屏 以及nginx鉴权配置
  • 如何使用FarsightAD在活动目录域中检测攻击者部署的持久化机制
  • Python - 操作txt文件
  • 老杜MySQL入门基础 1
  • Vue中splice的使用
  • Ubuntu通过rsync和inotify实现双机热备
  • 【python】异常详解
  • pc、移动端自适应css
  • Threejs 教程1
  • WuThreat身份安全云-TVD每日漏洞情报-2023-02-23
  • C语言--模拟实现库函数qsort
  • 面向专业课教学和学习的《计算机数学》点播工具
  • 域权限维持之创建DSRM后门
  • 【苹果内购支付】关于uniapp拉起苹果内购支付注意事项、实现步骤以及踩过的坑
  • 一:BT、BLE版本说明及对比
  • php宝塔搭建部署实战多模板cms管理系统源码
  • 【数据结构初阶】手把手带你实现栈
  • liunx 端口号开放和关闭
  • 【oracle】问题分析常用查询语句
  • 将vue-devtools打包成edge插件
  • SpringBoot常见面试题汇总(超详细回答)
  • 上海亚商投顾:沪指窄幅震荡 ChatGPT概念再度走高