注意點:注意下標的位置,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
二、浙江大學的數據結構視頻