Skip to content

Commit debf236

Browse files
committed
完善静态链表
1 parent bdbbd27 commit debf236

File tree

3 files changed

+136
-112
lines changed

3 files changed

+136
-112
lines changed
Lines changed: 72 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1,135 +1,142 @@
1-
## 静态链表的由来
1+
## 静态链表
22

3-
有些编程语言没有指针的概念,单链表的实现就会出现困难。但是可以另辟蹊径,使用数组描述单链表,数组中每个元素都由data和cur表示,cur表示单链表中的next指针,存放该元素的后继在数组中的下标,我们把cur叫做游标,这种用数组描述的链表叫做静态链表,也叫游标实现法。
3+
#### 1.1 静态链表由来
44

5-
为了方便插入数据,通常会把数组建立的大一些,以便有一些空闲空间可以便于插入时不溢出
5+
有些编程语言没有指针的概念,单链表的实现就会出现困难。但是可以另辟蹊径,使用数组描述单链表及其元素,数组中每个元素都由data和cur表示,cur表示单链表中的next指针,存放该元素的后继在数组中的下标,我们把cur叫做游标,这种用数组描述的链表叫做静态链表,也叫游标实现法
66

7-
对数组的第一个和最后一个元素作特殊处理,不存储数据,未被使用的数组元素称为备用链表。数组的第一个元素,下标为0,其cur存储第一个结点的下标。
7+
#### 1.2 静态链表特点
88

9-
![](../images/Algorithm/staticline-1.png)
9+
- 方便插入数据,通常会把数组建立的大一些,以便有一些空闲空间可以便于插入时不溢出
10+
- 数组的第一个和最后一个元素不存储数据,未被使用的数组元素称为备用链表。数组的第一个元素下标为0,其cur存储第一个结点的下标。
11+
- 非随机存取
1012

11-
## 二 静态链表实现
13+
![](../images/Algorithm/staticlist-1.png)
1214

