狠狠撸

狠狠撸Share a Scribd company logo
第 2 章 线性表
? 2.1 线性表抽象数据类型
? 2.2 线性表的顺序表示和实现
? 2.3 线性表的链式表示和实现
? 2.4
线性表的应用:多项式的表示及运算
目的和要求
? 目的:实现线性表抽象数据类型。
? 内容:将线性表的顺序存储结构和链式存储结构
实现分别封装成顺序表类、单链表类
、循环 双链表类等,比较这两种实现的
特点以及各 种基本操作算法的效率。
? 要求:理解线性表抽象数据类型,掌握顺序和链
式 存储结构实现线性表的方法。
? 重点:顺序表、单链表、循环双链表等线性表的
设 计训练。
? 难点:使用指针实现链式存储结构,通过指针操
作 改变结点间的链接关系。
? 实验:掌握单链表的遍历、插入、删除、复制等
操 作算法,熟悉循环单链表、双链表和
循环双 链表的结构和基本操作。掌握
MyEclipse 集 成开发环境的程序调试技
《数据结构( Java 版)(第 3 版)》
2.1 线性表的抽象数据类
型
LinearList=(a0 , a1 ,…, an - 1)
public interface LList<T>
{ // 线性表接口,泛型参数 T 表示数据元素的数据类型
boolean isEmpty(); // 判断线性表是否空
int length(); // 返回线性表长度
T get(int i); // 返回第 i ( i≥0 )个元素
void set(int i, T x); // 设置第 i 个元素值为 x
void insert(int i, T x); // 插入 x 作为第 i 个元素
void append(T x); // 在线性表最后插入 x 元素
T remove(int i); // 删除第 i 个元素并返回被删除对象
void removeAll(); // 删除线性表所有元素
T search(T key); // 查找,返回首次出现的关键字为 key
元素
}
public class SeqList<T> implements LList<T> // 顺序表
类
《数据结构( Java 版)(第 3 版)》
2.2 线性表的顺序表示和
实现
1. 线性表的顺序存储结构
ciaLocaLoc i ×+= )()( 0
《数据结构( Java 版)(第 3 版)》
public class SeqList<T> implements LList<T>
{ // 顺序表类,实现线性
表接口
protected Object[] element; // 对象数组
protected int len; // 顺序表长度,记载元素个
数
}
2. 顺序表类
《数据结构( Java 版)(第 3 版)》
4. 顺序表的删除操
作
3. 顺序表的插入操
作
《数据结构( Java 版)(第 3 版)》
【例 2.1 】 使用顺序表类求解
约瑟夫环问题。
《数据结构( Java 版)(第 3 版)》
顺序表的静态特性很好,动态特性很差,具体说明如
下。
① 顺序表元素的物理存储顺序直接反映线性表元素
的逻辑顺序,顺序表是一种随机存取结
构。 get() 、 set() 方法时间复杂度是 O(1) 。
② 插入和删除操作效率很低。如果在各位置插入元
素的概率相同,则有
5. 顺序表操作的效率分析
∑∑ ==
==
+
×
+
=?
+
=×?
n
i
n
i
i nO
nnn
n
in
n
pin
00
)(
22
)1(
1
1
)(
1
1
)(
《数据结构( Java 版)(第 3 版)》
6. 顺序表的浅拷贝与深拷贝
一个类的拷贝构造方法声明格式如下:
类 ( 类 对象 )
( 1 )顺序表的浅拷贝
public SeqList(SeqList<T> list)// 浅拷贝构造方
法
{
this.element = list.element;
// 数组引用赋值,两个变量共用一个数组,
错误
《数据结构( Java 版)(第 3 版)》
执行拷贝构造方法
SeqList<String> listb = new
SeqList<String>(lista);
《数据结构( Java 版)(第 3 版)》
( 2 )顺序表的深拷贝
《数据结构( Java 版)(第 3 版)》
7. 顺序表比较相等
两个顺序表相等是指,它们各对应元素相
等并且长度相同。
《数据结构( Java 版)(第 3 版)》
2.3 线性表的链式表示和
实现
2.3.1 线性表的链式存储结构
2.3.2 单链表
2.3.3 双链表
《数据结构( Java 版)(第 3 版)》
2.3.1 线性表的链式存储
结构
《数据结构( Java 版)(第 3 版)》
1. 单链表结点类
public class Node<T> // 单链表结点类
{ public T data; // 数据域,保存数
据元素
public Node<T> next; // 地址域,引用后继
结点
}
Node<String> p,q;
p=new Node<String>("A", null );
q=new Node<String>("B", null );
2.3.2 单链表
《数据结构( Java 版)(第 3 版)》
2. 单链表的遍历操作
Node<T> p = head;
while (p!=null)
{System.out.print(p.data.toString()+" ");
// 执行访问 p 结点的相关操作
p = p.next;
}
《数据结构( Java 版)(第 3 版)》
如果语句 p=p.next 写成
p.next=p
《数据结构( Java 版)(第 3 版)》
3. 单链表的插入操作
( 1 )空表插入 / 头插入
if (head == null) // 空表插入
head = new Node<T>(x, null);
else // 头插入
{ Node<T> q = new Node<T>(x, null);
q.next = head;
head = q;
} 即 head = new Node<T>(x, head);
《数据结构( Java 版)(第 3 版)》
( 2 )中间插入 / 尾插入
Node<T> q = new Node<T>(x, null);
q.next = p.next;//q 的后继结点应是 p 的原后继结
点
p.next = q; //q 作为 p 的后继结点
即 p.next = new Node<T>(x, p.next);
《数据结构( Java 版)(第 3 版)》
如果上述后两条语句次序颠倒
,则产生错误
Node<T> q = new Node<T>(x, null);
p.next = q;
q.next = p.next;
《数据结构( Java 版)(第 3 版)》
4. 单链表的删除操作
a. 头删除
head = head.next;
b. 中间 / 尾删除
if (p.next!=null)
p.next = p.next.next;
《数据结构( Java 版)(第 3 版)》
5. 带头结点的单链表
《数据结构( Java 版)(第 3 版)》
【例 2.2 】 采用单链表求解约
瑟夫环问题。
《数据结构( Java 版)(第 3 版)》
6. 单链表操作的效率分析
1. isEmpty() 方法的时间复杂度是 O(1) 。
2. length() 方法要遍历单链表,时间复杂度
是 O(n) 。
3. get(i) 和 set(i) 方法的时间复杂度是
O(n) ,不是随机存取结构。
4. insert(i,x) 和 remove(i) 时间复杂度是
O(n) 。
《数据结构( Java 版)(第 3 版)》
1. 在 p 结点之前插入结点 q
2. 删除结点 p 要寻找其前驱结点 front
《数据结构( Java 版)(第 3 版)》
7. 提高单链表操作效率的措
施
public boolean append(T x)
{
return insert(this.length(), x);
// 需遍历单链表两次,效率较
低
}
return insert(Integer.MAX_VALUE, x);
// 遍历一次
《数据结构( Java 版)(第 3 版)》
作用于顺序表的时间复杂度是
O(n) ,但作用于单链表的时间复杂
度则是
public String toString()
{
String str="(";
if (this.length()!=0)
{ for(int i=0; i<this.length()-1; i++)
str += this.get(i).toString()+", ";
str += this.get(this.length()-1).toString();
}
return str+")";
}
)( 2
nO
《数据结构( Java 版)(第 3 版)》
例 2.3 求整数单链表的平均值
。
《数据结构( Java 版)(第 3 版)》
【例 2.4 】 单链表逆转。
《数据结构( Java 版)(第 3 版)》
8. 单链表的浅拷贝与深拷
贝
public
SinglyLinkedList(SinglyLinkedList<T>
list) // 拷贝构造函数,浅拷贝
{ this.head = list.head;
// 导致两个引用变量指向同一个结点
}
《数据结构( Java 版)(第 3 版)》
8. 单链表的深拷贝
《数据结构( Java 版)(第 3 版)》
9. 单链表比较相等
两条单链表相等是指,它们各对应元素
相等并且长度相同。
《数据结构( Java 版)(第 3 版)》
10. 排序单链表
《数据结构( Java 版)(第 3 版)》
11. 循环单链表
《数据结构( Java 版)(第 3 版)》
2.3.3 双链表
1. 双链表结构
p = p.next.pred = p.pred.next
《数据结构( Java 版)(第 3 版)》
2. 双链表的插入和删除操作
(1)插入
在 p 结点之前插入值为 x 结点
q = new DLinkNode<T>(x, p.pred,
p);
p.pred.next = q;
p.pred = q;
《数据结构( Java 版)(第 3 版)》
在 p 结点之后插入值为 x 结
点
q = new DLinkNode<T>(x, p, p.next);
// 当 p.next==null 时,尾插
入
if (p.next!=null)
p.next.pred = q; // 中间插入时执行
《数据结构( Java 版)(第 3 版)》
( 2 )双链表的删除操作
p.pred.next = p.next; // 有 p.pred!
=null
if (p.next!=null)
p.next.pred = p.pred;
《数据结构( Java 版)(第 3 版)》
3. 循环双链表
《数据结构( Java 版)(第 3 版)》
4. 排序循环双链表
《数据结构( Java 版)(第 3 版)》
2.4 线性表的应用:多项式的
表示及运算
2.4.1 一元多项式的表示及运算
2.4.2 二元多项式的表示及运算
《数据结构( Java 版)(第 3 版)》
2.4.1 一元多项式的表示及运
算
∑=
=++++=
m
i
i
i
m
mm xaxaxaxaaxA
0
2
210)( ?
∑=
=++++=
n
i
i
i
n
nn xbxbxbxbbxB
0
2
210)( ?
∑=
+=+
),max(
0
)()()(
nm
i
i
iinm xbaxBxA
《数据结构( Java 版)(第 3 版)》
1. 一元多项式的顺序存储结
构
9742
7292)( xxxxxxAn ?+?+?=
《数据结构( Java 版)(第 3 版)》
2. 一元多项式的链式存储结
构
9742
7292)( xxxxxxAn ?+?+?=
( 1 ) 一元多项式的项类
( 2 ) 多项式单链表
《数据结构( Java 版)(第 3 版)》
( 3 ) 多项式类
① 多项式类 Polynomial 声明及相加运算
《数据结构( Java 版)(第 3 版)》
【例 2.6 】 一元多项式的表示
及相加运算。
《数据结构( Java 版)(第 3 版)》
② 多项式深度拷贝及应用
《数据结构( Java 版)(第 3 版)》
③ 比较两个多项式是否相
等
public boolean equals(Object obj)
// 比较两个多项式是否相等
{
return this==obj || obj instanceof
Polynomial &&
this.list.equals(((Polynomial)obj).list)
;
《数据结构( Java 版)(第 3 版)》
2.4.2 二元多项式的表示及运
算
( 1 ) 二元多项式的项类 TermXY
( 2 ) Polynomial 可表示二元多项式
( 3 ) PolySLinkedList<T> 类的作
用
3224
9263),( yxyyxxxyxP ++?+?=
2156362),,( 43342352362310
++++?+= yzzyxzyxzyxzyxzyxzyxP
《数据结构( Java 版)(第 3 版)》
线性表接口和类的层次关
系

More Related Content

第02章 线性表(java版)

  • 1. 第 2 章 线性表 ? 2.1 线性表抽象数据类型 ? 2.2 线性表的顺序表示和实现 ? 2.3 线性表的链式表示和实现 ? 2.4 线性表的应用:多项式的表示及运算
  • 2. 目的和要求 ? 目的:实现线性表抽象数据类型。 ? 内容:将线性表的顺序存储结构和链式存储结构 实现分别封装成顺序表类、单链表类 、循环 双链表类等,比较这两种实现的 特点以及各 种基本操作算法的效率。 ? 要求:理解线性表抽象数据类型,掌握顺序和链 式 存储结构实现线性表的方法。 ? 重点:顺序表、单链表、循环双链表等线性表的 设 计训练。 ? 难点:使用指针实现链式存储结构,通过指针操 作 改变结点间的链接关系。 ? 实验:掌握单链表的遍历、插入、删除、复制等 操 作算法,熟悉循环单链表、双链表和 循环双 链表的结构和基本操作。掌握 MyEclipse 集 成开发环境的程序调试技
  • 3. 《数据结构( Java 版)(第 3 版)》 2.1 线性表的抽象数据类 型 LinearList=(a0 , a1 ,…, an - 1) public interface LList<T> { // 线性表接口,泛型参数 T 表示数据元素的数据类型 boolean isEmpty(); // 判断线性表是否空 int length(); // 返回线性表长度 T get(int i); // 返回第 i ( i≥0 )个元素 void set(int i, T x); // 设置第 i 个元素值为 x void insert(int i, T x); // 插入 x 作为第 i 个元素 void append(T x); // 在线性表最后插入 x 元素 T remove(int i); // 删除第 i 个元素并返回被删除对象 void removeAll(); // 删除线性表所有元素 T search(T key); // 查找,返回首次出现的关键字为 key 元素 } public class SeqList<T> implements LList<T> // 顺序表 类
  • 4. 《数据结构( Java 版)(第 3 版)》 2.2 线性表的顺序表示和 实现 1. 线性表的顺序存储结构 ciaLocaLoc i ×+= )()( 0
  • 5. 《数据结构( Java 版)(第 3 版)》 public class SeqList<T> implements LList<T> { // 顺序表类,实现线性 表接口 protected Object[] element; // 对象数组 protected int len; // 顺序表长度,记载元素个 数 } 2. 顺序表类
  • 6. 《数据结构( Java 版)(第 3 版)》 4. 顺序表的删除操 作 3. 顺序表的插入操 作
  • 7. 《数据结构( Java 版)(第 3 版)》 【例 2.1 】 使用顺序表类求解 约瑟夫环问题。
  • 8. 《数据结构( Java 版)(第 3 版)》 顺序表的静态特性很好,动态特性很差,具体说明如 下。 ① 顺序表元素的物理存储顺序直接反映线性表元素 的逻辑顺序,顺序表是一种随机存取结 构。 get() 、 set() 方法时间复杂度是 O(1) 。 ② 插入和删除操作效率很低。如果在各位置插入元 素的概率相同,则有 5. 顺序表操作的效率分析 ∑∑ == == + × + =? + =×? n i n i i nO nnn n in n pin 00 )( 22 )1( 1 1 )( 1 1 )(
  • 9. 《数据结构( Java 版)(第 3 版)》 6. 顺序表的浅拷贝与深拷贝 一个类的拷贝构造方法声明格式如下: 类 ( 类 对象 ) ( 1 )顺序表的浅拷贝 public SeqList(SeqList<T> list)// 浅拷贝构造方 法 { this.element = list.element; // 数组引用赋值,两个变量共用一个数组, 错误
  • 10. 《数据结构( Java 版)(第 3 版)》 执行拷贝构造方法 SeqList<String> listb = new SeqList<String>(lista);
  • 11. 《数据结构( Java 版)(第 3 版)》 ( 2 )顺序表的深拷贝
  • 12. 《数据结构( Java 版)(第 3 版)》 7. 顺序表比较相等 两个顺序表相等是指,它们各对应元素相 等并且长度相同。
  • 13. 《数据结构( Java 版)(第 3 版)》 2.3 线性表的链式表示和 实现 2.3.1 线性表的链式存储结构 2.3.2 单链表 2.3.3 双链表
  • 14. 《数据结构( Java 版)(第 3 版)》 2.3.1 线性表的链式存储 结构
  • 15. 《数据结构( Java 版)(第 3 版)》 1. 单链表结点类 public class Node<T> // 单链表结点类 { public T data; // 数据域,保存数 据元素 public Node<T> next; // 地址域,引用后继 结点 } Node<String> p,q; p=new Node<String>("A", null ); q=new Node<String>("B", null ); 2.3.2 单链表
  • 16. 《数据结构( Java 版)(第 3 版)》 2. 单链表的遍历操作 Node<T> p = head; while (p!=null) {System.out.print(p.data.toString()+" "); // 执行访问 p 结点的相关操作 p = p.next; }
  • 17. 《数据结构( Java 版)(第 3 版)》 如果语句 p=p.next 写成 p.next=p
  • 18. 《数据结构( Java 版)(第 3 版)》 3. 单链表的插入操作 ( 1 )空表插入 / 头插入 if (head == null) // 空表插入 head = new Node<T>(x, null); else // 头插入 { Node<T> q = new Node<T>(x, null); q.next = head; head = q; } 即 head = new Node<T>(x, head);
  • 19. 《数据结构( Java 版)(第 3 版)》 ( 2 )中间插入 / 尾插入 Node<T> q = new Node<T>(x, null); q.next = p.next;//q 的后继结点应是 p 的原后继结 点 p.next = q; //q 作为 p 的后继结点 即 p.next = new Node<T>(x, p.next);
  • 20. 《数据结构( Java 版)(第 3 版)》 如果上述后两条语句次序颠倒 ,则产生错误 Node<T> q = new Node<T>(x, null); p.next = q; q.next = p.next;
  • 21. 《数据结构( Java 版)(第 3 版)》 4. 单链表的删除操作 a. 头删除 head = head.next; b. 中间 / 尾删除 if (p.next!=null) p.next = p.next.next;
  • 22. 《数据结构( Java 版)(第 3 版)》 5. 带头结点的单链表
  • 23. 《数据结构( Java 版)(第 3 版)》 【例 2.2 】 采用单链表求解约 瑟夫环问题。
  • 24. 《数据结构( Java 版)(第 3 版)》 6. 单链表操作的效率分析 1. isEmpty() 方法的时间复杂度是 O(1) 。 2. length() 方法要遍历单链表,时间复杂度 是 O(n) 。 3. get(i) 和 set(i) 方法的时间复杂度是 O(n) ,不是随机存取结构。 4. insert(i,x) 和 remove(i) 时间复杂度是 O(n) 。
  • 25. 《数据结构( Java 版)(第 3 版)》 1. 在 p 结点之前插入结点 q 2. 删除结点 p 要寻找其前驱结点 front
  • 26. 《数据结构( Java 版)(第 3 版)》 7. 提高单链表操作效率的措 施 public boolean append(T x) { return insert(this.length(), x); // 需遍历单链表两次,效率较 低 } return insert(Integer.MAX_VALUE, x); // 遍历一次
  • 27. 《数据结构( Java 版)(第 3 版)》 作用于顺序表的时间复杂度是 O(n) ,但作用于单链表的时间复杂 度则是 public String toString() { String str="("; if (this.length()!=0) { for(int i=0; i<this.length()-1; i++) str += this.get(i).toString()+", "; str += this.get(this.length()-1).toString(); } return str+")"; } )( 2 nO
  • 28. 《数据结构( Java 版)(第 3 版)》 例 2.3 求整数单链表的平均值 。
  • 29. 《数据结构( Java 版)(第 3 版)》 【例 2.4 】 单链表逆转。
  • 30. 《数据结构( Java 版)(第 3 版)》 8. 单链表的浅拷贝与深拷 贝 public SinglyLinkedList(SinglyLinkedList<T> list) // 拷贝构造函数,浅拷贝 { this.head = list.head; // 导致两个引用变量指向同一个结点 }
  • 31. 《数据结构( Java 版)(第 3 版)》 8. 单链表的深拷贝
  • 32. 《数据结构( Java 版)(第 3 版)》 9. 单链表比较相等 两条单链表相等是指,它们各对应元素 相等并且长度相同。
  • 33. 《数据结构( Java 版)(第 3 版)》 10. 排序单链表
  • 34. 《数据结构( Java 版)(第 3 版)》 11. 循环单链表
  • 35. 《数据结构( Java 版)(第 3 版)》 2.3.3 双链表 1. 双链表结构 p = p.next.pred = p.pred.next
  • 36. 《数据结构( Java 版)(第 3 版)》 2. 双链表的插入和删除操作 (1)插入 在 p 结点之前插入值为 x 结点 q = new DLinkNode<T>(x, p.pred, p); p.pred.next = q; p.pred = q;
  • 37. 《数据结构( Java 版)(第 3 版)》 在 p 结点之后插入值为 x 结 点 q = new DLinkNode<T>(x, p, p.next); // 当 p.next==null 时,尾插 入 if (p.next!=null) p.next.pred = q; // 中间插入时执行
  • 38. 《数据结构( Java 版)(第 3 版)》 ( 2 )双链表的删除操作 p.pred.next = p.next; // 有 p.pred! =null if (p.next!=null) p.next.pred = p.pred;
  • 39. 《数据结构( Java 版)(第 3 版)》 3. 循环双链表
  • 40. 《数据结构( Java 版)(第 3 版)》 4. 排序循环双链表
  • 41. 《数据结构( Java 版)(第 3 版)》 2.4 线性表的应用:多项式的 表示及运算 2.4.1 一元多项式的表示及运算 2.4.2 二元多项式的表示及运算
  • 42. 《数据结构( Java 版)(第 3 版)》 2.4.1 一元多项式的表示及运 算 ∑= =++++= m i i i m mm xaxaxaxaaxA 0 2 210)( ? ∑= =++++= n i i i n nn xbxbxbxbbxB 0 2 210)( ? ∑= +=+ ),max( 0 )()()( nm i i iinm xbaxBxA
  • 43. 《数据结构( Java 版)(第 3 版)》 1. 一元多项式的顺序存储结 构 9742 7292)( xxxxxxAn ?+?+?=
  • 44. 《数据结构( Java 版)(第 3 版)》 2. 一元多项式的链式存储结 构 9742 7292)( xxxxxxAn ?+?+?= ( 1 ) 一元多项式的项类 ( 2 ) 多项式单链表
  • 45. 《数据结构( Java 版)(第 3 版)》 ( 3 ) 多项式类 ① 多项式类 Polynomial 声明及相加运算
  • 46. 《数据结构( Java 版)(第 3 版)》 【例 2.6 】 一元多项式的表示 及相加运算。
  • 47. 《数据结构( Java 版)(第 3 版)》 ② 多项式深度拷贝及应用
  • 48. 《数据结构( Java 版)(第 3 版)》 ③ 比较两个多项式是否相 等 public boolean equals(Object obj) // 比较两个多项式是否相等 { return this==obj || obj instanceof Polynomial && this.list.equals(((Polynomial)obj).list) ;
  • 49. 《数据结构( Java 版)(第 3 版)》 2.4.2 二元多项式的表示及运 算 ( 1 ) 二元多项式的项类 TermXY ( 2 ) Polynomial 可表示二元多项式 ( 3 ) PolySLinkedList<T> 类的作 用 3224 9263),( yxyyxxxyxP ++?+?= 2156362),,( 43342352362310 ++++?+= yzzyxzyxzyxzyxzyxzyxP
  • 50. 《数据结构( Java 版)(第 3 版)》 线性表接口和类的层次关 系