-
Notifications
You must be signed in to change notification settings - Fork 69
/
Copy pathclang.single-link-list.c
179 lines (171 loc) · 4.58 KB
/
clang.single-link-list.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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define ERROR -1
typedef struct node {
int element;
struct node * next;
} node;
//有些童鞋有疑问:下面这句的意思就是将"node *"定义为快捷类型link_list,以后link_list就是node类型指针变量
typedef node * link_list;
/*
* @desc : 世间一切皆为增删改查!你看看我函数命名方式就是curd!多么的接地气
*/
int create_node( link_list, int, int );
int update_node( link_list, int, int );
int read_node( link_list, int );
int delete_node( link_list, int );
int range_link_list();
void destroy_link_list();
int main( void ) {
// 初始化单链表头节点
link_list head, first;
head = ( link_list )malloc( sizeof( link_list ) );
head->element = 0;
head->next = NULL;
// 初始化单链条第一个节点
first = ( link_list )malloc( sizeof( link_list ) );
first->element = 1;
first->next = NULL;
head->next = first;
// 创建一个节点
create_node( head, 1, 2 );
create_node( head, 1, 3 );
create_node( head, 1, 4 );
create_node( head, 1, 5 );
// 读取一个节点
int temp = read_node( head, 1 );
printf( "%d\n", temp );
temp = read_node( head, 2 );
printf( "%d\n", temp );
temp = read_node( head, 3 );
printf( "%d\n", temp );
temp = read_node( head, 4 );
printf( "%d\n", temp );
temp = read_node( head, 5 );
printf( "%d\n", temp );
printf( "===================\n" );
// 更新一个节点
update_node( head, 1, 11 );
update_node( head, 2, 22 );
temp = read_node( head, 1 );
printf( "%d\n", temp );
temp = read_node( head, 2 );
printf( "%d\n", temp );
temp = read_node( head, 3 );
printf( "%d\n", temp );
temp = read_node( head, 4 );
printf( "%d\n", temp );
temp = read_node( head, 5 );
printf( "%d\n", temp );
printf( "===================\n" );
// 删除一个节点
delete_node( head, 2 );
temp = read_node( head, 1 );
printf( "%d\n", temp );
temp = read_node( head, 2 );
printf( "%d\n", temp );
temp = read_node( head, 3 );
printf( "%d\n", temp );
temp = read_node( head, 4 );
printf( "%d\n", temp );
return 0;
}
/*
* @desc : 向某个位置插入一个元素
* @param : 头指针
@param : index是位置
@parma : element是要节点的元素内容
*/
int create_node( link_list node, int index, int element ) {
if ( index < 1 ) {
return ERROR;
}
int counter = 1;
while ( node && counter < index ) {
node = node->next;
counter++;
}
// 判断index位置是否存在或合法
if ( NULL == node || counter > index ) {
printf( "位置不存在\n" );
return ERROR;
}
// 此时的ll,就是index位置上的节点了
// 证明一个指向node的指针类型变量
// 并为之分配内存
// 然后往内存中存储数据
link_list new_node;
new_node = ( link_list )malloc( sizeof( link_list ) );
new_node->element = element;
new_node->next = node->next;
node->next = new_node;
// 创建新的节点
return TRUE;
}
/*
* @desc : 更新某个位置上元素
*/
int update_node( link_list node, int index, int element ) {
// 位置不能小于第一个吧
if ( index < 1 ) {
return ERROR;
}
node = node->next;
int counter = 1;
while ( node && counter < index ) {
node = node->next;
counter++;
}
// 位置超过了最后一个了,也就是index位置不存在节点了
if ( NULL == node ) {
return ERROR;
}
// 执行更新操作
node->element = element;
return TRUE;
}
/*
* @desc : 读取链表某个位置上的元素
* @param : index表示位置,自然长度,不是数组那种傻屌似的0表示第一个,1就是第一个
* @param : ll就是链表的入口节点
*/
int read_node( link_list node, int index ) {
// 位置不能小于第一个吧
if ( index < 1 ) {
return ERROR;
}
node = node->next;
int counter = 1;
while ( node && counter < index ) {
node = node->next;
counter++;
}
// 位置超过了最后一个了,也就是index位置不存在节点了
if ( NULL == node ) {
return ERROR;
}
// 此时的ll表示index位置的节点
return node->element;
}
int delete_node( link_list node, int index ) {
// 位置不能小于第一个吧
if ( index < 1 ) {
return ERROR;
}
//node = node->next;
int counter = 1;
while ( node && counter < index ) {
node = node->next;
counter++;
}
// 位置超过了最后一个了,也就是index位置不存在节点了
if ( NULL == node ) {
return ERROR;
}
link_list temp = node->next;
node->next = node->next->next;
free( temp );
return TRUE;
}