8000 srlink: amend&select方法实现 · home-coder/data-abstraction-001@f4e0b84 · GitHub
[go: up one dir, main page]

Skip to content

Commit f4e0b84

Browse files
author
oneface
committed
srlink: amend&select方法实现
1 parent 72eaf2e commit f4e0b84

File tree

1 file changed

+71
-8
lines changed

1 file changed

+71
-8
lines changed

002-srlink.c

Lines changed: 71 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@ static void srlink_show(srlink_data *srldata)
2323

2424
while (1) {
2525
printf("%c->", srlp->data);
26-
if (srlp->next == srldata) {
26+
srlp = srlp->next;
27+
if (srlp == srldata) {
2728
break;
2829
}
29-
srlp = srlp->next;
3030
}
3131
printf("\n");
3232
}
@@ -92,6 +92,7 @@ static void srlink_delete(srlink_data **srldata, unsigned int loc)
9292
{
9393
int i;
9494
srlink_data *srlp = *srldata;
95+
srlink_data *prev = NULL;
9596
if (!srlp) {
9697
printf("srlink is not exsit\n");
9798
return ;
@@ -107,9 +108,13 @@ static void srlink_delete(srlink_data **srldata, unsigned int loc)
107108

108109
//head(0)->(1)...->head(0); 0
109110
if (loc == 0) {
110-
srlp = srlp->next;
111+
prev = *srldata;
112+
while (prev->next != *srldata) {
113+
prev = prev->next;
114+
}
115+
prev->next = (*srldata)->next;
111116
free(*srldata);
112-
*srldata = srlp;
117+
*srldata = prev->next;
113118
return ;
114119
}
115120

@@ -127,6 +132,49 @@ static void srlink_delete(srlink_data **srldata, unsigned int loc)
127132
desrlp = NULL;
128133
}
129134

135+
static void srlink_amend(srlink_data *srldata, unsigned int loc, char data)
136+
{
137+
int i = 0;
138+
srlink_data *srlp = srldata;
139+
if (!srlp) {
140+
printf("srlink is not exsit\n");
141+
return ;
142+
}
143+
144+
for (; i < loc; i++) {
145+
srlp = srlp->next;
146+
if (srlp == srldata) {
147+
printf("amend loc %d is invalid\n", loc);
148+
return ;
149+
}
150+
}
151+
152+
srlp->data = data;
153+
}
154+
155+
static int srlink_select(srlink_data *srldata, char data)
156+
{
157+
int loc = -1;
158+
srlink_data *srlp = srldata;
159+
if (!srlp) {
160+
printf("srlink is not exsit\n");
161+
return -1;
162+
}
163+
164+
if (srlp->data == data) {
165+
loc = 0;
166+
return loc;
167+
}
168+
for (srlp = srlp->next, loc = 1; srlp != srldata; srlp = srlp->next) {
169+
if (srlp->data == data) {
170+
return loc;
171+
}
172+
loc++;
173+
}
174+
175+
return -1;
176+
}
177+
130178
int main()
131179
{
132180
srlink_data *srldata;
@@ -137,19 +185,34 @@ int main()
137185

138186
srlink_insert(&srldata, 0, 'm');
139187
srlink_insert(&srldata, 0, 't');
188+
srlink_insert(&srldata, 0, 't');
189+
srlink_insert(&srldata, 0, 't');
190+
srlink_insert(&srldata, 3, 'e');
191+
srlink_insert(&srldata, 3, 'e');
140192
srlink_insert(&srldata, 3, 'e');
141193
srlink_insert(&srldata, 2, 'e');
142194
srlink_insert(&srldata, 1, 'w');
143195
srlink_show(srldata);
144196

145197
srlink_delete(&srldata, 0);
198+
srlink_show(srldata);
199+
srlink_delete(&srldata, 3);
146200
srlink_delete(&srldata, 1);
147201
srlink_delete(&srldata, 3);
148202
srlink_show(srldata);
149-
#if 0
150-
srlink_amend();
151-
srlink_select();
152-
#endif
203+
204+
srlink_amend(srldata, 3, 'l');
205+
srlink_amend(srldata, 0, 'l');
206+
srlink_amend(srldata, 8, 'l');
207+
srlink_show(srldata);
208+
209+
int loc;
210+
loc = srlink_select(srldata, 'l');
211+
printf("select 'l' in loc %d\n", loc);
212+
loc = srlink_select(srldata, 'm');
213+
printf("select 'm' in loc %d\n", loc);
214+
loc = srlink_select(srldata, 'q');
215+
printf("select 'q' in loc %d\n", loc);
153216

154217
return 0;
155218
}

0 commit comments

Comments
 (0)
0