五种编程语言解释数据结构与算法——顺序表2(java与C++语言实现)
5、java实现方式:
5.1、顺序表的抽象结构
package com.xgp.顺序表;
public interface MyList<T> {
//1. initList(&L):初始化表。构造一个空的线性表。放回值应该是一个线性表
MyList<T> initList();
//2. destroyList(&L):销毁操作。销毁线性表,并释放线性表L所占的内存空间。放回值为void
boolean destroyList();
//3. locateElem(L,e):按值查找操作。在表中L查找具有给定关键值的元素。放回一个int类型
int locateElem(T value);
//5. listInsert(&L,i,e):插入操作。在表L中的第i个位置上插入指定的元素e。
boolean listInsert(int pos,T value);
//4. getElem(L,i):按位查找。获取表中第i个位置的元素的值。
T getElem(int pos);
//6. listDelete(&L,i,e):删除操作。删除表L中第i个位置的元素。
boolean listDelete(int pos);
//7. PrintList(L):输出操作。按前后顺序输出线性表L的所有元素值。
void PrintList();
//8. empty(L):判空操作。若L为空表,则放回true,否则放回false。
boolean isEmpty();
//9. length(L):求表长。放回线性表L的长度,即L中数据元素的个数。
int getLength();
}
5.2、顺序表的实现类
package com.xgp.顺序表;
public class MyListImpl<T> implements MyList<T> {
private Object arr[] = null;
private int size;
@Override
public MyList<T> initList() {
arr = new Object[20];
size = 0;
return this;
}
@Override
public boolean destroyList() {
arr = null;
size = 0;
System.gc();
return true;
}
@Override
public int locateElem(T value) {
if(arr == null) return 0;
for(int i = 0;i < size;i++) {
if(arr[i].equals(value)) return i + 1;
}
return 0;
}
@Override
public boolean listInsert(int pos, T value) {
if(arr == null) return false;
if(pos < 1 || pos > size + 1) return false;
if(size >= arr.length) {
//扩容
Object[] newarr = new Object[arr.length * 2];
//拷贝
for(int i = 0;i < size;i++) {
newarr[i] = arr[i];
}
//修改指向
arr = newarr;
System.gc();
}
//插入
for(int i = size;size >= pos;pos--) {
arr[i] = arr[i - 1];
}
arr[pos - 1] = value;
size++;
return true;
}
@Override
public T getElem(int pos) {
if(arr == null) return null;
if(pos < 1 || pos > size) return null;
return (T) arr[pos - 1];
}
@Override
public boolean listDelete(int pos) {
if(arr == null) return false;
if(pos < 1 || pos > size) return false;
for(int i = pos - 1;i < size - 1;i++) {
arr[i] = arr[i+1];
}
size--;
return true;
}
@Override
public void PrintList() {
for (int i = 0;i < size;i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
@Override
public boolean isEmpty() {
return arr == null;
}
@Override
public int getLength() {
return size;
}
}
5.3、顺序表的测试类
package com.xgp.顺序表;
public class Main {
public static void main(String[] args) {
//1、测试初始化操作
MyList<Integer> list = new MyListImpl<>();
list.initList();
//2、测试插入操作
for(int i = 1;i < 100;i++) {
if(list.listInsert(i,i*100)) System.out.print( i + "号元素插入成功 ");
}
System.out.println();
//3、测试判空操作
if(list.isEmpty()) System.out.println("空表");
else System.out.println("不是空表");
//4、测试求表长操作
System.out.println(list.getLength());
//5、测试按位删除操作
if(list.listDelete(56)) System.out.println("删除成功");
//6、测试按位查找的操作
System.out.println(list.getElem(56));
//7、测试按值查找的操作
System.out.println(list.locateElem(1000));
//8、测试输出操作
list.PrintList();
//9、测试销毁操作
if(list.destroyList()) System.out.println("销毁成功");
}
}
5.4、输出结果
1号元素插入成功 2号元素插入成功 3号元素插入成功 4号元素插入成功 5号元素插入成功 6号元素插入成功 7号元素插入成功 8号元素插入成功 9号元素插入成功 10号元素插入成功 11号元素插入成功 12号元素插入成功 13号元素插入成功 14号元素插入成功 15号元素插入成功 16号元素插入成功 17号元素插入成功 18号元素插入成功 19号元素插入成功 20号元素插入成功 21号元素插入成功 22号元素插入成功 23号元素插入成功 24号元素插入成功 25号元素插入成功 26号元素插入成功 27号元素插入成功 28号元素插入成功 29号元素插入成功 30号元素插入成功 31号元素插入成功 32号元素插入成功 33号元素插入成功 34号元素插入成功 35号元素插入成功 36号元素插入成功 37号元素插入成功 38号元素插入成功 39号元素插入成功 40号元素插入成功 41号元素插入成功 42号元素插入成功 43号元素插入成功 44号元素插入成功 45号元素插入成功 46号元素插入成功 47号元素插入成功 48号元素插入成功 49号元素插入成功 50号元素插入成功 51号元素插入成功 52号元素插入成功 53号元素插入成功 54号元素插入成功 55号元素插入成功 56号元素插入成功 57号元素插入成功 58号元素插入成功 59号元素插入成功 60号元素插入成功 61号元素插入成功 62号元素插入成功 63号元素插入成功 64号元素插入成功 65号元素插入成功 66号元素插入成功 67号元素插入成功 68号元素插入成功 69号元素插入成功 70号元素插入成功 71号元素插入成功 72号元素插入成功 73号元素插入成功 74号元素插入成功 75号元素插入成功 76号元素插入成功 77号元素插入成功 78号元素插入成功 79号元素插入成功 80号元素插入成功 81号元素插入成功 82号元素插入成功 83号元素插入成功 84号元素插入成功 85号元素插入成功 86号元素插入成功 87号元素插入成功 88号元素插入成功 89号元素插入成功 90号元素插入成功 91号元素插入成功 92号元素插入成功 93号元素插入成功 94号元素插入成功 95号元素插入成功 96号元素插入成功 97号元素插入成功 98号元素插入成功 99号元素插入成功
不是空表
99
删除成功
5700
10
100 200 300 400 500 600 700 800 900 1000 1100 1200 1300 1400 1500 1600 1700 1800 1900 2000 2100 2200 2300 2400 2500 2600 2700 2800 2900 3000 3100 3200 3300 3400 3500 3600 3700 3800 3900 4000 4100 4200 4300 4400 4500 4600 4700 4800 4900 5000 5100 5200 5300 5400 5500 5700 5800 5900 6000 6100 6200 6300 6400 6500 6600 6700 6800 6900 7000 7100 7200 7300 7400 7500 7600 7700 7800 7900 8000 8100 8200 8300 8400 8500 8600 8700 8800 8900 9000 9100 9200 9300 9400 9500 9600 9700 9800 9900
销毁成功
进程完成,退出码 0
6、C++实现方式:
6.1、顺序表类的抽象
#ifndef XGP_STUDY_DEMO40_MYLIST_H
#define XGP_STUDY_DEMO40_MYLIST_H
#include <iostream>
using namespace std;
template <class T>
class MyList {
private:
T* arr; //存放数据的地址
int size; //当前又多少元素
int maxSize; //当前动态数组的最大长度
public:
//1. initList(&L):初始化表。构造一个空的线性表。放回值应该是一个线性表
MyList<T> initList();
//2. destroyList(&L):销毁操作。销毁线性表,并释放线性表L所占的内存空间。放回值为void
bool destroyList();
//3. locateElem(L,e):按值查找操作。在表中L查找具有给定关键值的元素。放回一个int类型
int locateElem(T value);
//5. listInsert(&L,i,e):插入操作。在表L中的第i个位置上插入指定的元素e。
bool listInsert(int pos,T value);
//4. getElem(L,i):按位查找。获取表中第i个位置的元素的值。
T getElem(int pos);
//6. listDelete(&L,i,e):删除操作。删除表L中第i个位置的元素。
bool listDelete(int pos);
//7. PrintList(L):输出操作。按前后顺序输出线性表L的所有元素值。
void PrintList();
//8. empty(L):判空操作。若L为空表,则放回true,否则放回false。
bool isEmpty();
//9. length(L):求表长。放回线性表L的长度,即L中数据元素的个数。
int getLength();
};
#endif //XGP_STUDY_DEMO40_MYLIST_H
6.2、顺序表类的实现
#include "MyList.h"
template<class T>
MyList<T> MyList<T>::initList() {
arr = new T[20];
size = 0;
maxSize = 20;
return *this;
}
template<class T>
bool MyList<T>::destroyList() {
if(arr == NULL || this == NULL)
return false;
delete arr;
arr = NULL;
delete this;
size = 0;
maxSize = 0;
return true;
}
template<class T>
int MyList<T>::locateElem(T value) {
if(arr == NULL) return 0;
for (int i = 0; i < size; i++) {
if(arr[i] == value) return i + 1;
}
return 0;
}
template<class T>
bool MyList<T>::listInsert(int pos, T value) {
if(arr == NULL) return false;
if(pos < 1 || pos > size + 1) return false;
//看容量是否大
if(size >= maxSize) {
T* newArr = new T[maxSize * 2];
for(int i = 0;i < size;i++) {
newArr[i] = arr[i];
}
delete arr;
arr = newArr;
maxSize = maxSize * 2;
}
//插入
for(int i = size;size >= pos;i--) {
arr[i] = arr[i - 1];
}
arr[pos - 1] = value;
size++;
return true;
}
template<class T>
T MyList<T>::getElem(int pos) {
if(arr == NULL) return false;
if(pos < 1 || pos > size ) return false;
return arr[pos - 1];
}
template<class T>
bool MyList<T>::listDelete(int pos) {
if(arr == NULL) return false;
if(pos < 1 || pos > size ) return false;
for(int i = pos -1;i < size - 1;i++) {
arr[i] = arr[i + 1];
}
size--;
return true;
}
template<class T>
void MyList<T>::PrintList() {
for(int i = 0;i < size;i++) {
cout<<arr[i]<<" ";
}
cout<<endl;
}
template<class T>
bool MyList<T>::isEmpty() {
return arr == NULL;
}
template<class T>
int MyList<T>::getLength() {
return size;
}
6.3、测试顺序表
#include "MyList.cpp"
int main() {
//1、测试初始化操作
MyList<int> list;
list.initList();
//2、测试插入操作
for(int i = 1;i < 100;i++) {
if(list.listInsert(i,i*100)) cout<<i<<"号元素等到了插入成功 ";
}
cout<<endl;
//3、测试判空操作
if(list.isEmpty()) cout<<"空表"<<endl;
else cout<<"不是空表"<<endl;
//4、测试求表长操作
cout<<list.getLength()<<endl;
//5、测试按位删除操作
if(list.listDelete(56)) cout<<"删除成功"<<endl;
//6、测试按位查找的操作
cout<<list.getElem(56)<<endl;
//7、测试按值查找的操作
cout<<list.locateElem(1000)<<endl;
//8、测试输出操作
list.PrintList();
//9、测试销毁操作
if(list.destroyList()) cout<<"销毁成功"<<endl;
return 0;
}
6.4、输出结果
1号元素等到了插入成功 2号元素等到了插入成功 3号元素等到了插入成功 4号元素等到了插入成功 5号元素等到了插入成功 6号元素等
到了插入成功 7号元素等到了插入成功 8号元素等到了插入成功 9号元素等到了插入成功 10号元素等到了插入成功 11号元素等到了插入
成功 12号元素等到了插入成功 13号元素等到了插入成功 14号元素等到了插入成功 15号元素等到了插入成功 16号元素等到了插入成功
17号元素等到了插入成功 18号元素等到了插入成功 19号元素等到了插入成功 20号元素等到了插入成功 21号元素等到了插入成功 22号
元素等到了插入成功 23号元素等到了插入成功 24号元素等到了插入成功 25号元素等到了插入成功 26号元素等到了插入成功 27号元素
等到了插入成功 28号元素等到了插入成功 29号元素等到了插入成功 30号元素等到了插入成功 31号元素等到了插入成功 32号元素等到
了插入成功 33号元素等到了插入成功 34号元素等到了插入成功 35号元素等到了插入成功 36号元素等到了插入成功 37号元素等到了插
入成功 38号元素等到了插入成功 39号元素等到了插入成功 40号元素等到了插入成功 41号元素等到了插入成功 42号元素等到了插入成
功 43号元素等到了插入成功 44号元素等到了插入成功 45号元素等到了插入成功 46号元素等到了插入成功 47号元素等到了插入成功 48
号元素等到了插入成功 49号元素等到了插入成功 50号元素等到了插入成功 51号元素等到了插入成功 52号元素等到了插入成功 53号元
素等到了插入成功 54号元素等到了插入成功 55号元素等到了插入成功 56号元素等到了插入成功 57号元素等到了插入成功 58号元素等
到了插入成功 59号元素等到了插入成功 60号元素等到了插入成功 61号元素等到了插入成功 62号元素等到了插入成功 63号元素等到了
插入成功 64号元素等到了插入成功 65号元素等到了插入成功 66号元素等到了插入成功 67号元素等到了插入成功 68号元素等到了插入
成功 69号元素等到了插入成功 70号元素等到了插入成功 71号元素等到了插入成功 72号元素等到了插入成功 73号元素等到了插入成功
74号元素等到了插入成功 75号元素等到了插入成功 76号元素等到了插入成功 77号元素等到了插入成功 78号元素等到了插入成功 79号
元素等到了插入成功 80号元素等到了插入成功 81号元素等到了插入成功 82号元素等到了插入成功 83号元素等到了插入成功 84号元素
等到了插入成功 85号元素等到了插入成功 86号元素等到了插入成功 87号元素等到了插入成功 88号元素等到了插入成功 89号元素等到
了插入成功 90号元素等到了插入成功 91号元素等到了插入成功 92号元素等到了插入成功 93号元素等到了插入成功 94号元素等到了插
入成功 95号元素等到了插入成功 96号元素等到了插入成功 97号元素等到了插入成功 98号元素等到了插入成功 99号元素等到了插入成
功
不是空表
99
删除成功
5700
10
100 200 300 400 500 600 700 800 900 1000 1100 1200 1300 1400 1500 1600 1700 1800 1900 2000 2100 2200 2300 2400 2500 2600
2700 2800 2900 3000 3100 3200 3300 3400 3500 3600 3700 3800 3900 4000 4100 4200 4300 4400 4500 4600 4700 4800 4900 5000
5100 5200 5300 5400 5500 5700 5800 5900 6000 6100 6200 6300 6400 6500 6600 6700 6800 6900 7000 7100 7200 7300 7400 7500
7600 7700 7800 7900 8000 8100 8200 8300 8400 8500 8600 8700 8800 8900 9000 9100 9200 9300 9400 9500 9600 9700 9800 9900
销毁成功
Process finished with exit code 0
五种编程语言解释数据结构与算法——顺序表2(java与C++语言实现)的更多相关文章
- 五种编程语言解释数据结构与算法——顺序表1(理论与C语言实现)
1.线性表的分类 2.线性表的定义及其基本操作 2.1.定义:线性表是具有相同类型的n(n>=0)个元素的有序序列,其中n为表长,当n=0时,该表为空表. 2.3.线性表的逻辑结构为: 2.4. ...
- 五种编程语言解释数据结构与算法——顺序表3(JavaScript与Python语言实现)
7.JavaScript语言实现 7.1.用ES6语法编写顺序表类 //1.创建类 class MyList { //1. initList(&L):初始化表.构造一个空的线性表.放回值应该是 ...
- 【数据结构】之顺序表(Java语言描述)
之前总结过使用C语言描述的顺序表数据结构.在C语言类库中没有为我们提供顺序表的数据结构,因此我们需要自己手写,详细的有关顺序表的数据结构描述和C语言代码请见[我的这篇文章]. 在Java语言的JDK中 ...
- C++数据结构学习之顺序表
顺序表是数据结构中最基本也是应用相当广泛的一种数据结构类型.它通常包含三个私有成分,即指向数据数组的头指针.当前表长以及表的实际容量.表的头指针通常指向数据数组的基地址,通过数组的形式进行访问数据数组 ...
- 数据结构 单链表&顺序表
顺序表: 一般使用数组(C语言中的数组采用顺序存储方式.即连续地址存储)来描述. 优点:在于随机访问元素, 缺点:插入和和删除的时候,需要移动大量的元素. 链表: 优点:插入或删除元素时很方便,使用灵 ...
- 【数据结构】之顺序表(C语言描述)
顺序表是线性表的一种,它将元素存储在一段连续的内存空间中,表中的任意元素都可以通过下标快速的获取到,因此,顺序表适合查询操作频繁的场景,而不适合增删操作频繁的场景. 下面是使用 C语言 编写的顺序表的 ...
- 数据结构之动态顺序表(C实现)
线性表有2种,分为顺序表和链表. 顺序表: 采用顺序存储方式,在一组地址连续的存储空间上存储数据元素的线性表(长度固定) 链表: 有3种,单链表.双向链表.循环链表(长度不固定) seqList.h ...
- 数据结构:DHU顺序表ADT模板设计及简单应用:找匹配
顺序表ADT模板设计及简单应用:找匹配 时间限制: 1S类别: DS:线性表->线性表应用 问题描述: 输入范例: 100000100000 99999 99998 99997 99996 99 ...
- C++ 数据结构学习一(顺序表)
//SequentialList.h 顺序表模板类 #ifndef SEQUENTIAL_LIST_HXX#define SEQUENTIAL_LIST_HXX using std::cout; us ...
随机推荐
- 基于django的会议室预订系统
会议室预订系统 一.目标及业务流程 期望效果: 业务流程: 用户注册 用户登录 预订会议室 退订会议室 选择日期:今日以及以后日期 二.表结构设计和生成 1.models.py(用户继承Abstrac ...
- PTA 练习 7-24 喊山 (30 分)
7-24 喊山 (30 分) 喊山,是人双手围在嘴边成喇叭状,对着远方高山发出"喂-喂喂-喂喂喂--"的呼唤.呼唤声通过空气的传递,回荡于深谷之间,传送到人们耳中,发出约定俗成的& ...
- 什么是ip地址、子网掩码、网关和DNS?
什么是ip地址? IP是32位二进制数据,通常以十进制表示,并以“.”分隔.IP地址是一种逻辑地地址,用来标识网络中一个个主机,IP有唯一性,即每台机器的IP在全世界是唯一的. IP地址=网络地址+主 ...
- parzen 窗的matlab实现
用一下程序简单实现使用parzen窗对正态分布的概率密度估计: (其中核函数选用高斯核) %run for parzen close all;clear all;clc; x=normrnd(0,1, ...
- 【WPF学习】第三十五章 资源字典
如果希望在多个项目之间共享资源,可创建资源字典.资源字典只是XAML文档,除了存储希望使用的资源外,不做其他任何事情. 一.创建资源字典 下面是一个资源字典示例,它包含一个资源: <Resour ...
- 场景7:带有Linux网桥的提供商网络
此场景描述了使用带有Linux网桥的ML2插件的OpenStack网络服务的供应商网络实现. 供应商网络通常以灵活性为代价提供简单性.性能和可靠性.与其他场景不同,只有管理员可以管理提供者网络,因为它 ...
- 如何运行使用gradle打包的项目
目标:https://github.com/davenkin/springmvc4-helloworld 使用SpringMVC编写的一个HelloWorld程序. 初学Gradle只能一步步摸索前进 ...
- FFMPEG学习----解码视频
基础概念 我们平时看到的视频文件有许多格式,比如 avi, mkv, rmvb, mov, mp4等等,这些被称为容器(Container), 不同的容器格式规定了其中音视频数据的组织方式(也包括其他 ...
- 快速了解Lambda表达式-Java
目录 lambda表达式 前言 简介 简单入门 用法 好处 总结 lambda表达式 前言 最近因为疫情,也不能正常返校什么的,希望大家都能好好的,希望武汉加油,中国加油,在家也看了很多视频,学了一点 ...
- 你知道EasyX吗
关于C++控制台上的图形界面,你知道一个东西叫做EasyX吗? 作为一个退役的OI选手(WTF?\(3^2-3^1\)年级退役?),在退役之后总想找点事情做. 开发个游戏?(我只会控制台) 学下人工智 ...