1.顺序表插入元素
向已有顺序表中插入数据元素,根据插入位置的不同,可分为以下 3 种情况
插入到顺序表的表头;
在表的中间位置插入元素;
尾随顺序表中已有元素,作为顺序表中的最后一个元素;
虽然数据元素插入顺序表中的位置有所不同,但是都使用的是同一种方式去解决,即:通过遍历,找到数据元素要插入的位置,然后做如下两步工作:
将要插入位置元素以及后续的元素整体向后移动一个位置;
将元素放到腾出来的位置上;
例如,在 {1,2,3,4,5} 的第 3 个位置上插入元素 6,实现过程如下
遍历至顺序表存储第 3 个数据元素的位置,如图 1 所示
将元素 3 以及后续元素 4 和 5 整体向后移动一个位置,如图 2 所示
3.java实现顺序表, ,原文参考 https://blog.csdn.net/qq_41478279/article/details/84294299
3.1.要怎么实现动态数组呢?
首先先向内存申请开辟一段空间,也就是一个定长数组,长度假设为len,定义一个计数的count,记录当前已用的空间,就是动态数组的长度,将count与len比较,如果count>len ,
就新开启一个len*size(这里size为扩展因子,每次空间不足的时候就扩展size倍)长的定长数组,把原来数组中元素都添加到新数组中,再放入新的元素,如果count<len,直接在原来的定长数组内添加数据就可以
3.2.可以实现哪些功能呢?
·获取当前动态数组的长度
·动态添加元素add
·获取指定位置的元素get
·在任意位置插入元素insert
·在任意位置删除元素delete
3.3.在实现过程中要注意什么?
·可以将待添加的元素设置为Object类,Objtec是所有类父类,可以添加任意类型的元素。
·有时我们需要添加的元素类型只有一种,而有时又需要添加多种元素类型,这时就需要使用泛型,它不是基本的数据类型,只是一个特殊的符号,指JAVA任意一种引用类型
具体实现
public class DynamicArray<E> {
//申请一个数组,初始定长是100
Object[] Original;
private int startLength=100;
int len=0;//当前长度
//不给数组的初始长度,使用默认的初始长度
public DynamicArray(){
Original = new Object[startLength];
}
//给定初始数组长度
public DynamicArray(int startLength){
this.startLength=startLength;
}
//添加数据的方法
public void add(E o){
if(len==Original.length){
//将数组的长度扩展一倍
Object[]newArray=new Object[Original.length*2];
//保存原来的值
for(int i=0;i<len;i++){
newArray[i]=Original[i];
}
newArray[len]=o;
//把改变后的数组赋值给原来的数组
Original=newArray;
}else{
Original[len]=o;
len++;
}
}
//返回数组的长度
public int size(){
return len;
}
//获取指定位置的数据
public Object get(int index){
return (E)Original[index];
}
//在指定位置插入数据
public void insert(E o,int index){
len++;
if(len==Original.length){
Object[] newArray=new Object[Original.length*2];
for(int i=0;i<index;i++)
newArray[i]=Original[i];
for(int i=index+1;i<len;i++)
newArray[i]=Original[i-1];
newArray[index]=o;
Original=newArray;
}else{
for(int i=len-1;i>=index;i--){
Original[i+1]=Original[i];
}
Original[index]=o;
}
}
//删除指定位置数据的方法
public Object delete(int index){
len--;
//保存要删除的元素
Object ele=Original[index];
//从删除数据位置开始,从后往前替换
for(int i=index;i<len;i++){
Original[i]=Original[i+1];
}
return ele;
}
//测试
public static void main(String[] args) {
DynamicArray test=new DynamicArray();
test.add(1);
test.add(2);
test.add(3);
System.out.println("lenghth:"+test.size());
test.insert(4, 1);
test.insert(5, 0);
test.delete(3);
for(int i=0;i<test.size();i++){
System.out.print(test.get(i)+" ");
}
}
}
将新元素 6 放入腾出的位置,如图 3 所示
因此,顺序表插入数据元素的 C 语言实现代码如下,java语言自行实现或参考上一篇文章
//插入函数,其中,elem为插入的元素,add为插入到顺序表的位置
table addTable(table t,int elem,int add)
{
//判断插入本身是否存在问题(如果插入元素位置比整张表的长度+1还大(如果相等,是尾随的情况),或者插入的位置本身不存在,程序作为提示并自动退出)
if (add>t.length+1||add<1) {
printf("插入位置有问题\n");
return t;
}
//做插入操作时,首先需要看顺序表是否有多余的存储空间提供给插入的元素,如果没有,需要申请
if (t.length==t.size) {
t.head=(int *)realloc(t.head, (t.size+1)*sizeof(int));
if (!t.head) {
printf("存储分配失败\n");
return t;
}
t.size+=1;
}
//插入操作,需要将从插入位置开始的后续元素,逐个后移
for (int i=t.length-1; i>=add-1; i--) {
t.head[i+1]=t.head[i];
}
//后移完成后,直接将所需插入元素,添加到顺序表的相应位置
t.head[add-1]=elem;
//由于添加了元素,所以长度+1
t.length++;
return t;
}
注意,动态数组额外申请更多物理空间使用的是 realloc 函数。并且,在实现后续元素整体后移的过程,目标位置其实是有数据的,还是 3,只是下一步新插入元素时会把旧元素直接覆盖
2.顺序表删除元素
从顺序表中删除指定元素,实现起来非常简单,只需找到目标元素,并将其后续所有元素整体前移 1 个位置即可
后续元素整体前移一个位置,会直接将目标元素删除,可间接实现删除元素的目的
例如,从 {1,2,3,4,5} 中删除元素 3 的过程如图 4 所示
因此,顺序表删除元素的 C 语言实现代码为
table delTable(table t,int add){
if (add>t.length || add<1) {
printf("被删除元素的位置有误\n");
return t;
}
//删除操作
for (int i=add; i<t.length; i++) {
t.head[i-1]=t.head[i];
}
t.length--;
return t;
}
3.顺序表查找元素
顺序表中查找目标元素,可以使用多种查找算法实现,比如说二分查找算法、插值查找算法等
这里,我们选择顺序查找算法,具体实现代码为
//查找函数,其中,elem表示要查找的数据元素的值
int selectTable(table t,int elem){
for (int i=0; i<t.length; i++) {
if (t.head[i]==elem) {
return i+1;
}
}
return -1;//如果查找失败,返回-1
}
4.顺序表更改元素
顺序表更改元素的实现过程是:
找到目标元素;
直接修改该元素的值;
顺序表更改元素的 C 语言实现代码为
//更改函数,其中,elem为要更改的元素,newElem为新的数据元素
table amendTable(table t,int elem,int newElem){
int add=selectTable(t, elem);
t.head[add-1]=newElem;//由于返回的是元素在顺序表中的位置,所以-1就是该元素在数组中的下标
return t;
}
5.java实现顺序表, ,原文参考 https://blog.csdn.net/qq_41478279/article/details/84294299
5.1.要怎么实现动态数组呢?
首先先向内存申请开辟一段空间,也就是一个定长数组,长度假设为len,定义一个计数的count,记录当前已用的空间,就是动态数组的长度,将count与len比较,如果count>len ,
就新开启一个len*size(这里size为扩展因子,每次空间不足的时候就扩展size倍)长的定长数组,把原来数组中元素都添加到新数组中,再放入新的元素,如果count<len,直接在原来的定长数组内添加数据就可以
5.2.可以实现哪些功能呢?
·获取当前动态数组的长度
·动态添加元素add
·获取指定位置的元素get
·在任意位置插入元素insert
·在任意位置删除元素delete
5.3.在实现过程中要注意什么?
·可以将待添加的元素设置为Object类,Objtec是所有类父类,可以添加任意类型的元素。
·有时我们需要添加的元素类型只有一种,而有时又需要添加多种元素类型,这时就需要使用泛型,它不是基本的数据类型,只是一个特殊的符号,指JAVA任意一种引用类型
5.4具体实现
public class DynamicArray<E> {
//申请一个数组,初始定长是100
Object[] Original;
private int startLength=100;
int len=0;//当前长度
//不给数组的初始长度,使用默认的初始长度
public DynamicArray(){
Original = new Object[startLength];
}
//给定初始数组长度
public DynamicArray(int startLength){
this.startLength=startLength;
}
//添加数据的方法
public void add(E o){
if(len==Original.length){
//将数组的长度扩展一倍
Object[]newArray=new Object[Original.length*2];
//保存原来的值
for(int i=0;i<len;i++){
newArray[i]=Original[i];
}
newArray[len]=o;
//把改变后的数组赋值给原来的数组
Original=newArray;
}else{
Original[len]=o;
len++;
}
}
//返回数组的长度
public int size(){
return len;
}
//获取指定位置的数据
public Object get(int index){
return (E)Original[index];
}
//在指定位置插入数据
public void insert(E o,int index){
len++;
if(len==Original.length){
Object[] newArray=new Object[Original.length*2];
for(int i=0;i<index;i++)
newArray[i]=Original[i];
for(int i=index+1;i<len;i++)
newArray[i]=Original[i-1];
newArray[index]=o;
Original=newArray;
}else{
for(int i=len-1;i>=index;i--){
Original[i+1]=Original[i];
}
Original[index]=o;
}
}
//删除指定位置数据的方法
public Object delete(int index){
len--;
//保存要删除的元素
Object ele=Original[index];
//从删除数据位置开始,从后往前替换
for(int i=index;i<len;i++){
Original[i]=Original[i+1];
}
return ele;
}
//测试
public static void main(String[] args) {
DynamicArray test=new DynamicArray();
test.add(1);
test.add(2);
test.add(3);
System.out.println("lenghth:"+test.size());
test.insert(4, 1);
test.insert(5, 0);
test.delete(3);
for(int i=0;i<test.size();i++){
System.out.print(test.get(i)+" ");
}
}
}