单链表的定义和表示
特点:用一组任意的存储单元储存线性表的数据元素(这组储存单元可以是连续的,也可以是不连续的)。所以一个单链表的节点包括两个部分即两个域:其中储存数据元素的域称为数据域;储存直接后继储存位置的域称为指针域。由于此链表的每个节点中只包含一个指针域,故又称为线性链表或单链表。
首元节点
首元节点是指链表中存储的第一个数据元素a1的节点。
头节点
头节点是首元节点之前附设的一个节点,其指针域指向首元节点。头结点数据域可以不存储任何信息,也可以存储与数据元素类型相同的其他附加信息,如线性表的长度。
头指针
头指针指向链表中的第一个结点的指针。设置头结点,头指针指向头结点,不设头结点,头指针指向首元节点。
代码
package main
import "fmt"
type Elemtype int
/**
单链表存储结构
*/
type Lnode struct {
data Elemtype
next *Lnode
}
/**
单链表的初始化
*/
func InitList(l *Lnode) *Lnode {
l = &Lnode{}
l.next = nil
return l
}
/**
取值
*/
func GetELem(l *Lnode,i int) {
p := l.next
j := 1
for p != nil && j < i {
p = p.next
j++
}
if p == nil || j > i {
fmt.Println("i不合法")
return
}
e := p.data
fmt.Println(e)
}
/**
查找元素
*/
func LocateElem(l *Lnode,e Elemtype) {
p := l.next
for p != nil && p.data != e {
p = p.next
}
fmt.Println(p.data)
}
/**
插入元素
*/
func ListInsert(l *Lnode,i int,e Elemtype) {
p := l
j := 0
for p!=nil && j < (i-1) {
p = p.next
j++
}
if p == nil || j > i-1 {
fmt.Println("error")
return
}
s := &Lnode{
e ,
p.next ,
}
p.next = s
}
/**
删除
*/
func ListDelete(l *Lnode,i int) {
p := l
j := 0
for p.next!=nil && j < (i-1) {
p = p.next
j++
}
if p.next == nil || j > i-1 {
fmt.Println("error")
return
}
q := p.next
p.next = q.next
}
/**
遍历整个链表
*/
func SearchElem(l *Lnode) {
p := l
for p.next != nil {
p = p.next
fmt.Println(p.data)
}
}
func main() {
var l *Lnode
l = InitList(l)
ListInsert(l,1,1)
ListInsert(l,2,2)
ListInsert(l,3,3)
ListInsert(l,4,4)
ListDelete(l,5)
SearchElem(l)
LocateElem(l,3)
GetELem(l,2)
}