【数据结构顺序表】小白也能学会的增删改查操作

在这里插入图片描述
首先:小编在这里祝大家中秋快乐!!!
在这里插入图片描述

数据结构(顺序表)

大家好呀,小编我中秋节闲着是闲着(母胎solo)
就写了顺序表的增删改查
让我们趁着这次中秋佳节
一起学习顺序表叭~

顺序表的定义

什么是顺序表?

顺序表是0个或多个具有相同数据类型的数据元素的有限序列
是一段物理地址连续的存储单元依次存储元素的线性结构.
例子:顺序表, 链表., 栈, 队列

别看上面一堆专业术语,看下面的~.

讲人话就是通俗来讲
顺序表就是数组,

顺序表本质上是一种连续的数组

所以顺序表的特点就两个:

  1. 连续
  2. 数组
    那我们怎么判断是否连续呢?

如图:

我们用一个int类型的整数计算表中的个数即可
在这里插入图片描述

顺序表的分类

  1. 静态顺序表:使用指定好长度的数组存储
  2. 动态顺序表: 使用动态数组存储的

顺序表的实现

1.新建一个顺序表

顺序表的初始化
第一步:
定义一个数组来存储顺序表

private int[] elem; //用这个数组来存储数据

第二步:
定义一个int类型的usedSize来计算表中的有效数据个数

private int usedSize; //用来计算表中的有效个数

第三步:
创建顺序表的无参构造方法
在无参构造方法中默认定义顺序表的个数是10个.

//无参构造方法中默认顺序表中为10个个数
		public MyArrayList(){
			this.elem = new int[10];
		}

第四步:
创建有参构造方法
该方法可以自行指定创建多大的顺序表.

//有参构造方法中指定顺序表的个数为num个
        public MyArrayList(int num){
		    this.elem = new int[num];
        }

新建顺序表的完整代码如下:

public class MyArrayList{
		private int[] elem; //用这个数组来存储数据
		private int usedSize; //用来计算表中的有效个数

		private static final  int DEFAULLT_SIZE = 10;

		//无参构造方法中默认顺序表中为10个个数
		public MyArrayList(){
			this.elem = new int[DEFAULLT_SIZE];
		}

        //有参构造方法中指定顺序表的个数为num个
        public MyArrayList(int num){
		    this.elem = new int[num];
        }

}

好啦,我们今天就讲到这里,下次见啦,
别急,还有亿点点没有讲完呐!!!
在这里插入图片描述

2.展示顺序表中的所有元素

我们只需要进行遍历打印输出即可~
So esay ~
是不是很简单呀?
别急,还有一个小tips:

顺序表是从零开始的,所以最大下标是uesdSize -1

//打印顺序表的所有元素
	public void display(){
		for(int i = 0; i < this.usedSize -1; i++){
			System.out.print(this.elem[i] + " ");
		}
		System.out.println();
	}

3.判断表中是否包含某个元素

在该方法中传入这个元素,看看是否存在

//判断表中是否包含元素data
public boolean contains(int data){
		for(int i = 0; i < this.usedSize; i++){
				if(this.elem[i] == data){
						return true;
				}
		}
		return false;

}

4.查找某个元素的位置并返回下标

和上面那个代码的逻辑一样的~
遍历查找
找到则返回元素的下标~.

//查找元素data的位置
public int search(int data){
	for(int i = 0; i < this.usedSize; i++){
			if(this.elem[i] == data){
				return i;
			}
	}
	return -1;

}

5.判断顺序表是否为空,以及判断顺序表是否已经满了

//是否为空
public boolean isEmpty(){
	return this.usedSize == 0;
}

//是否已经满了
public boolean isFull(){
	return this.usedSize == this.elem.length;
}

6.获取指定位置的元素

目的:
在该方法中传入这个下标~
返回该下标的元素
步骤:

  1. 检验是否为空表
  2. 检验这个下标是否合法
  3. 下标不能为负数~
  4. 下标也不能大于实际的元素个数(usedSize)
  5. 以上两个条件都满足则返回元素
