集美阅读大全是一个以文章句子为主题的在线阅读网站。内含有各种经典好文章,爱情美文,诗歌散文,情感句子说说,范文资料等。读好文章,尽在集美阅读大全!!!
当前位置:集美阅读大全 >杂文 > 正文

数据结构与算法—线性表详解

2019-09-19 22:11数据结构 线性 算法 详解

前言


  • 通过前面数据结构与算法前导我么知道了数据结构的一些概念和重要性,那么我们今天总结下线性表相关的内容。当然,我用自己的理解解分享给大家。

  • 其实说实话,可能很多人依然分不清线性表,顺序表,和链表之间的区别和联系

    • 线性表逻辑结构, 就是对外暴露数据之间的关系,不关心底层如何实现。
    • 顺序表、链表物理结构,他是实现一个结构实际物理地址上的结构。比如顺序表就是用数组实现。而链表用指针完成主要工作。不同的结构在不同的场景有不同的区别。
  • 对于java来说,大家都知道List接口类型,这就是逻辑结构,因为他就是封装了一个线性关系的一系列方法和数据。而具体的实现其实就是跟物理结构相关的内容。比如顺序表的内容存储使用数组的,然后一个get,set,add方法都要基于数组来完成,而链表是基于指针的。当我们考虑对象中的数据关系就要考虑指针的属性。指针的指向和value。

下面用一个图来浅析线性表的关系。可能有些不太确切,但是其中可以参考,并且后面也会根据这个图举例。
数据结构与算法—线性表详解

