2、线性表的实现:链式存储、单链表

  1 package ren.laughing.datastructure.baseImpl;
  2
  3 import ren.laughing.datastructure.base.List;
  4 import ren.laughing.datastructure.base.Strategy;
  5 import ren.laughing.datastructure.exception.OutOfBoundaryException;
  6 /**
  7  * 线性表的实现:链式存储结构:单链表
  8  * @author Laughing_Lz
  9  * @time 2016年4月5日
 10  */
 11 public class SLinkList implements List{
 12     private Strategy strategy;//数据元素比较策略
 13     private SLNode head;//单链表首结点引用
 14     private int size;//数据元素个数
 15
 16
 17     public SLinkList() {
 18         this(new DefaultStrategy());
 19     }
 20
 21     public SLinkList(Strategy strategy) {
 22         this.strategy = strategy;
 23         head = new SLNode();
 24         size = 0;
 25     }
 26     //辅助方法:获取数据元素为e的前驱结点
 27     public SLNode getPreNode(Object obj){
 28         int index = indexOf(obj);
 29         if(index >=0){
 30             SLNode p = getPreNode(index);
 31             return p;
 32         }else{
 33             return null;
 34         }
 35     }
 36     //辅助方法:获取序号为0<=i<size的前驱结点
 37     public SLNode getPreNode(int i){
 38         if(i>=1){
 39             SLNode p = getNode(i-1);
 40             return p;
 41         }else{
 42             return head;
 43         }
 44     }
 45     //辅助方法:获取序号为 0<=i<size 的元素所在结点
 46     public SLNode getNode(int i){
 47         SLNode p = head.getNext();//head不存储任何实质对象,仅作a0的前驱结点
 48         for(int j= 0;j<i;j++){
 49             p=p.getNext();
 50         }
 51         return p;
 52     }
 53     @Override
 54     public int getSize() {
 55         return this.size;
 56     }
 57
 58     @Override
 59     public boolean isEmpty() {
 60         if(this.size == 0){
 61             return true;
 62         }else{
 63             return false;
 64         }
 65     }
 66
 67     @Override
 68     public boolean contains(Object e) {
 69         SLNode p = head.getNext();//定义一个指针P,起始点为head结点
 70         while(p!=null){
 71             if(strategy.equal(p.getData(), e)){
 72                 return true;
 73             }else{
 74                 p=p.getNext();
 75             }
 76         }
 77         return false;
 78     }
 79
 80     @Override
 81     public int indexOf(Object e) {
 82         SLNode p = head.getNext();//定义一个指针P,起始点为a0结点
 83         int index = 0;
 84         while(p!=null){
 85             if(strategy.equal(p.getData(), e)){
 86                 return index;
 87             }else{
 88                 index++;
 89                 p=p.getNext();
 90             }
 91         }
 92         return -1;
 93     }
 94
 95     @Override
 96     public void insert(int i, Object e) throws OutOfBoundaryException {
 97         if(i<0||i>=size){
 98             throw new OutOfBoundaryException("指定插入位置的序号越界");
 99         }
100         SLNode p = getPreNode(i);//得到前驱结点
101         SLNode q = new SLNode(e, p.getNext());//定义新结点并插入
102         p.setNext(q);//与原始结点相连
103         size++;
104     }
105     //将数据元素 e 插入到元素 obj 之前
106     @Override
107     public boolean insertBefore(Object obj, Object e) {
108 //        int index = indexOf(obj);//获取obj位置
109 //        if(index>=0&&index<size){
110 //            insert(index, e);
111 //            return true;
112 //        }else{
113 //            return false;
114 //        }
115         SLNode p = getPreNode(obj);
116         if(p!=null){
117             SLNode q = new SLNode(e, p.getNext());
118             p.setNext(q);
119             size++;
120             return true;
121         }else{
122             return false;
123         }
124     }
125     //将数据元素 e 插入到元素 obj 之后
126     @Override
127     public boolean insertAfter(Object obj, Object e) {
128         SLNode p = head.getNext();
129         while(p!=null){
130             if(strategy.equal(p.getData(), obj)){
131                 SLNode q = new SLNode(e, p.getNext());
132                 p.setNext(q);
133                 size++;
134                 return true;
135             }else{
136                 p = p.getNext();
137             }
138         }
139         return false;
140     }
141
142     @Override
143     public Object remove(int i) throws OutOfBoundaryException {
144         if (i<0||i>=size){
145             throw new OutOfBoundaryException("错误,指定的删除序号越界。");
146         }
147         SLNode p = getPreNode(i);//首先找到该位置结点和前驱结点
148         SLNode q = getNode(i);
149         p.setNext(q.getNext());//将前驱结点和后继结点相连
150         size--;
151         return q.getData();//返回删除的结点数据元素
152     }
153
154     @Override
155     public boolean remove(Object e) {
156 //        int index = indexOf(e);
157 //        if(index >=0&&index<size){
158 //            remove(index);
159 //            return true;
160 //        }else{
161 //            return false;
162 //        }
163         SLNode p = getPreNode(e);
164         if(p!=null){
165             p.setNext(p.getNext().getNext());
166             size--;
167             return true;
168         }else{
169             return false;
170         }
171     }
172
173     @Override
174     public Object replace(int i, Object e) throws OutOfBoundaryException {
175         if (i<0||i>=size){
176             throw new OutOfBoundaryException("错误,指定替代位置的序号越界。");
177         }
178         SLNode p = getNode(i);
179         Object obj = p.getData();
180         p.setData(e);//只需替换该结点数据元素
181         return obj;
182     }
183
184     @Override
185     public Object get(int i) throws OutOfBoundaryException {
186         if(i<0||i>size){
187             throw new OutOfBoundaryException("指定序号越界");
188         }
189         SLNode p = getNode(i);
190         return p.getData();
191     }
192
193 }
时间: 2024-07-30 19:02:10