15+
## 二 静态链表实现
1316
```go
14-
/**
15-
* 静态链表
16-
*/
17-
18-
package list
19-
20-
import (
21-
"errors"
22-
"fmt"
23-
"os"
24-
)
25-
26-
// 结点结构体
27-
type component struct {
28-
Data interface{}
29-
Cur int // 游标:为0时表示无指向
17+
// 节点结构体
18+
type node struct {
19+
data interface{}
20+
cur int // 游标:为0时表示无指向
3021
}
3122

3223
// 静态链表
3324
type StaticList struct {
34-
Arr []component
35-
MaxSize int
36-
Length int
25+
data []node
26+
size int
27+
length int
3728
}
3829

39-
func NewStaticList(size int) *StaticList {
30+
func New(size int) (*StaticList, error){
4031

4132
if size < 3 {
42-
fmt.Println("参数错误")
43-
return nil
33+
return nil, errors.New("size overflow")
4434
}
4535

46-
list := make([]component, size)
36+
s := make([]node, size)
4737

48-
for i := 0; i < size-1; i++ {
49-
list[i].Cur = i + 1
38+
for i := 0; i <= size-1; i++ {
39+
s[i].cur = i + 1
40+
if i == size - 1 {
41+
s[size-1].cur = 0
42+
}
5043
}
51-
list[size-2].Cur = 0
52-
list[size-1].Cur = 0 // 初始化时,静态链表为空,最后一个元素cur为0
53-
return &StaticList{list, size, 0}
44+
45+
return &StaticList{s, size, 0},nil
5446
}
5547

5648
// 判断是否为空
5749
func (sl *StaticList) IsEmpty() bool {
58-
if sl.Length == 0 {
50+
if sl.length == 0 {
5951
return true
6052
}
6153
return false
6254
}
6355

64-
// 分配结点
56+
// 分配节点
6557
func (sl *StaticList) malloc() int {
66-
i := sl.Arr[0].Cur
58+
i := sl.data[0].cur
6759
if i == 0 {
6860
os.Exit(0)
6961
}
70-
sl.Arr[0].Cur = sl.Arr[i].Cur
62+
sl.data[0].cur = sl.data[i].cur
7163
return i
7264
}
7365

74-
// 回收结点
66+
// 回收节点
7567
func (sl *StaticList) free(index int) {
76-
sl.Arr[index].Cur = sl.Arr[0].Cur
77-
sl.Arr[0].Cur = index
68+
sl.data[index].cur = sl.data[0].cur
69+
sl.data[0].cur = index
7870
}
7971

8072
// 回收链表到备用链表
8173
func (sl *StaticList) DestroyList() {
82-
if sl.Arr[sl.MaxSize-1].Cur == 0 {
74+
75+
j := sl.data[sl.size-1].cur
76+
77+
if j == 0 {
8378
return
8479
}
85-
j := sl.Arr[sl.MaxSize-1].Cur
86-
sl.Arr[sl.MaxSize-1].Cur = 0
87-
i := sl.Arr[0].Cur
88-
sl.Arr[0].Cur = j
80+
81+
sl.data[sl.size-1].cur = 0
82+
83+
i := sl.data[0].cur
84+
sl.data[0].cur = j
8985
if j > 0 {
90-
j = sl.Arr[j].Cur
86+
j = sl.data[j].cur
9187
}
92-
sl.Arr[j].Cur = i
88+
sl.data[j].cur = i
9389
}
9490

9591
// 插入节点
96-
func (sl *StaticList) Insert(data interface{}, index int) (bool, error) {
97-
if index < 1 || index > sl.Length {
98-
return false, errors.New("插入索引不合法")
92+
func (sl *StaticList) Insert(data interface{}, index int) error{
93+
94+
if index < 1 || index > sl.length {
95+
return errors.New("index overflow")
9996
}
100-
i := sl.Arr[sl.MaxSize-1].Cur
97+
98+
i := sl.data[sl.size-1].cur
10199
j := 1
102100
for i > 0 && j < index-1 {
103101
j++
104-
i = sl.Arr[i].Cur
102+
i = sl.data[i].cur
105103
}
106-
tmp := sl.Arr[i].Cur
104+
tmp := sl.data[i].cur
107105
cur := sl.malloc()
108-
sl.Arr[cur].Data = data
109-
sl.Arr[cur].Cur = tmp
110-
sl.Arr[i].Cur = cur
111-
return true, nil
106+
sl.data[cur].data = data
107+
sl.data[cur].cur = tmp
108+
sl.data[i].cur = cur
109+
return nil
112110
}
113111

114112
// 显示链表结构
115-
func (sl *StaticList) Traverse() {
116-
for i, v := range sl.Arr {
117-
fmt.Printf("%5d:%5d,%5s", i, v.Cur, v.Data)
113+
func (sl *StaticList) Show() {
114+
for i, v := range sl.data {
115+
fmt.Printf("%5d:%5d,%5s", i, v.cur, v.data)
118116
}
119117
}
120118

121119
// 获取数据元素位置
122-
func (sl *StaticList) GetLocation(data interface{}) int {
120+
func (sl *StaticList) Location(data interface{}) int {
123121
location := 0
124-
i := sl.Arr[sl.MaxSize-1].Cur
122+
i := sl.data[sl.size-1].cur
125123
for i > 0 {
126124
location++
127-
if sl.Arr[i].Data == data {
125+
if sl.data[i].data == data {
128126
return location
129127
}
130-
i = sl.Arr[i].Cur
128+
i = sl.data[i].cur
131129
}
132130
return location
133131
}
134132

133+
// 获取链表长度
134+
func (sl *StaticList) Length() int {
135+
return sl.length
136+
}
137+
138+
// 获取链表容量
139+
func (sl *StaticList) Size() int {
140+
return sl.size
141+
}
135142
```

sources/go/list/StaticList/StaticList.go

Lines changed: 64 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -10,111 +10,128 @@ import (
1010
"os"
1111
)
1212

