队列的链式存储结构

队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出而已,我们把它简称为链队列

为了操作上的方便,我们将队头指针指向链队列的头结点,而队尾指针指向终端结点。链队列示意图:

当队列为空时,front和rear都指向头结点

实例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package main

import (
"errors"
"fmt"
)
type qelemType int
//数据节点(链表形式)
type QNode struct {
data qelemType
next *QNode
}
type queuePtr *QNode

//定义队列
type LinkQueue struct {
front, rear queuePtr
}

//创建头结点
func createHeadNode(q *LinkQueue) {
s := queuePtr(new(QNode))
s.next = nil
q.front = s
q.rear = s
}

//如队列操作
func enQueue(q *LinkQueue, e qelemType) {
s := queuePtr(new(QNode))
s.data = e
s.next = nil //队尾为空
q.rear.next = s
q.rear = s //rear指向新添加的数据(保证指向最后一个元素)
}

//出队列
func deQueue(q *LinkQueue) (err error, res qelemType) {
if q.front == q.rear {
err = errors.New("队列为空,没有数据出队列")
return
}
s := q.front.next
res = s.data
q.front.next = s.next
if q.rear == s {
q.rear = q.front
}
return
}

func main() {
var p LinkQueue
/*
注意 需要创建头结点,不然头结点为空,操作它的.next 会发生异常,异常信息如下:
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x0 addr=0x0 pc=0x48b5c9]
*/
createHeadNode(&p)
enQueue(&p, qelemType(123))
enQueue(&p, qelemType(345))
enQueue(&p, qelemType(567))
_, res := deQueue(&p)
fmt.Println(res)
_, res = deQueue(&p)
fmt.Println(res)
_, res = deQueue(&p)
fmt.Println(res)
err, res := deQueue(&p)
fmt.Println(err, res)

}

运行效果:

-------------本文结束感谢您的阅读-------------

本文标题:队列的链式存储结构

文章作者:Wuman

发布时间:2018年09月04日 - 12:09

最后更新:2018年09月04日 - 13:09

原始链接:http://yoursite.com/2018/09/04/队列的链式存储结构/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。