go語言使用切片實現線性表
```
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{} {
w := uint32(0)
for i := uint32(0);i < L.length;i +=1 {
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{} {
w := uint32(0)
for i := uint32(0);i < L.length;i +=1 {
if v == L.val[i] {
w = i +1
break
}
}
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{}) {
if i <=1 {
L.val[i-1] = v
} else if i >= L.length {
L.val[L.length-1] = v
} else {
L.val[i-1] = v
}
}
/* 刪除第i個值,線性表長度減一,並用e返回其值*/
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":
for true {
fmt.Println("-------------------------------------")
fmt.Println("1) 初始化線性表")
fmt.Println("2) 清空線性表")
fmt.Println("3) 銷燬線性表")
fmt.Println("其他-退出")
fmt.Scan(&c2)
if c2 !="1" && c2 !="2" && c2 !="3" {
break
}
switch c2 {
case "1":l.InitList("1",10);
case "2":l.ClearList();
case "3":l.DestroyList();
}
}
case "2":
for true {
fmt.Println("-------------------------------------------")
fmt.Println("1) 新增一個資料")
fmt.Println("2) 刪除一個資料")
fmt.Println("3) 修改資料")
fmt.Println("其他-退出")
fmt.Scan(&c2)
if c2 !="1" && c2 !="2" && c2 !="3" {
break
}
switch c2 {
case "1":
fmt.Print("輸入位置, 值: ")
fmt.Scan(&i, &v)
l.ListInsert(uint32(i), v)
case "2":
fmt.Print("輸入位置: ")
fmt.Scan(&i)
l.ListDelete(uint32(i))
case "3":
fmt.Print("輸入位置, 值: ")
fmt.Scan(&i, &v)
l.ListChange(uint32(i), v)
}
}
;
case "3":
for true {
fmt.Println("----------------------------")
fmt.Println("1) 獲取第i個值")
fmt.Println("2) 獲取值第一次出現的位置")
fmt.Println("3) 獲取值第一次出現的位置的前繼值")
fmt.Println("4) 獲取值第一次出現的位置的後繼值")
fmt.Println("其他-退出")
fmt.Scan(&c2)
if c2 !="1" && c2 !="2" && c2 !="3" && c2 !="4" {
break
}
switch c2 {
case "1":;
fmt.Scanf("%d", &i)
val := l.GetElem(i)
fmt.Println("第", i,"個值為: ", val)
case "2":
fmt.Scan(&v)
fmt.Println("值", v,"出現的位置: ", l.LocateElem(v,func(a ...interface{}) bool {
if a[0] == a[1] {
return true
}else {
return false
}
}))
case "3":
fmt.Scan(&v)
fmt.Println("值", v,"出現的字首值: ", l.PriorElem(v))
case "4":
fmt.Scan(&v)
fmt.Println("值", v,"出現的字尾值: ", l.NextElem(v))
}
}
;
case "4":
l.ListTraverse(print)
}
}
}
```
相關文章
- 線性迴歸 go 語言實現Go
- 線性表-順序表C語言實現C語言
- go 語言切片Go
- Go語言————7.2 切片Go
- GO語言學習——切片二Go
- Go語言————7.4 切片重組(reslice)Go
- 帶讀 |《Go in Action》(中文:Go語言實戰) 深入瞭解切片Go
- Go語言實現RPCGoRPC
- GO語言————8.4 map 型別的切片Go型別
- go語言學習-陣列-切片-mapGo陣列
- Go 語言切片是如何擴容的?Go
- go語言實現掃雷Go
- GO語言————7.5 切片的複製與追加Go
- Go 語言基礎 陣列、切片、對映Go陣列
- Go語言系列(三)之陣列和切片Go陣列
- 線性表的使用——順序實現
- Golang | Go語言多型的實現與interface使用Golang多型
- 《快學 Go 語言》第 5 課 —— 神奇的切片Go
- Go語言切片面試真題7連問Go面試
- go語言實現ssh打隧道Go
- Go語言interface底層實現Go
- go語言依賴注入實現Go依賴注入
- Go語言實現TCP通訊GoTCP
- GO語言 實現埠掃描Go
- go語言使用Go
- go語言將表資料動態轉成切片(欄位任意擴充)Go
- 線性表及其實現
- go語言實現自己的RPC:go rpc codecGoRPC
- 使用 Go 語言實現簡單的文字識別(OCR)Go
- Go 語言介面及使用介面實現連結串列插入Go
- 《快學 Go 語言》第 5 課 —— 靈活的切片Go
- GO語言————7.6 字串、陣列和切片的應用Go字串陣列
- Go 語言學習筆記之陣列與切片Go筆記陣列
- go 語言連線池Go
- Go語言map的底層實現Go
- Go語言實現的Java Stream APIGoJavaAPI
- Go語言實現HTTPS加密協議GoHTTP加密協議
- 檔案複製(Go語言實現)Go