//获取pos下标这个位置的元素
public int get(int pos){
	//检验是否为空表
	is(isEmpty()){
		System.out.println("这个表为空");
		return 0;
	}

	//检验下标是否合法
	if(pos < 0 || pos >= usedSize){
		System.out.println("这个下标不合法");
		return 0;
	}

	//以上都满足则可以返回元素了
	retrun this.elem[pos];
}

7.给指定下标的元素更新为value

前提:依旧要去判断这个下标是否合法~

public void set(int pos, int value){
	if(pos < 0 || pos >= this.usedSize){
		System.out.println("pos位置不合法");
	}
	//pos位置合法,直接更新为value
	this.elem[pos] = value;

}

8.在顺序表中新增一个元素

  1. 在新增之前必须先去判断这个顺序表是否已经
  2. 如果已经满了,就要进行扩容的操作了
  3. 而且,新增一个元素都是在末尾增加一个
  4. 元素增加完成之后,别忘了usedSize还要加一
//新增一个data元素
public void add(int data){
			//先判满
			if(isFull()){
				this.elem = Arrays.copyOf(this.elem,2*this.elem.length);
			
			}
			this.elem[this.usedSize] =  data;
			this.usedSize++;
	}	

9.在pos位置处插入一个元素

小tips:

  1. 在插入之前依旧要先去判满
  2. 同时还要去判断pos这个下标是否合法
  3. 插入操作的逻辑演示如下图:
    在这里插入图片描述

小tips:

  1. 插入之前也要先去判断pos下标的合法性
  2. 还要判断表中数据是否已经满了,若满了,要扩容
  3. 记得在最后usedSize要加一
//在pos位置新增元素,但是要先去挪数据(从后向前挪,因为从前向后挪会覆盖数据)
	//照样要去判满
	public void add(int data, int pos){
	//判断pos这个下标(要插入数据的这个下标)的位置合不合法
		if(pos < 0 || pos > usedSize){
			System.out.println("pos位置是不合法的");
			return;
		}

		//判满
		//先判满
		if(isFull()){
			this.elem = Arrays.copyOf(this.elem,2*this.elem.length);
			
		}

		for(int i = this.UsedSize - 1; i >= pos; i--){
		//把i下标的值给到i+1下标处
				this.elem[i+1] = this.elem[i];
		
		}
		//挪好了之后在pos处放数据
		this.elem[pos] = data;
		//计数器加一
		this.usedSize++;
		
	
	}

10.删除某个元素

小前提:

删除之前要先去表中查看是否存在该元素
而且找到该元素的下标

我们活学活用,用刚刚才学的返回某个元素的下标这个方法~

int index = search(int data);

元素存在着返回下标,不存在则返回-1

我们一箭双雕,一石二鸟!!!
完美解决以上的两个小前提~

注意别忘了最后的usedSize要减一
顺序表中删除数据的逻辑如图:

在这里插入图片描述

//删除一个数据data
	//删除之前要先去找这个数据
	//找到之后,让后面的数据向前覆盖就可以删除这个数据了
	//   当i为usedSize - 1 时,i+1 的值为null,所以i必须小于usedSize - 1
	public void remove(int data){
		//先去找一找这个元素是不是存在,找到了,就返回下标
		int index =  indexof(data);
		if(index == -1){
			//没有找到这个下标,说明该表中没有这个数据
			System.out.println("表中没有这个数据");
			return;
		}
		//找到啦,而且下标是index
		for(int i = index; i < usedSize - 1; i++){
				this.elem[i] = this.elem[i + 1];
		}
	
		//删除了之后计数器就减一
		this.usedSize--;
	}

11.获取顺序表的长度

//获取顺序表的长度
	public int size(){
		return this.usedSize;
	
	}

12.清空顺序表

public void clear(){
	this.usedSize = 0;

}

好啦,关于顺序表的操作就到此为止吧~
今天,看到这里,辛苦你啦,你真厉害!!!
祝你中秋快乐呀~
晚安~
在这里插入图片描述

最后,完整代码如下:

public class MyArrayList {  
    private int[] elem; //用这个数组来存储数据  
    private int usedSize; //用来计算表中的有效个数  
  
    private static final int DEFAULLT_SIZE = 10;  
  
