注意点:注意下标的位置,size的大小从0和-1开始判断条件有略微的差别java
学习到的: elementData= Arrays.copyOf(elementData,capacity);//复制一个数组 System.arraycopy(elementData,index,elementData,index+1,size-index); 在算法中可能常常须要用到,这种也能够本身写
线性表的基本操做:算法
实现代码:数组
1 c语言实现数据结构
#include<stdlib.h>学习
#include<stdio.h>this
//定义数组的大小为100.net
#define MAX_SIZE 100code
//定义线性表的数据类型为int视频
typedef int elementType;blog
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); } }
}
参考:一、http/blog.csdn.net/sihai12345/article/details/80588938
二、浙江大学的数据结构视频