注意点:注意下标的位置,size的大小从0和-1开始判断条件有略微的差异
学习到的: elementData= Arrays.copyOf(elementData,capacity);//复制一个数组
System.arraycopy(elementData,index,elementData,index+1,size-index);
在算法中可能经常需要用到,这种也可以自己写
线性表的基本操作:
实现代码:
1 c语言实现
#include<stdlib.h>
#include<stdio.h>
//定义数组的大小为100
#define MAX_SIZE 100
//定义线性表的数据类型为int
typedef int elementType;
typedef struct LNode *List;
struct LNode{
elementType data[MAX_SIZE];
int Last;
};
//创建一个空表
List makeEmpty();
//插入数据 1=<i<=n
void insert(List list,int i,elementType x);
//查找元素
int find(List list,elementType x);
//删除元素 1<=i<=n
void deleteL(List list,int i);
int main(){
//创建一个空表
List p;
p= makeEmpty();
int i;
for(i=0;i<10;i++)
insert(p,i+1,i+1);
for(i=0;i<10;i++){
int x=find(p,i+1);
printf("%d\n",x);
}
deleteL(p,1);
printf("%d\n",p->Last);
return 0; }
List makeEmpty(){
List head;
//申请地址
head = (List)malloc(sizeof(struct LNode));
head->Last=-1;
printf("创建空表成功");
return head;
} //插入数据
void insert(List list,int i,elementType x){
//判断表满的情况
if(list->Last==MAX_SIZE-1){
printf("%d\n",i);
return;
}
//判断插入的位置
if(i<1||i>(list->Last+2))
{ printf("插入的位置不合法");
return;
}
int j;
//把i-1的位置空开
for(j=list->Last;j>=i-1;j--)
list->data[j+1]=list->data[j];
//把数据插入i-1的位置
list->data[i-1]=x;
//把数量加1
list->Last++;
printf("插入成功\n");
return;
}
//查找某个元素,返回坐标
int find(List list,elementType x){
int j=0;
while(list->data[j]!=x&&list->Last>j){
j++;
}
if(j<=list->Last)
return j;
else
return -1;
}
//删除元素
void deleteL(List list,int i){
if(i<1||i>list->Last+1)
{
printf("删除位置有误\n");
return;
}
int j;
//当时我对这个地方为啥是j<=有点疑惑,不这么写,那么最后一个值就没有被覆盖掉
//个人认为可以写为j< 因为Last是减少的
for(j=i-1;j<=list->Last;j++){
list->data[j]=list->data[j+1];
}
list->Last--;
printf("删除成功\n");
}
java代码实现:
package com.datastruct;
import java.util.Arrays;
public class SequenceList<T> {
//默认情况下创建的数组长度为2
private int DEFAULT_SIZE=2;
//用来保持插入的数据元素
private Object[] elementData;
//表示数组的大小,可以改变
private int capacity;
//用来记录插入元素的数量
private int size=0;
//默认创建一个空的线性表
public SequenceList(){
System.out.println("this is no parameter");
capacity =DEFAULT_SIZE;
elementData=new Object[capacity];
}
//带元素的构造方法
public SequenceList(T element){
//代表实现五参构造方法
this();
//赋值
elementData[0]=element;
//线性表的长度加1
size++;
}
//带元素带给定大小的构造方法
public SequenceList(T element,int initSize){
capacity = 1;
if(capacity<initSize)
capacity=initSize+capacity;
elementData = new Object[capacity];
elementData[0]=element;
size++;
}
//获取线性表的长度
public int length(){
return size;
}
//向线性表中插入数据,插在数组的最后面
public void add(T element)throws Exception{
insert(element,size);
}
//向线性表中指定的位置插入元素
public void insert(T element,int index)throws Exception{
if(index<0 || index>size)
throw new IndexOutOfBoundsException("插入的索引位置越界");
//确保当前线性表能再存进一个数,如果不能encureCapacity会创建一个加长的数组
encureCapacity(size+1);
//把数组的位置移动下 inedex代表开始移动的位置,index+1代表开始移动的插入位置
System.arraycopy(elementData,index,elementData,index+1,size-index);
elementData[index]=element;
}
//通过索引位置查找元素
public T get(int index){
if(index<0 || index>size)
throw new IndexOutOfBoundsException("查找的索引位置出现问题");
return (T) elementData[index];
}
//删除指定位置的元素
public void delete(int index){
if(index<0||index>index-1)
throw new IndexOutOfBoundsException("删除索引位置出现错误");
}
public boolean isEmpty(){
return size==0;
}
private void encureCapacity(int tempcapacity){
if(tempcapacity>capacity) {
capacity = tempcapacity + 2;
elementData= Arrays.copyOf(elementData,capacity);
}
}
}
参考:1、http/blog.csdn.net/sihai12345/article/details/80588938
2、浙江大学的数据结构视频