2、线性表的实现:链式存储、单链表的相关文章

数据结构之第二章线性表之静态链式存储

1--特点:用一维数组来描述线性表,用游标代替指针指示节点在数组中的相对位置.不设“指针”类型的高级语言中适用链表结构. 2--线性表的静态链式存储结构 ////  静态单链表.h//  单链表的静态存储//// 6 //  Copyright (c) 2014年 dashuai. All rights reserved.// #ifndef SLIST_H#define SLIST_H#include <stdio.h>#include <stdlib.h> #define MA

线性表的链式存储——单链表的实现

1,本文目标: 1,完成链式存储结构线性表的实现: 2,LinkList 设计要点: 1,类模板,通过头结点访问后继结点: 2,定义内部结点类型 Node,用于描述数据域和指针域: 3,实现线性表的关键操作(增删查等): 3,链表的定义: 4,LinkList 链表的实现: 1 #ifndef LINKLIST_H 2 #define LINKLIST_H 3 4 #include "List.h" 5 #include "Exception.h" 6 7 /* 链

线性表的链式存储-单链表

单链表操作 [x] 单链表的创建(尾插法.头插法) [x] 单链表的查找操作 [x] 单链表的删除操作 [x] 单链表的逆置操作(使用头插法) [x] 单链表表长的计算 [x] 打印单链表 单链表的创建 头插法 forward_list* creat_3() //头插法 { forward_list *head,*s; int num; head = NULL;//链表初始状态为空 while(scanf("%d",&num) && num) { s = (fo

线性表的链式存储——单链表的遍历与优化

1,如何遍历单链表中的每一个数据元素? 1,当前单链表遍历方法: 1,插入的时间复杂度为 O(n),而遍历的时间复杂度为 O(n*n): 2,遗憾的事实: 1,不能以线性的时间复杂度完成单链表的遍历: 新的需求: 1,为单链表提供新的方法,在线性时间内完成遍历: 3,设计思路(游标): 1,在单链表内部定义一个游标(Node* m_current): 2,遍历开始前将游标指向位置为 0 的数据元素: 3,获取游标指向的数据元素: 4,通过结点中的 next 指针移动游标: (5),从程序的角度来

【数据结构】链式存储单链表

数据结构之单链表的链式存储实现 //====================================================================== // // Copyright (C) 2014-2015 SCOTT // All rights reserved // // filename: List.c // description: a demo to display SeqList // // created by SCOTT at 01/28/2015

【数据结构复习】线性表的链式存储--单链表

链表的重点概念: 数据域和指针域 头指针和头结点 下面是单链表的实现源码: // // main.c // DataStructure // // Created by SuooL on 15/5/22. // Copyright (c) 2015年 SuooL. All rights reserved. // #include "stdio.h" #include "string.h" #include "ctype.h" #include &

(源代码见大话数据结构)线性表—队列的链式存储结构-&gt;出队&amp;入队&amp;建立空队列

#include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXSIZE 20 #define OVERFLOW 0 typedef int Status; typedef int QElemType; typedef struct QNode//标识符和类型名一样不知道什么用意.. { QElemType data; stru

数据结构----线性表顺序和链式结构的使用(c)

PS:在学习数据结构之前,我相信很多博友也都学习过一些语言,比如说java,c语言,c++,web等,我们之前用的一些方法大都是封装好的,就java而言,里面使用了大量的封装好的方法,一些算法也大都写好了,java还有三个特性,封装.继承.多态.当然这里不是讲Java,这里主要是说内部结构,大家都知道数据结构有些东西是分为逻辑结构和物理结构的,物理结构有分为顺序结构和链式结构,有不懂得可以百度百科,这里主要是分享线性表的顺序结构.那么什么是线性表呢,线性表是最基本.最简单.也是最常用的一种数据结

数据结构学习日记2:实现一个简单的线性表功能(链式存储方式)

数据结构学习日记,此次是用链表来实现一个线性表的功能 // ListTable1.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> using namespace std; #define ERROR 0; #define OK 1; typedef int Status; typedef int ElemType; //声明一个节点 typedef struct Node { ElemType d

c数据结构链式存储-静态链表

#include "string.h" #include "ctype.h" #include "stdio.h" #include "stdlib.h" #include "io.h" #include "math.h" #include "time.h" #define OK 1 #define ERROR 0 #define TRUE 1 #define FAL