13-
// 结点结构体
14-
type component struct {
15-
Data interface{}
16-
Cur int // 游标:为0时表示无指向
13+
// 节点结构体
14+
type node struct {
15+
data interface{}
16+
cur int // 游标:为0时表示无指向
1717
}
1818

1919
// 静态链表
2020
type StaticList struct {
21-
Arr []component
22-
MaxSize int
23-
Length int
21+
data []node
22+
size int
23+
length int
2424
}
2525

26-
func NewStaticList(size int) *StaticList {
26+
func New(size int) (*StaticList, error){
2727

2828
if size < 3 {
29-
fmt.Println("参数错误")
30-
return nil
29+
return nil, errors.New("size overflow")
3130
}
3231

33-
list := make([]component, size)
32+
s := make([]node, size)
3433

35-
for i := 0; i < size-1; i++ {
36-
list[i].Cur = i + 1
34+
for i := 0; i <= size-1; i++ {
35+
s[i].cur = i + 1
36+
if i == size - 1 {
37+
s[size-1].cur = 0
38+
}
3739
}
38-
list[size-2].Cur = 0
39-
list[size-1].Cur = 0 // 初始化时,静态链表为空,最后一个元素cur为0
40-
return &StaticList{list, size, 0}
40+
41+
return &StaticList{s, size, 0},nil
4142
}
4243

4344
// 判断是否为空
4445
func (sl *StaticList) IsEmpty() bool {
45-
if sl.Length == 0 {
46+
if sl.length == 0 {
4647
return true
4748
}
4849
return false
4950
}
5051

51-
// 分配结点
52+
// 分配节点
5253
func (sl *StaticList) malloc() int {
53-
i := sl.Arr[0].Cur
54+
i := sl.data[0].cur
5455
if i == 0 {
5556
os.Exit(0)
5657
}
57-
sl.Arr[0].Cur = sl.Arr[i].Cur
58+
sl.data[0].cur = sl.data[i].cur
5859
return i
5960
}
6061

61-
// 回收结点
62+
// 回收节点
6263
func (sl *StaticList) free(index int) {
63-
sl.Arr[index].Cur = sl.Arr[0].Cur
64-
sl.Arr[0].Cur = index
64+
sl.data[index].cur = sl.data[0].cur
65+
sl.data[0].cur = index
6566
}
6667

6768
// 回收链表到备用链表
6869
func (sl *StaticList) DestroyList() {
69-
if sl.Arr[sl.MaxSize-1].Cur == 0 {
70+
71+
j := sl.data[sl.size-1].cur
72+
73+
if j == 0 {
7074
return
7175
}
72-
j := sl.Arr[sl.MaxSize-1].Cur
73-
sl.Arr[sl.MaxSize-1].Cur = 0
74-
i := sl.Arr[0].Cur
75-
sl.Arr[0].Cur = j
76+
77+
sl.data[sl.size-1].cur = 0
78+
79+
i := sl.data[0].cur
80+
sl.data[0].cur = j
7681
if j > 0 {
77-
j = sl.Arr[j].Cur
82+
j = sl.data[j].cur
7883
}
79-
sl.Arr[j].Cur = i
84+
sl.data[j].cur = i
8085
}
8186

8287
// 插入节点
83-
func (sl *StaticList) Insert(data interface{}, index int) (bool, error) {
84-
if index < 1 || index > sl.Length {
85-
return false, errors.New("插入索引不合法")
88+
func (sl *StaticList) Insert(data interface{}, index int) error{
89+
90+
if index < 1 || index > sl.length {
91+
return errors.New("index overflow")
8692
}
87-
i := sl.Arr[sl.MaxSize-1].Cur
93+
94+
i := sl.data[sl.size-1].cur
8895
j := 1
8996
for i > 0 && j < index-1 {
9097
j++
91-
i = sl.Arr[i].Cur
98+
i = sl.data[i].cur
9299
}
93-
tmp := sl.Arr[i].Cur
100+
tmp := sl.data[i].cur
94101
cur := sl.malloc()
95-
sl.Arr[cur].Data = data
96-
sl.Arr[cur].Cur = tmp
97-
sl.Arr[i].Cur = cur
98-
return true, nil
102+
sl.data[cur].data = data
103+
sl.data[cur].cur = tmp
104+
sl.data[i].cur = cur
105+
return nil
99106
}
100107

101108
// 显示链表结构
102-
func (sl *StaticList) Traverse() {
103-
for i, v := range sl.Arr {
104-
fmt.Printf("%5d:%5d,%5s", i, v.Cur, v.Data)
109+
func (sl *StaticList) Show() {
110+
for i, v := range sl.data {
111+
fmt.Printf("%5d:%5d,%5s", i, v.cur, v.data)
105112
}
106113
}
107114

108115
// 获取数据元素位置
109-
func (sl *StaticList) GetLocation(data interface{}) int {
116+
func (sl *StaticList) Location(data interface{}) int {
110117
location := 0
111-
i := sl.Arr[sl.MaxSize-1].Cur
118+
i := sl.data[sl.size-1].cur
112119
for i > 0 {
113120
location++
114-
if sl.Arr[i].Data == data {
121+
if sl.data[i].data == data {
115122
return location
116123
}
117-
i = sl.Arr[i].Cur
124+
i = sl.data[i].cur
118125
}
119126
return location
120127
}
128+
129+
// 获取链表长度
130+
func (sl *StaticList) Length() int {
131+
return sl.length
132+
}
133+
134+
// 获取链表容量
135+
func (sl *StaticList) Size() int {
136+
return sl.size
137+
}

0 commit comments

Comments
 (0)