/
slink_queue.c
132 lines (106 loc) · 1.89 KB
/
slink_queue.c
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#include <stdio.h>
#include <malloc.h>
/**
* C 语言: 单链表实现“队列”,只能存储int数据。
*
* @author skywang
* @date 2013/11/07
*/
// 单链表节点
struct node {
int val;
struct node* next;
};
// 表头
static struct node *phead=NULL;
// 创建节点,val为节点值
static struct node* create_node(val)
{
struct node *pnode=NULL;
pnode = (struct node*)malloc(sizeof(struct node));
if (!pnode)
return NULL;
pnode->val = val;
pnode->next = NULL;
return pnode;
}
// 销毁单向链表
static int destroy_single_link()
{
struct node *pnode=NULL;
while (phead != NULL)
{
pnode = phead;
phead = phead->next;
free(pnode);
}
return 0;
}
// 将val添加到队列的末尾
static void add(int val)
{
if (!phead)
{
phead = create_node(val);
return ;
}
struct node *pnode = create_node(val);
struct node *pend = phead;
while (pend->next)
pend = pend->next;
pend->next = pnode;
}
// 返回“队列开头元素”
int front()
{
return phead->val;
}
// 返回并删除“队列开头元素”
static int pop()
{
int ret = phead->val;
struct node *pnode = phead;
phead = phead->next;
free(pnode);
return ret;
}
// 返回链表中节点的个数
static int size()
{
int count=0;
struct node *pend = phead;
while (pend)
{
pend = pend->next;
count++;
}
return count;
}
// 链表是否为空
static int is_empty()
{
return size()==0;
}
void main()
{
int tmp=0;
// 将10, 20, 30 依次加入到队列中
add(10);
add(20);
add(30);
// 将“队列开头元素”赋值给tmp,并删除“该元素”
tmp = pop();
printf("tmp=%d\n", tmp);
// 只将“队列开头的元素”赋值给tmp,不删除该元素.
tmp = front();
printf("tmp=%d\n", tmp);
add(40);
printf("is_empty()=%d\n", is_empty());
printf("size()=%d\n", size());
while (!is_empty())
{
printf("%d\n", pop());
}
// 销毁队列
destroy_single_link();
}