线性表基本架构


 
package LinerList;  public interface ListInterface<T> {          void Init(int initsize);//初始化表      int length();      boolean isEmpty();//是否为空      int ElemIndex(T t);//找到编号      T getElem(int index) throws Exception;//根据index获取数据      void add(int index,T t) throws Exception;//根据index插入数据      void delete(int index) throws Exception;      void add(T t) throws Exception;//尾部插入      void set(int index,T t) throws Exception;      String toString();//转成String输出      }

 

顺序表


插入

add(int index,T t)

删除

其他操作

链表


基本结构

对于线性表,我们只需要一个data数组和length就能表示基本信息。而对于链表,我们需要一个node(head头节点),和length,当然,这个node也是一个结构体。

class node<T>{      T data;//节点的结果      node next;//下一个连接的节点      public node(){}      public node(T data)      {          this.data=data;      }      public node(T data, node next) {          this.data = data;          this.next = next;      }   }  

  

当然,这个节点有数据域指针域。数据域就是存放真实的数据,而指针域就是存放下一个node的指针。所以相比顺序表,如果用满数组情况下,链表占用更多的资源,因为它要存放指针占用资源。
数据结构与算法—线性表详解

插入

add(int index,T t)
其中index为插入的编号位置,t为插入的数据
加入插入一个节点node,根据index找到插入的前一个节点叫pre。那么操作流程为

  1. node.next=pre.next如下1的操作,将插入节点后面联系起来。此时node.next和pre.next一致。
  2. pre.next=node因为我们要插入node,而node链可以替代pre自身的next。那么直接将pre指向node。那么就相当于原始链表插入了一个node。

数据结构与算法—线性表详解
数据结构与算法—线性表详解

带头节点与不带头节点

数据结构与算法—线性表详解
很多人搞不清什么是带头节点不带头节点。带头节点就是head节点不放数据,第0项从head后面那个开始数。而不带头节点的链表head放数据,head节点就是第0位
主要区别:

插入尾

删除

数据结构与算法—线性表详解
按照index移除:delete(int index)

按照尾部移除(拓展):deleteEnd()

头部删除(带头节点):

头部删除(不带头节点)

其他

代码实现


顺序表

package LinerList;    public class seqlist<T> implements ListInterface<T> {      private Object[] date;//数组存放数据      private int lenth;      public seqlist() {//初始大小默认为10          Init(10);      }        public void Init(int initsize) {//初始化          this.date=new Object[initsize];          lenth=0;              }      public int length() {                  return this.lenth;      }        public boolean isEmpty() {//是否为空          if(this.lenth==0)              return true;          return false;      }        /*       * * @param t           * 返回相等结果,为-1为false       */      public int ElemIndex(T t) {          // TODO Auto-generated method stub          for(int i=0;i<date.length;i++)          {              if(date[i].equals(t))              {                  return i;              }          }          return -1;      }        /*       *获得第几个元素       */      public T getElem(int index) throws Exception {          // TODO Auto-generated method stub          if(index<0||index>lenth-1)              throw new Exception("数值越界");          return (T) date[index];      }            public void add(T t) throws Exception {//尾部插入           add(lenth,t);      }        /*       *根据编号插入       */      public void add(int index, T t) throws Exception {          if(index<0||index>lenth)              throw new Exception("数值越界");          if (lenth==date.length)//扩容          {              Object newdate[]= new Object[lenth*2];              for(int i=0;i<lenth;i++)              {                  newdate[i]=date[i];              }              date=newdate;          }          for(int i=lenth-1;i>=index;i--)//后面元素后移动          {              date[i+1]=date[i];          }          date[index]=t;//插入元素          lenth++;//顺序表长度+1                }        public void delete(int index) throws Exception {          if(index<0||index>lenth-1)              throw new Exception("数值越界");          for(int i=index;i<lenth;i++)//index之后元素前移动          {              date[i]=date[i+1];          }          lenth--;//长度-1          }        @Override      public void set(int index, T t) throws Exception {          if(index<0||index>lenth-1)              throw new Exception("数值越界");          date[index]=t;      }      public String  toString() {          String vaString="";          for(int i=0;i<lenth;i++)          {              vaString+=date[i].toString()+" ";          }          return vaString;                }  }

 

链表

package LinerList;    class node<T>{      T data;//节点的结果      node next;//下一个连接的节点      public node(){}      public node(T data)      {          this.data=data;      }      public node(T data, node next) {          this.data = data;          this.next = next;      }       }  public class Linkedlist<T> implements ListInterface<T>{        node head;      private int length;      public Linkedlist() {          head=new node();          length=0;      }      public void Init(int initsize) {          head.next=null;                }        public int length() {          return this.length;      }              public boolean isEmpty() {          if(length==0)return true;          else return false;      }        /*       * 获取元素编号       */      public int ElemIndex(T t) {          node team=head.next;          int index=0;          while(team.next!=null)          {              if(team.data.equals(t))              {                  return index;              }              index++;              team=team.next;          }          return -1;//如果找不到      }        @Override      public T getElem(int index) throws Exception {          node team=head.next;          if(index<0||index>length-1)          {              throw new Exception("数值越界");          }          for(int i=0;i<index;i++)          {              team=team.next;          }          return (T) team.data;      }          public void add(T t) throws Exception {          add(length,t);                }      //带头节点的插入,第一个和最后一个一样操作      public void add(int index, T value) throws Exception {          if(index<0||index>length)          {              throw new Exception("数值越界");          }          node<T> team=head;//team 找到当前位置node          for(int i=0;i<index;i++)          {               team=team.next;          }          node<T>node =new node(value);//新建一个node          node.next=team.next;//指向index前位置的下一个指针          team.next=node;//自己变成index位置              length++;      }              @Override      public void delete(int index) throws Exception {          if(index<0||index>length-1)          {              throw new Exception("数值越界");          }          node<T> team=head;//team 找到当前位置node          for(int i=0;i<index;i++)//标记team 前一个节点          {               team=team.next;          }          //team.next节点就是我们要删除的节点          team.next=team.next.next;          length--;      }        @Override      public void set(int index, T t) throws Exception {          // TODO Auto-generated method stub          if(index<0||index>length-1)          {              throw new Exception("数值越界");          }          node<T> team=head;//team 找到当前位置node          for(int i=0;i<index;i++)          {               team=team.next;          }          team.data=t;//将数值赋值,其他不变                }        public String toString() {          String va="";          node team=head.next;          while(team!=null)          {              va+=team.data+" ";              team=team.next;          }          return va;      }    }

 

测试与结果

package LinerList;  public class test {      public static void main(String[] args) throws Exception {          // TODO Auto-generated method stub          System.out.println("线性表测试:");          ListInterface<Integer>list=new seqlist<Integer>();          list.add(5);          list.add(6);          list.add(1,8);          list.add(3,996);          list.add(7);          System.out.println(list.ElemIndex(8));          System.out.println(list.toString());          list.set(2, 222);          System.out.println(list.toString());          list.delete(4);          System.out.println(list.toString());          System.out.println(list.length());                        System.out.println("链表测试:");          list=new Linkedlist<Integer>();          list.add(5);          list.add(6);          list.add(1,8);          list.add(3,996);          list.add(7);          System.out.println(list.ElemIndex(8));          System.out.println(list.toString());          list.set(2, 222);          System.out.println(list.toString());          list.delete(4);          System.out.println(list.toString());          System.out.println(list.length());          }  }

 

输出:

线性表测试:
1
5 8 6 996 7
5 8 222 996 7
5 8 222 996
4
链表测试:
1
5 8 6 996 7
5 222 6 996 7
5 222 6 996
4

总结

您可能感兴趣的文章

未经允许不得转载:杂烩网 » 数据结构与算法—线性表详解

课后答案张九龄《望月怀远》阅读答案及全诗翻译赏析

望月怀远张九龄海上生明月,天涯共此时。情人怨遥夜,竟夕起相思。灭烛怜光满,披衣觉露滋。不堪盈手赠,还寝梦佳期。注释⑴怀远:怀念远方的亲人。⑵最前面两句:辽阔无边的大海上升起一轮明月,使人想起了远在天涯……
2023-11-22 04:53暂无评论阅读详情

课后答案王安石《次韵唐公三首其三旅思》阅读答案

次韵唐公三首其三旅思王安石此身南北老,愁见问征途。地大蟠三楚,天低入五湖。看云心共远,步月影同孤。慷慨秋风起,悲歌不为鲈②。注:①张壤,字唐公,北宋嘉佑六年契丹国母生辰使,王安石友人。②《晋书&mid……
2023-11-22 04:52暂无评论阅读详情

笔记心得各级干部学习执法为民心得体会

  &ldquo;各级干部都要牢固树立全心全意为人民服务的思想和真心实意对人民负责的精神,做到心里装着群众,凡事想着群众,工作依靠群众,一切为了群众。要坚持权为民所用,情为民所系,利为民所谋,为群众诚……
2023-11-22 04:12暂无评论阅读详情

笔记心得寒假大学生社会实践心得体会

  自从走进了大学,就业问题就似乎总是围绕在我们的身边,成了说不完的话题。在现今社会,招聘会上的大字报都总写着&ldquo;有经验者优先&rdquo;,可还在校园里面的我们这班学子社会经验又会拥有多少……
2023-11-22 04:08暂无评论阅读详情

协议书济南市某美容院转让协议第2篇

&nbsp;&nbsp;__________美容院根据中华人民共和国国务院劳动法规和________市私营企业劳动管理实施办法,结合本美容院经营的具体所需今制订此劳动合同书。&nbsp;&nbsp;双……
2023-11-22 02:36暂无评论阅读详情

剧本劳模宣传短剧剧本《阿咪也想当劳模》

  1、机械厂门卫处,日,外。  清早,机械厂班长李玉伟开着别克赛欧小汽车驶进厂区,门卫室内的保安一边按开电动门,一边朝李玉伟摆手。  李玉伟:(摇下车窗,笑着打招呼)小秦,早。  保安小秦:(笑着)……
2023-11-22 02:11暂无评论阅读详情

教程灰雀说课稿

灰雀说课稿  灰雀说课稿(一):  《灰雀》说课稿  一、说教材  《灰雀》是义务教育课程标准实验教科书,小学语文第五册第二单元的一篇讲读课文。这篇课文记叙了列宁在莫斯科郊外养病期间爱护灰雀的故事。列……
2023-11-22 00:41暂无评论阅读详情

课件“吴隐之字处默,濮阳鄄城人”阅读答案及原文

吴隐之字处默,濮阳鄄城人。美姿容,善谈论,博涉文史,以儒雅标名。弱冠而介立,有清操,虽儋石无储,不取非其道。事母孝谨,及其执丧,哀毁过礼。与太常韩康伯邻居,康伯母,贤明妇人也,每闻隐之哭声,辍餐投箸,……
2023-11-22 00:38暂无评论阅读详情

标签