    //无参构造方法中默认顺序表中为10个个数  
    public MyArrayList() {  
        this.elem = new int[DEFAULLT_SIZE];  
    }  
  
    //有参构造方法中指定顺序表的个数为num个  
    public MyArrayList(int num) {  
        this.elem = new int[num];  
    }  
  
  
    //打印顺序表的所有元素  
    public void display() {  
        for (int i = 0; i < this.usedSize - 1; i++) {  
            System.out.print(this.elem[i] + " ");  
        }  
        System.out.println();  
    }  
  
  
    //判断表中是否包含元素data  
    public boolean contains(int data) {  
        for (int i = 0; i < this.usedSize; i++) {  
            if (this.elem[i] == data) {  
                return true;  
            }  
        }  
        return false;  
  
    }  
  
  
    //查找元素data的位置  
    public int search(int data) {  
        for (int i = 0; i < this.usedSize; i++) {  
            if (this.elem[i] == data) {  
                return i;  
            }  
        }  
        return -1;  
  
    }  
  
    public boolean isEmpty() {  
        return this.usedSize == 0;  
    }  
  
  
    //获取pos下标这个位置的元素  
    public int get(int pos) {  
        //检验是否为空表  
        if (isEmpty()) {  
            System.out.println("这个表为空");  
            return 0;  
        }  
  
  
        //检验下标是否合法  
        if (pos < 0 || pos >= usedSize) {  
            System.out.println("这个下标不合法");  
            return 0;  
        }  
  
        //以上都满足则可以返回元素了  
        return this.elem[pos];  
    }  
  
  
    //将指定元素更新为value  
    public void set(int pos, int value) {  
        if (pos < 0 || pos >= this.usedSize) {  
            System.out.println("pos位置不合法");  
        }  
        //pos位置合法,直接更新为value  
        this.elem[pos] = value;  
  
    }  
  
    //是否已经满了  
    public boolean isFull() {  
        return this.usedSize == this.elem.length;  
    }  
  
  
    //新增一个data元素  
    public void add(int data) {  
        //先判满  
        if (isFull()) {  
            this.elem = Arrays.copyOf(this.elem, 2 * this.elem.length);  
  
        }  
        this.elem[this.usedSize] = data;  
        this.usedSize++;  
    }  
  
  
    //在pos位置新增元素,但是要先去挪数据(从后向前挪,因为从前向后挪会覆盖数据)  
    //照样要去判满  
    public void add(int data, int pos) {  
        //判断pos这个下标(要插入数据的这个下标)的位置合不合法  
        if (pos < 0 || pos > usedSize) {  
            System.out.println("pos位置是不合法的");  
            return;  
        }  
  
        //判满  
        //先判满  
        if (isFull()) {  
            this.elem = Arrays.copyOf(this.elem, 2 * this.elem.length);  
  
        }  
  
        for (int i = this.usedSize - 1; i >= pos; i--) {  
            //把i下标的值给到i+1下标处  
            this.elem[i + 1] = this.elem[i];  
  
        }  
        //挪好了之后在pos处放数据  
        this.elem[pos] = data;  
        //计数器加一  
        this.usedSize++;  
  
  
    }  
  
  
    //删除一个数据data  
    //删除之前要先去找这个数据  
    //找到之后,让后面的数据向前覆盖就可以删除这个数据了  
    //   当i为usedSize - 1 时,i+1 的值为null,所以i必须小于usedSize - 1  
    public void remove(int data) {  
        //先去找一找这个元素是不是存在,找到了,就返回下标  
        int index = search(data);  
        if (index == -1) {  
            //没有找到这个下标,说明该表中没有这个数据  
            System.out.println("表中没有这个数据");  
            return;  
        }  
        //找到啦,而且下标是index  
        for (int i = index; i < usedSize - 1; i++) {  
            this.elem[i] = this.elem[i + 1];  
        }  
  
        //删除了之后计数器就减一  
        this.usedSize--;  
    }  
  
  
    //获取顺序表的长度  
    public int size() {  
        return this.usedSize;  
  
    }  
  
  
    //清空顺序表  
    public void clear() {  
        this.usedSize = 0;  
  
    }  
  
  
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值