第三章 Caché 算法与数据结构 链表原理

文章目录

  • 第三章 Caché 算法与数据结构 链表原理
  • 链表
    • 单向链表
    • 双向链表
  • 完整实例
    • 节点类
    • 链表类
    • 调用
      • 添加节点
      • 删除头节点
      • 删除中间节点
      • 删除尾节点

第三章 Caché 算法与数据结构 链表原理

链表

  • 是一种在物理上非连续,非顺序的数据结构,由若干节点组成。
    在这里插入图片描述

单向链表

  • 单向链表的每一个节点又包含两部分,一部分是存放数据的变量data,另一部分是指向下一个节点的指针next

双向链表

  • 它的每一个节点除了拥有data和next指针,还拥有指向前置节点的prev指针

完整实例

节点类

Class PHA.YX.Arithmetic.LinkedList.Node Extends %RegisteredObject
{

Property data As %Integer;

Property next As Node;

Method %OnNew(data As %Integer = "") As %Status [ Private, ServerOnly = 1 ]
{
	s $this.data = data
	Quit $$$OK
}

}

链表类

Class PHA.YX.Arithmetic.LinkedList Extends %RegisteredObject
{

/* 头节点指针 */
Property head As PHA.YX.Arithmetic.LinkedList.Node [ Private ];

/* 尾节点指针 */
Property last As PHA.YX.Arithmetic.LinkedList.Node [ Private ];

/* 链表实际长度,注意这个地方如果不初始化为0,会有意想不到到的错误,足足找了一个月 */
Property size As %Integer [ InitialExpression = 0, Private ];

Method insert(index As %Integer, data As %Integer)
{
	/* 超出链表节点范围 */
	i (index < 0)||(index > ..size) d
	.throw ##class(PHA.COM.MOB.Exception).%New("超出链表节点范围!")
	
	/* 初始化节点 */
	#dim insertedNode as PHA.YX.Arithmetic.LinkedList.Node = ##class(PHA.YX.Arithmetic.LinkedList.Node).%New(data)
	#dim prevNode as PHA.YX.Arithmetic.LinkedList.Node

	/* 第一次插入 */
	i (..size = 0) d 
	.s ..head = insertedNode
	.s ..last = insertedNode
	e  i (index = 0) d		/* 插入头部  */
	.s insertedNode.next = ..head
	.s ..head = insertedNode
	e  i (..size = index)  d	/* 插入尾部,这个地方一定要注意顺序 */	
	.s ..last.next = insertedNode
	.s ..last = insertedNode
	e  d	/* 插入中间 */
	.s prevNode = ..get(index - 1)
	.s insertedNode.next = prevNode.next
	.s prevNode.next = insertedNode
	
	/* 长度加一 */
	s ..size = ..size +1
}

Method remove(index As %Integer) As PHA.YX.Arithmetic.LinkedList.Node
{
	i (index < 0)||(index > ..size) d
	.throw ##class(PHA.COM.MOB.Exception).%New("超出链表节点范围!")
	
	#dim removedNode as PHA.YX.Arithmetic.LinkedList.Node
	#dim prevNode as PHA.YX.Arithmetic.LinkedList.Node
	#dim nextNode as PHA.YX.Arithmetic.LinkedList.Node

	i (index = 0) d		/* 删除头节点 */
	.s removedNode = ..head
	.s ..head = ..head.next
	e  i (index = (..size - 1) )  d	/* 删除尾节点,表达式做加减乘除注意括号,否则有意想不到的错误 */
	.s prevNode = ..get(index - 1) 
	.s removedNode = prevNode.next
	.s prevNode.next = ""
	.s ..last = prevNode
	e  d	/* 删除中间节点 */
	.s prevNode = ..get(index - 1) 
	.s nextNode = prevNode.next.next
	.s removedNode = prevNode.next
	.s prevNode.next = nextNode
	
	/* 长度减一 */
	s ..size = ..size - 1
	
	q removedNode
}

Method get(index As %Integer) As PHA.YX.Arithmetic.LinkedList.Node
{
	i (index < 0)||(index > ..size) d
	.throw ##class(PHA.COM.MOB.Exception).%New("超出链表节点范围!")
	
	/* 查找链表位置 */
	#dim temp as PHA.YX.Arithmetic.LinkedList.Node = ..head
	f i = 0 : 1 : index - 1 d
	.s temp = temp.next
	q temp
}

Method output()
{
	#dim temp as PHA.YX.Arithmetic.LinkedList.Node = ..head
	/* 输出链表 */
	while(temp '= ""){
		w temp.data,!
		s temp = temp.next
	}
}

}

调用

添加节点

/// w ##class(PHA.YX.Arithmetic).LinkedList()
ClassMethod LinkedList()
{
	s $zt = "ErrLinkedList"
	#dim linkedList as PHA.YX.Arithmetic.LinkedList = ##class(PHA.YX.Arithmetic.LinkedList).%New()

	d linkedList.insert(0,3)
	d linkedList.insert(0,4)
	d linkedList.insert(2,9)
	d linkedList.insert(3,5)
	d linkedList.insert(1,6)

	//d linkedList.remove(1)
	d linkedList.output()
	q ""
ErrLinkedList
	q $ze
}
DHC-APP>w ##class(PHA.YX.Arithmetic).LinkedList()
4
6
3
9
5
 

删除头节点

	d linkedList.remove(0)
DHC-APP>w ##class(PHA.YX.Arithmetic).LinkedList()
6
3
9
5

删除中间节点

d linkedList.remove(3)
DHC-APP>w ##class(PHA.YX.Arithmetic).LinkedList()
4
6
3
5

删除尾节点

d linkedList.remove(4)
DHC-APP>w ##class(PHA.YX.Arithmetic).LinkedList()
4
6
3
9

你可能感兴趣的:(Caché,算法与数据结构,Caché,数据结构,算法,链表,数据库语言)