用go实现LinkTable库

amypj2022 2022-04-04 16:39:58

1. 设计数据结构

      go语言没有c++的类,但使用struct并配备几个方法也可以达到同样的效果

      定义了LinkTable和LinkNode结构体

type LinkNode struct {
	val  int
	next *LinkNode
}

type LinkTable struct {
	pHead *LinkNode
	pTail *LinkNode
	count int
}

2. 创建LinkTable 

    需要注意的是返回值应该是个指针类型

func CreateLinkTable() *LinkTable {
	link := &LinkTable{
		pHead: nil,
		pTail: nil,
		count: 0,
	}
	return link
}

3. 删除LinkTable

    go语言并没有c++的delete操作,而是采用Java一样的垃圾自动回收机制,所以只需要将值初始化就行

    详情见:Go垃圾回收算法

func (l *LinkTable) DeleteLinkTable() {
	l.pHead = nil
	l.pTail = nil
	l.count = 0
}

4. 插入结点

    需要注意边界条件

func (l *LinkTable) Add(v int) {
	node := LinkNode{v, nil}

	if l.count == 0 {
		l.pHead = &node
		l.pTail = &node
	} else {
		l.pTail.next = &node
		l.pTail = &node
	}
	l.count++
	fmt.Printf("Add value %d\n", v)
	return
}

5. 删除结点

    删除指定值的结点,对于头结点要特判

func (l *LinkTable) Delete(v int) {
	cur := l.pHead

	if l.count == 0 {
		return
	}

	if cur.val == v {
		if l.pHead.next != nil {
			l.pHead = l.pHead.next
		} else {
			l.pHead = nil
		}
		l.count--
		return
	}

	for cur.next != nil {
		if cur.next.val == v {
			fmt.Printf("Delete value %d\n", v)
			if cur.next.next != nil {
				cur.next = cur.next.next
			} else {
				cur.next = nil
			}
			l.count--
		}
		cur = cur.next
	}
}

6. 查找指定值的结点

func (l *LinkTable) Find(v int) *LinkNode {
	if l.count == 0 {
		return nil
	} else {
		cur := l.pHead

		for cur.next != nil {
			if cur.val == v {
				return cur
			}
			cur = cur.next
		}
		return nil
	}
}

7. 查找指定值的下一个结点

func (l *LinkTable) GetNextNode(v int) *LinkNode {
	if l.count == 0 || l.count == 1 {
		return nil
	} else {
		cur := l.pHead

		for cur.next != nil {
			if cur.val == v {
				return cur.next
			}
			cur = cur.next
		}
		return nil
	}
}

8. 对设计好的LinkTable进行测试

func main() {
	var link *LinkTable
	link = CreateLinkTable()
	link.Add(1)
	link.Add(8)
	link.Add(3)
	link.Add(4)
	link.Add(6)
	link.Add(2)
	link.Add(5)
	link.Add(7)
	link.Print()
	link.Delete(2)
	link.Print()
	node := link.Find(3)
	fmt.Println(*node)
	next := link.GetNextNode(6)
	fmt.Println(*next)
}

   首先插入:1,8,3,4,6,2,5,7

   然后删除:2 ,接着查询结点:3

   最后查找结点6的下一个结点:5

   运行结果如下:

    可以看出函数全都测试成功

    完整代码链接:https://github.com/1274012370/lab2

    作者:335

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

571

社区成员

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

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