44#include <stdio.h>
55#include <stdlib.h>
66#include <string.h>
7-
7+ // #define NOT_FOUND -1
8+ // #define MALLOC_FAILED -2
9+ // #define SUCCESS 0
810struct Person
911{
1012 char name [20 ];
@@ -17,31 +19,33 @@ void GetInput(struct Person *person);
1719void PrintPerson (struct Person * person );
1820
1921/*
20- malloc failed -> -1 -> exit(1);
21- Success -> 0
22+ malloc failed -> NULL -> exit(1);
23+ Success -> struct Person*
2224*/
23- int AddPerson (struct Person * * contacts );
25+ struct Person * AddPerson (struct Person * * contacts );
2426
2527/*
26- Not Found -> -1
27- Success -> 0
28+ Not Found -> NULL
29+ Success -> struct Person*
2830*/
29- int ChangePerson (struct Person * contacts );
31+ struct Person * ChangePerson (struct Person * contacts );
3032
3133/*
32- Not Found -> -1
33- Success -> 0
34+ Not Found -> NULL
35+ Success -> struct Person*
3436*/
35- int DeletePerson (struct Person * * contacts );
37+ struct Person * DeletePerson (struct Person * * contacts );
3638
3739/*
3840Not Found -> NULL
39- Success -> struct Person*
41+ Success -> struct Person* -> remember to release!
4042*/
4143struct Person * FindPerson (struct Person * contacts );
4244
4345void DisplayContacts (struct Person * contacts );
4446
47+ inline void ReleasePerson (struct Person * person );
48+
4549void ReleaseContacts (struct Person * * contacts );
4650
4751int main ()
@@ -60,16 +64,11 @@ int main()
6064 break ;
6165 }
6266 case 1 : {
63- switch (AddPerson (& contacts ))
67+ struct Person * person = AddPerson (& contacts );
68+ if (person == NULL )
6469 {
65- case -1 : {
6670 printf ("ERROR: malloc failed" );
6771 exit (1 );
68- break ;
69- }
70- case 0 : {
71- break ;
72- }
7372 }
7473 break ;
7574 }
@@ -88,30 +87,24 @@ int main()
8887 }
8988 case 3 : {
9089 printf ("Please input the name:\n" );
91- switch (ChangePerson (contacts ))
90+ struct Person * person = ChangePerson (contacts );
91+ if (person == NULL )
9292 {
93- case -1 : {
9493 printf ("The person is not found\n" );
95- break ;
9694 }
97- case 0 : {
98- break ;
99- }
100- }
101-
10295 break ;
10396 }
10497 case 4 : {
10598 printf ("Please input the name:\n" );
106- switch (DeletePerson (& contacts ))
99+ struct Person * person = DeletePerson (& contacts );
100+ if (person == NULL )
107101 {
108- case -1 : {
109102 printf ("The person is not found\n" );
110- break ;
111- }
112- case 0 : {
113- break ;
114103 }
104+ else
105+ {
106+ // ReleasePerson(person);
107+ free (person );
115108 }
116109 break ;
117110 }
@@ -149,13 +142,13 @@ void PrintPerson(struct Person *person)
149142 printf ("Phone number:\n%s\n" , person -> phone );
150143}
151144
152- int AddPerson (struct Person * * contacts )
145+ struct Person * AddPerson (struct Person * * contacts )
153146{
154147 struct Person * person = (struct Person * )malloc (sizeof (struct Person ));
155148
156149 if (person == NULL )
157150 {
158- return -1 ;
151+ return NULL ;
159152 }
160153
161154 GetInput (person );
@@ -171,7 +164,7 @@ int AddPerson(struct Person **contacts)
171164 * contacts = person ;
172165 person -> next = NULL ;
173166 }
174- return 0 ;
167+ return person ;
175168}
176169
177170struct Person * FindPerson (struct Person * contacts )
@@ -191,7 +184,7 @@ struct Person *FindPerson(struct Person *contacts)
191184 return current ;
192185}
193186
194- int ChangePerson (struct Person * contacts )
187+ struct Person * ChangePerson (struct Person * contacts )
195188{
196189 struct Person * current = FindPerson (contacts );
197190
@@ -200,29 +193,30 @@ int ChangePerson(struct Person *contacts)
200193 printf ("Please input new Phone number:\n" );
201194 scanf ("%s" , current -> phone );
202195 // Bounds Check Elimination is required
203- return 0 ;
196+ return current ;
204197 }
205198 else
206199 {
207- return -1 ;
200+ return NULL ;
208201 }
209202}
210203
211- int DeletePerson (struct Person * * contacts )
204+ struct Person * DeletePerson (struct Person * * contacts )
212205{
213206 struct Person * person = FindPerson (* contacts );
214207
215208 if (person == NULL )
216209 {
217- return -1 ;
210+ return NULL ;
218211 }
219212 else
220213 {
221214 struct Person * current = * contacts ;
222215 if (current == person )
223216 {
224217 * contacts = current -> next ;
225- free (current );
218+ // free(current);
219+ return current ;
226220 // target is the first struct
227221 }
228222 else
@@ -233,9 +227,10 @@ int DeletePerson(struct Person **contacts)
233227 }
234228 struct Person * target = current -> next ;
235229 current -> next = current -> next -> next ;
236- free (target );
230+ // free(target);
231+ return target ;
237232 }
238- return 0 ;
233+ // return NULL ;
239234 }
240235}
241236
@@ -248,6 +243,11 @@ void DisplayContacts(struct Person *contacts)
248243 }
249244}
250245
246+ inline void ReleasePerson (struct Person * person )
247+ {
248+ free (person );
249+ }
250+
251251void ReleaseContacts (struct Person * * contacts )
252252{
253253 struct Person * temp = * contacts ;
0 commit comments