```
package main
import "fmt"
//(1) 線性表結構,使用go切片
type Liststruct {
val []interface{} // 可存放不同類型的值
length uint32 //線性表的長度
}
/* 初始化一個空線性表*/
func (L *List) InitList(vinterface{}, length uint32) {
L.length = length
if len(L.val) == 0 {
L.val = make([]interface{}, L.length)
}
for i := uint32(0);i < L.length; i +=1 {
L.val[i] = v
}
/* 銷毀線性表*/
func (L *List) DestroyList() {
L.length =0
L.val = make([]interface{}, L.length)
/* 将線性表置為空表*/
func (L *List) ClearList() {
L.DestroyList()
/* 傳回線性表的長度*/
func (L *List) ListLength() uint32 {
return uint32(L.length)
/* 傳回第i個資料元素*/
func (L *List) GetElem(e int)interface{} {
return L.val[e-1]
/* 傳回L中第1個與e滿足compare函數的資料元素的位序.若這樣的資料元素不存在,則傳回0 */
func (L *List) LocateElem(vinterface{}, ffunc(a ...interface{}) bool) uint32 {
w := uint32(0)
for i := uint32(0);i < L.length;i +=1 {
if f(L.val[i], v) ==true {
w = i
break
}
//if v == L.val[i] {
// w = i
// break
//}
}
return w
/* 傳回要查找值的前驅,如果沒有前驅,則傳回空*/
func (L *List) PriorElem(vinterface{})interface{} {
if v == L.val[i] {
w = i +1
break
}
if w ==0 || w ==1{
return nil
} else {
return L.val[w-2]
/* 傳回要查找值的後驅,如果沒有後驅,則傳回空*/
func (L *List) NextElem(vinterface{})interface{} {
if w ==0 || w == L.length {
return nil
}else {
return L.val[w]
/* 線上性表中的第i個位置插入一個資料*/
func (L *List) ListInsert(i uint32, vinterface{}) {
if i <=1 {
a := make([]interface{},1)
a[0] = v
L.val = append(a, L.val...)
} else if i >= L.length {
L.val = append(L.val, v)
} else {
// rear := L.val[i-1:],這種方式是引用,而不是建立新副本
rear := make([]interface{},0)
rear = append(rear, L.val[i-1:]...)
L.val = append(L.val[:i-1], v)
L.val = append(L.val, rear...)
/* 删除第i個值,線性表長度減一,并用e傳回其值*/
func (L *List) ListChange(i uint32, vinterface{}) {
L.val[i-1] = v
} else if i >= L.length {
L.val[L.length-1] = v
} else {
}
func (L *List) ListDelete(i uint32)interface{} {
e := L.val[i-1]
L.val = append(L.val[:i-1], L.val[i:]...)
return e
/* 對線性表的每一個函數都調用visit()函數*/
func (L *List) ListTraverse(ffunc(a ...interface{})) {
for i :=range L.val {
f(L.val[i])
func print(v ...interface{}) {
fmt.Print(v[0]," ")
func main() {
var l = List{}
var i int
var c1, c2, v string
for true {
fmt.Println("---------------------------------------------------")
fmt.Println("1) 管理線性表")
fmt.Println("2) 增删改")
fmt.Println("3) 查找")
fmt.Println("4) 列印")
fmt.Scan(&c1)
if c1 !="1" && c1 !="2" && c1 !="3" && c1 !="4" {
break
switch c1 {
case "1":
fmt.Println("-------------------------------------")
fmt.Println("1) 初始化線性表")
fmt.Println("2) 清空線性表")
fmt.Println("3) 銷毀線性表")
fmt.Println("其他-退出")
fmt.Scan(&c2)
if c2 !="1" && c2 !="2" && c2 !="3" {
}
switch c2 {
case "1":l.InitList("1",10);
case "2":l.ClearList();
case "3":l.DestroyList();
case "2":
fmt.Println("-------------------------------------------")
fmt.Println("1) 添加一個資料")
fmt.Println("2) 删除一個資料")
fmt.Println("3) 修改資料")
fmt.Print("輸入位置, 值: ")
fmt.Scan(&i, &v)
l.ListInsert(uint32(i), v)
fmt.Print("輸入位置: ")
fmt.Scan(&i)
l.ListDelete(uint32(i))
case "3":
l.ListChange(uint32(i), v)
;
fmt.Println("----------------------------")
fmt.Println("1) 擷取第i個值")
fmt.Println("2) 擷取值第一次出現的位置")
fmt.Println("3) 擷取值第一次出現的位置的前繼值")
fmt.Println("4) 擷取值第一次出現的位置的後繼值")
if c2 !="1" && c2 !="2" && c2 !="3" && c2 !="4" {
case "1":;
fmt.Scanf("%d", &i)
val := l.GetElem(i)
fmt.Println("第", i,"個值為: ", val)
fmt.Scan(&v)
fmt.Println("值", v,"出現的位置: ", l.LocateElem(v,func(a ...interface{}) bool {
if a[0] == a[1] {
return true
}else {
return false
}
}))
fmt.Println("值", v,"出現的字首值: ", l.PriorElem(v))
case "4":
fmt.Println("值", v,"出現的字尾值: ", l.NextElem(v))
l.ListTraverse(print)