用Go编写一个Linktable的库

白云清水 2022-04-06 22:26:33

用Go编写一个Linktable的库

1.链表结构体的定义

linkNode中包含了节点的数据域和指针域,Link中包含了链表的长度和表头表尾节点

type LinkNode struct {
	nodeData data
	next  *LinkNode
}
 
type Link struct {
	head  *LinkNode
	tail  *LinkNode
	len int
}

2.链表接口的定义

可见有初始化链表 判断是否为空  删除链表 增加链表结点 删除链表结点   根据索引查找结点的功能

type LinkNodeInterface interface{
	initLink()
	IsEmpty(link *Link)
	DeleteLink(link *Link)
	AddNode(linkNode *LinkNode, link *Link)
	DeleteNode(linkNode *LinkNode, link *Link)
	FindNodeByIndex(index int, link *Link)
}

2.各个功能的具体实现

func initLink() *Link {
	var link *Link = new(Link)
	link.tail = nil
	link.head = nil
	link.len = 0
	return link
}

func IsEmpty(link *Link) bool {
	if link.len == 0{
		return true
	}else {
		return false
	}
}

func DeleteLink(link *Link) bool {
	if link != nil {
		for link.head!=nil {
			link.head = link.head.next
			link.len--
		}
		link.head = nil
		link.tail = nil
		return true
	}
	return false
}

func AddNode(linkNode *LinkNode, link *Link) int {
	if link == nil || linkNode == nil {
		return -1
	}
	if link.len==0 {
		link.head = linkNode
		link.tail = linkNode
		link.len++
	} else {
		link.tail.next = linkNode
		link.tail = linkNode
		link.len++
	}
	return 1
}

func DeleteNode(linkNode *LinkNode, link *Link) int {
	if link == nil || linkNode == nil {
		return -1
	}
	if linkNode == link.head {
		if link.len == 1 {
			link.head = nil
			link.tail = nil
		} else {
			link.head = link.head.next
		}
		link.len--
		return 1
	}
 
	var p *LinkNode = link.head
	for p.next != link.tail {
		if p.next == linkNode {
			p.next = p.next.next
			link.len--
			return 1
		}
		p = p.next
	}
	if p.next == linkNode {
		p.next=nil
		link.tail = p
		link.len--
		return 1
	}
	return 0
}

func FindNodeByIndex(index int, link *Link) *LinkNode {
	if link == nil || index<0 {
		return nil
	}
	var p *LinkNode = link.head
	for i := 0; i < index; i++ {
		
		p = p.next
	}
	
	return p
}

4.各个功能的测试


func main() {
	var link *Link = initLink()
	var linkNodeTest1 *LinkNode = new(LinkNode)
	linkNodeTest1.nodeData = "testLink"
	AddNode(linkNodeTest1, link)

	var linkNodeTest2 *LinkNode = new(LinkNode)
	linkNodeTest2.nodeData = 2
	AddNode(linkNodeTest2, link)

	fmt.Println("len:", link.len)
	fmt.Println("Head:", link.head.nodeData)
	fmt.Println("Tail:", link.tail.nodeData)
	DeleteNode(linkNodeTest2, link)
	fmt.Println("len:", link.len)
	var linkNodeTest3 *LinkNode = FindNodeByIndex(0, link)
	fmt.Println("linkNodeTest3 data:", linkNodeTest3.nodeData)
	DeleteLink(link)
	fmt.Println("len:", link.len)
}

 5.gitee地址

奥列格/GoMenu - Gitee.com

作者:329

...全文
69 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

567

社区成员

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

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