数据结构-线性表

  线性表是一种常用的数据结构,通常用来存储数据,存储方式是线性的。常见的线性表有顺序表,

链表等。顺序表是基于数组实现的,链表是通过一个个节点链接而成。线性表具有随机访问的机制,可以

在任意位置插入和删除数据元素。

  C语言实现:

    #define MaxSize 10

    typedef struct{

      char list[MaxSize];

      int capacity; 

    }SequenceList;//ADT定义,字符数组大小10

    void ListInitalize(SequenceList *L){

      L->capacity= 0;//初始化数据元素个数为0

    }

    int Length(SequenceList L){//返回顺序表长度L

      return L.capacity;

    }

    boolean ListInsert(SequenceList *L,int i,char target){//将target插入顺序表L的第i个位置

      if(L->capacity >= MaxSize){

        return false;//表长大于最大容量,无法插入

      else if(i < 0 || i > L->capacity){

        return false;//下标越界

      }else{

        int j ;

        for(j = L->capacity; j > i;j--){//j为表长,从后插入

          L->list[j] = L -> list[j-1];

          L->list[i] = target;//插入

          L -> capacity++;

          return true;

        }

      }

    }

    boolean Delete(SequenceList *L, int i ,char *target){//删除操作

      if(L->capacity < = 0){

        return false;//表已空;

      }else if(i < 0 || i > L->capacity-1){

        return false;//下标越界

      }else{

        *target = L->list[i];

        for(j = i+1; j <= L->capacity-1;j++){

           L->list[j-1] = L->list[j];//往前覆盖

        }

        L->capacity--;//表长减一

        return true;

      }

    }

  在java中顺序表ArrayList是基于数组实现的,继承于AbstractList,实现了List接口,RandomAccess接口,

ArrayList是线程不安全的,由于ArrayList没有实现synchronized锁,当有多个线程对其操作时将会产生错误。

但Collections集合实现了synchronized,使得我们初始化List可以保证线程安全,

   List list = Collections.synchronizedList(new ArrayList(...));

This is best done at creation time, to prevent accidental unsynchronized access to the list:

ArrayList初始化数组的容量是10,当数组超过最大容量时,会生成一个1.5容量的新数组来代替旧的数组。

  而LinkedList是基于链表实现的,实现List,Deque,等接口,因而LinkedList也有双端队列提供的方法,

LinkedList同样是线程不安全的,可以通过

  List list = Collections.synchronizedList(new LinkedList(...));

使得我们初始化List可以保证线程安全。

  比较:顺序表是基于数组实现的,在计算机内存中是占一段连续的内存,而链表是通过一个一个的节点链接起来的,

在计算机内存是离散的。顺序表的查找效率是O(1),我们可以通过下标来定位我们需要查找的元素,链表的查找效率是

O(n),因为链表的存储是离散的。而顺序表插入删除操作效率是O(n),因为我们需要移动插入或删除的一部分元素,而链表

插入删除是O(1),这与其存储特点有关。在需要频繁插入操作时,选择链表更为有效。

转载于:https://www.cnblogs.com/binhuang01/p/11517111.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值