Go语言编写Linktable库

weixin_62520846 2022-07-10 15:21:45

创建linktable文件夹,在文件夹内创建linktable.go,代码如下:

package linktable

type LinkTable[T comparable] struct {
	head  *node[T]
	tail  *node[T]
	count int
}

type node[T comparable] struct {
	data T
	prev *node[T]
	next *node[T]
}

func New[T comparable]() *LinkTable[T] {
	return &LinkTable[T]{nil, nil, 0}
}

func (t *LinkTable[T]) Append(data T) {
	if t.head == nil {
		t.head = &node[T]{data, nil, nil}
		t.tail = t.head
	} else {
		t.tail.next = &node[T]{data, t.tail, nil}
		t.tail = t.tail.next
	}
	t.count++
}

func (t *LinkTable[T]) RemoveTail() T {
	if t.count == 0 {
		panic("list empty")
	}
	removed := t.tail
	t.tail = removed.prev
	if removed.prev != nil {
		removed.prev.next = nil
	} else {
		t.head = nil
	}
	t.count--
	return removed.data
}

func (t *LinkTable[T]) Prepend(data T) {
	newHead := &node[T]{data, nil, t.head}
	if t.head != nil {
		t.head.prev = newHead
		t.head = newHead
	} else {
		t.head = newHead
		t.tail = newHead
	}
	t.count++
}

func (t *LinkTable[T]) Len() int {
	return t.count
}

func (t *LinkTable[T]) RemoveHead() T {
	if t.count == 0 {
		panic("list empty")
	}
	removed := t.head
	t.head = removed.next
	if removed.next != nil {
		removed.next.prev = nil
	} else {
		t.head = nil
	}
	t.count--
	return removed.data
}

func (t *LinkTable[T]) ToSlice() []T {
	var result []T
	cur := t.head
	for {
		if cur == nil {
			break
		}
		result = append(result, cur.data)
		cur = cur.next
	}
	return result
}

func (t *LinkTable[T]) Find(data T) int {
	i := 0
	cur := t.head
	for {
		if cur == nil {
			break
		}
		if cur.data == data {
			return i
		}
		cur = cur.next
		i++
	}
	return -1
}

上述代码使用了Go新推出的泛型功能,实现了一个通用的双向链表。 具有在头部或尾部插入/删除数据的功能,还可以将链表内容转化为Go语言内置的slice。

设计程序库时,应该避免过多暴露内部实现细节,如此处的node结构体就是非公开的,head、tail指针也不对用户可见。

此外还应当对用户输入做好校验,如RemoveHead、RemoveTail方法就需要判断链表是否为空。

代码库:https://gitee.com/hamletive/linktable

作者:SA*****442

...全文
183 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
内容概要:本文系统研究了虚拟同步发电机(VSG)的惯量-阻尼协同自适应并网控制策略及其稳定性分析,聚焦于提升高比例可再生能源接入背景下电网的频率稳定性。通过Simulink仿真平台与Matlab代码实现,构建了VSG并网系统的动态模型,深入探讨了惯量与阻尼参数的自适应调节机制,以优化系统对频率波动的响应能力。研究涵盖了双机并联VSG的功率精确分配、微电网黑启动过程、虚拟阻抗的引入以及预同步控制等关键技术,并结合根轨迹分析与调节系数对比,验证了所提控制策略在提升系统稳定性和动态性能方面的有效性。文章强调了协同自适应控制在现代电力系统中的关键作用,为微电网和分布式能源系统的稳定运行提供了理论支持和技术方案。; 适合人群:具备电力系统、自动控制或新能源并网等相关专业知识背景,熟悉Matlab/Simulink仿真工具,从事电力电子、微电网控制、可再生能源并网等领域科研或工程应用的研发人员及研究生。; 使用场景及目标:①掌握VSG在微电网及并网系统中的高精度建模与仿真方法;②深入理解惯量-阻尼协同自适应控制对电网频率稳定的优化机制;③应用于微电网黑启动、功率均分控制、虚拟阻抗设计及预同步等实际工程场景的算法开发与性能验证; 阅读建议:建议结合提供的Matlab代码与Simulink模型进行同步仿真操作,重点关注参数自适应调节模块的设计逻辑、根轨迹稳定性分析及不同调节系数下的动态响应对比,以深化对控制策略内在机理的理解与实际应用能力。

571

社区成员

发帖
与我相关
我的任务
社区描述
软件工程教学新范式,强化专项技能训练+基于项目的学习PBL。Git仓库:https://gitee.com/mengning997/se
软件工程 高校
社区管理员
  • 码农孟宁
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