順序線性表的實現

注意點:注意下標的位置,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

二、浙江大學的數據結構視頻
相關文章
相關標籤/搜索