顺序线性表的实现

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

二、浙江大学的数据结构视频
相关文章
相关标签/搜索