使用Go编写LinkTable库

小竹本 2022-04-07 10:20:26

1.数据类型定义

type LinkTableNode struct { //链表结点定义
	data int
	next *LinkTableNode
}

type LinkTable struct { //链表定义
	length int
	head   *LinkTableNode
}

2.创建链表

初始化链表:

func Init() *LinkTable { //初始化链表
	var list *LinkTable = new(LinkTable)
	list.head = nil
	list.length = 0
	return list
}

头插法插入结点:

func AddHead(linkTable *LinkTable, data int) { //头插法插入结点
	var node = new(LinkTableNode)
	node.data = data
	var p = linkTable.head
	if p == nil {
		linkTable.head = node
	} else {
		node.next = p
		linkTable.head = node
	}
	linkTable.length++
}

3.删除操作

删除整个链表:

func Delete(linkTable *LinkTable) { //删除链表
	linkTable.length = 0
	linkTable.head = nil
}

删除值为data的结点:

func DeleteNode(linkTable *LinkTable, data int) *LinkTableNode { //删除第一个值为data的结点并返回
	if linkTable.length == 0 {
		return nil
	}
	if linkTable.length == 1 {
		if linkTable.head.data == data {
			Delete(linkTable)
			return linkTable.head
		} else {
			return nil
		}
	}
	var p = linkTable.head.next
	var t = linkTable.head
	for i := 0; i < linkTable.length-1; i++ {
		if p.data == data {
			t.next = p.next
			p.next = nil
			linkTable.length--
			return p
		}
		t = p
		p = p.next
	}
	return nil
}

4.查找操作

查找值为data的结点:

func Search(linkTable *LinkTable, data int) *LinkTableNode { //查找值为data的结点并返回
	var p = linkTable.head
	for i := 0; i < linkTable.length; i++ {
		if p.data == data {
			return p
		}
		p = p.next
	}
	return nil
}

5.插入操作

在值为data的结点后插入:

func InsertPost(linkTable *LinkTable, data1 int, data2 int) { //在值为data1的结点后面插入值为data2的结点
	var p = linkTable.head
	var node = new(LinkTableNode)
	node.data = data2
	for i := 0; i < linkTable.length; i++ {
		if p.data == data1 {
			node.next = p.next
			p.next = node
			linkTable.length++
			return
		}
		p = p.next
	}
}

在值为data的结点前插入:

func InsertPre(linkTable *LinkTable, data1 int, data2 int) bool { //在值为data1的结点前面插入值为data2的结点
	var node = new(LinkTableNode)
	node.data = data2
	if linkTable.length == 1 {
		if linkTable.head.data == data1 {
			node.next = linkTable.head
			linkTable.head = node
			linkTable.length++
			return true
		} else {
			return false
		}
	}
	var p = linkTable.head.next
	var t = linkTable.head
	for i := 0; i < linkTable.length-1; i++ {
		if p.data == data1 {
			t.next = node
			node.next = p
			linkTable.length++
			return true
		}
		t = p
		p = p.next
	}
	return false
}

6.心得体会

对于链表的操作,因为定义的是不带头结点的链表,即第一个结点即为头结点,所以在针对链表进行操作的时候,在头结点处的操作与在其他结点处的操作不一致,需要分情况讨论,比较麻烦;由于只保存了头结点指针,因此创建链表时也不适合用尾插法进行创建。

7.代码地址

作者:291

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

571

社区成员

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

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