【数据结构】——线性表 (顺序存储和基于Java的运算实现)

int listSize = 100;

//类型未知,设定为Object,数组data存放表结点

Object[] data = new Object[listSize];

//线性表的当前表长:实际存储元素的个数

int count = 0;

//置空表:表中所有元素都置为null

public void InitList() {

for (int i = 0; i < listSize; i++) {

data[i] = null;

}

count = 0;

}

//求表长:返回表中元素个数

public int ListLength() {

return count;

}

//查找:取表中第i个元素

public Object GetNode(int i) {

//判断是否索引越界

if (i < 1 || i > listSize) {

System.out.println(“position error!”);

return null;

} else {

return data[i - 1];

}

}

//查找:查找第一个值为x的元素,并返回其位置

public int LocateNode(Object x) {

int index = -1;

for (int i = 0; i < listSize; i++) {

if (data[i].equals(x)) {

index = i;

break;

}

}

if (index != -1)

index++;

return index;

}

//插入:在顺序表L中第i个位置之前插入一个新元素x

public void InsertList(int i, int x) {

//判断插入的位置是否合法

if (i < 1 || i > listSize) {

System.out.println(“position error!”);

}

//判断表的长度是否超出限制

if (count >= listSize) {

System.out.println(“overflow!”);

}

//循环插入位置后面的元素

for (int j = count - 1; j >= i - 1; j–) {

//从最后一个元素开始逐一往后移

data[j + 1] = data[j];

}

//插入新元素x

data[i - 1] = x;

//表中实际长度加1

count++;

}

//删除:删除第i个元素,并返回该元素

public Object deleteList(int i) {

//判断删除的位置是否合法

if (i < 1 || i > count) {

System.out.println(“position error!”);

System.exit(0);

}

//获取被删除元素

Object x = data[i - 1];

//从被删除元素开始,向前循环移动后面的元素

for (int j = i; j <= count; j++) {

data[j - 1] = data[j];

}

//表中实际长度减1

count–;

return x;

}

}

测试:

public class SeqListTest {

public static void main(String[] args) {

SeqList sl = new SeqList();

//置空表

sl.InitList();

System.out.println(sl.data[0] + " " + sl.data[99]);

System.out.println(“length:” + sl.data.length);

System.out.println(“count:”+sl.count);

System.out.println();

//插入元素

sl.InsertList(1, 2);

sl.InsertList(2, 4);

sl.InsertList(3, 6);

sl.InsertList(4, 8);

//遍历表中元素

System.out.print(“表中元素有:”);

for (int i = 0; i < sl.count; i++) {

System.out.print(sl.data[i] + " ");

}

System.out.println();

//求表长

int count = sl.ListLength();

System.out.println(“元素个数:” + count);

System.out.println();

//查找(按位置)

Object o = sl.GetNode(4);

System.out.println(“第4个元素:” + o);

System.out.println();

//查找(按值)

Object o1 = sl.LocateNode(6);

System.out.println(“值为6的下标:” + o1);

System.out.println();

//删除

Object o2 = sl.deleteList(3);

System.out.println(“删除的元素为:” + o2);

System.out.print(“表中元素:”);

for (int i = 0; i < sl.count; i++) {

System.out.print(sl.data[i] + " ");

}

System.out.println();

//求表长

int count1 = sl.ListLength();

System.out.println(“元素个数:” + count1);

}

}

运行结果:

其他运算


线性表逆置

**说明:**线性表为 (a1,a2,…,a(n)),逆置之后为 (a(n),a(n-1),…,a1),以顺序表存储方式存储。

**基本思想:**以表长的一半控制循环次数,将表中最后一个元素同顺数第一个数交换,将倒数第二个元素同顺数第二个元素交换,以此类推,直至交换完为止。

代码实现:

public class SeqListTest {

public static void main(String[] args) {
    SeqList sl = new SeqList();
    //置空表
    sl.InitList();
    //插入元素
    sl.InsertList(1, 2);
    sl.InsertList(2, 4);
    sl.InsertList(3, 6);
    sl.InsertList(4, 8);
    sl.InsertList(5, 10);
    sl.InsertList(6, 12);
    //遍历初始元素
    System.out.println("初始元素:");
    for (int i = 0; i < sl.count; i++) {
        System.out.print(sl.data[i] + " ");
    }
    System.out.println();
    System.out.println();
    //逆置
    Converts(sl);
    //遍历逆置后的元素
    System.out.println("逆置后的元素:");
    for (int i = 0; i < sl.count; i++) {
        System.out.print(sl.data[i] + " ");
    }
}
//线性表逆置
public static Object[] Converts(SeqList seqList) {
    Object x;
    //获取表长的一半
    int k = seqList.count / 2;
    for (int i = 0; i < k; i++) {
        //获取前面元素的值,赋值给x
        x = seqList.data[i];
        //将后面对应的值赋值给前边的元素
        seqList.data[i] = seqList.data[seqList.count - i - 1];
        //将x的值赋值给后边的元素
        seqList.data[seqList.count - i - 1] = x;
    }
    return seqList.data;
}

}

运行结果:

温馨提示:

线性表逆置该方法里for语句里执行的三条基本语句是交换两个数值的常用语句,这个点可以记死,固定写法,非常好用。

顺序表找最大最小值

**说明:**找出最大值和最小值的元素及其所在位置。

代码实现:

public class SeqListTest {

public static void main(String[] args) {
    SeqList sl = new SeqList();
    //置空表
    sl.InitList();
    //插入元素
    sl.InsertList(1, 7);
    sl.InsertList(2, 4);
    sl.InsertList(3, 12);
    sl.InsertList(4, 24);
    sl.InsertList(5, 18);
    sl.InsertList(6, 6);
    //遍历初始元素
    System.out.println("初始元素:");
    for (int i = 0; i < sl.count; i++) {
        System.out.print(sl.data[i] + " ");
    }
    System.out.println();
    System.out.println();
    //获取最大值和最小值及其索引
    int[] ints = MaxAndMin(sl);
    System.out.println("最大值索引:" + ints[0] + "  最大值:" + ints[1]);
    System.out.println("最小值索引:" + ints[2] + "  最小值:" + ints[3]);
}
//找出最大值和最小值,及其下标
public static int[] MaxAndMin(SeqList seqList) {
    //定义一个数组,存放最大值、最小值及其索引
    int[] index = new int[4];
    //设置最大值和最小值的索引值

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

最后

分享一些资料给大家,我觉得这些都是很有用的东西,大家也可以跟着来学习,查漏补缺。

《Java高级面试》

《Java高级架构知识》

《算法知识》

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-VQzYGqQF-1712882634495)]

最后

分享一些资料给大家,我觉得这些都是很有用的东西,大家也可以跟着来学习,查漏补缺。

《Java高级面试》

[外链图片转存中…(img-LoOAR2Nm-1712882634495)]

《Java高级架构知识》

[外链图片转存中…(img-OL5UEoGh-1712882634495)]

《算法知识》

[外链图片转存中…(img-NaTYGRc9-1712882634495)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-5xJRcPrh-1712882634496)]

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值