顺序线性表的实现

注意点:注意下标的位置,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、浙江大学的数据结构视频

转载于:https://my.oschina.net/u/2511906/blog/3083844

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值