c语言小项目---通讯录2.0
自從上次通訊錄項目被字符串項目整的自閉了之后,用了5天時間重新整理了一下通訊錄的思路,并且能夠正常的使用,今天按模塊把基于鏈表的通訊錄2.0版本記錄一下,供后續積累經驗。
首先總結一下 通訊錄2.0版的不足之處:
?
?
那么接下來就分模塊講述一下整個通訊錄的思路吧,先列一下思路圖
?
第一個,就說一下上次初次嘗試寫通訊錄時讓我很糾結的 字符串輸入問題,上一次利用指針和字符數組寫入,要么是報錯,要么就是最后一次輸入內容會把前面所有字符串內容都給覆蓋掉,其實上一次也有想到過利用 getchar() 函數去自己寫一個getstring()的函數,但由于當時重點放在指針上(最后是因為scanf無法給指向堆區的指針寫入內容),就沒有太多嘗試
1.getstring()函數
1 char *GetString() 2 { 3 int size = 5; 4 int count = 0; 5 char *str = (char *)malloc(size); 6 char *pMark = str; 7 char *newstr = NULL; 8 char c; 9 while((c = getchar()) != '\n') 10 { 11 *str = c; 12 str++; 13 count++; 14 if(count + 1 == size) 15 { 16 *str = '\0'; 17 size += 5; 18 newstr = (char *)malloc(size); 19 strcpy_s(newstr,size,pMark); 20 free(pMark); 21 pMark = newstr; 22 str = newstr + count; 23 } 24 } 25 *str = '\0'; 26 27 return pMark;思路:由于字符數組在程序運行后,長度是定下來的,對用戶的輸入長度就有很大限制,所以首先在堆區開辟第一個空間,利用Getchar()獲取輸入緩沖區內內容,向第一個空間內依次輸入字符,并計數。利用計數給第一個空間留一個‘\0’的位置,再開辟一個同樣大小的空間,將第一個空間內的字符串復制給這個空間內,然后用pMark始終指向后一個開辟的空間,str從‘\0’位置繼續賦值,直到識別到‘\n’為止
?
第二個,在編程過程中發現利用scanf()輸入時,在字符緩沖區內總是會有殘留的'\n',每一次都得用getchar()去清理緩存區,一是太麻煩,二是經常會忘,干脆就封裝一個函數,專門用來獲取字符,而且不會受到換行符的麻煩
2.GetKey()
1 char GetKey() 2 { 3 char c; 4 char z = '!'; 5 int flag = 1; 6 while((c=getchar()) != '\n' || 1 == flag) //考慮了\n在之前的情況 7 { 8 z = c; 9 flag = 0; 10 } 11 return z; 12 }思路:沒有什么復雜的思路,就是把'\n'排除在外,我另外又設置了一個標記,就是因為在后面的模塊寫的過程當中忘記了自己封裝好的函數,直接使用scanf然后后面的函數也成功的把‘\n’獲取進去了(好無奈啊,這個找了很長時間的bug),所以干脆就加個標記。
?
第三個,也是因為自己太懶了,不想每次都添加很多信息,就寫了三個隨機生成序號,姓名和電話號碼的函數,在前期測試的時候使用
3.GetTestMessage()
1 int GetId() 2 { 3 static int id = 0; //使用靜態變量 4 id++; 5 return id; 6 } 7 char *GetName() //隨機分配姓名 8 { 9 char *pname = (char *)malloc(6); 10 int i; 11 for(i = 0;i < 5;i++) 12 { 13 pname[i] = rand()%26 + 'a'; 14 } 15 pname[i] = '\0'; 16 17 return pname; 18 } 19 char *GetTel() //隨機分配電話號碼 20 { 21 char *ptel = (char *)malloc(12); 22 int i; 23 int num = rand()%4+1; 24 switch(num) 25 { 26 case 1: 27 strcpy_s(ptel,12,"132"); 28 break; 29 case 2: 30 strcpy_s(ptel,12,"157"); 31 break; 32 case 3: 33 strcpy_s(ptel,12,"188"); 34 break; 35 default: 36 strcpy_s(ptel,12,"150"); 37 break; 38 } 39 for(i = 3;i < 11;i++) 40 { 41 ptel[i] = rand()%10 + '0'; 42 } 43 ptel[i] = '\0'; 44 45 return ptel; 46 }思路:看了很多面經經常會問到 static的作用,我這里也是最淺顯的一個作用聲明靜態變量,全局范圍內可以使用,其他的我也在深入的了解,另外為了號碼偽造的更像一點,用了三個號碼段吧
?
第四個:到這才正式進入通訊錄主題功能的編寫,首先是獲取通訊錄單個結點,我分為兩個部分來寫,一方面是測試數據,一方面在后面可以添加
4.GetNode()
List *GetNode() //獲取測試數據 {List *pTemp = (List *)malloc(sizeof(List));pTemp->id = GetId();pTemp->name = GetName();pTemp->tel = GetTel();pTemp->next = NULL;return pTemp; }List *GetMyNode() //獲取自我添加數據 {List *pTemp = (List *)malloc(sizeof(List));pTemp->id = GetId();printf("請輸入姓名: ");pTemp->name = GetString();printf("請輸入電話: ");pTemp->tel = GetString();pTemp->next = NULL;return pTemp; }思路:典型的鏈表添加
?
第五個:想一想能不能做一個分頁功能呢,當數據量大的時候利用ws來翻頁,所以我分為三個模塊來實現這個分頁功能,第一個是獲取分頁信息(當前頁碼,總共頁碼數,總共信息數,一頁多少信息數),第二個是遍歷鏈表按每頁多少信息數,來截分,第三個是實現利用w s鍵來翻頁,以及能返回主界面等等功能按鍵
5.Page()
1 Page *GetPage(List *pHead,int OnePageInfo) //獲取頁碼信息 2 { 3 4 Page *pPage = (Page *)malloc(sizeof(Page)); 5 pPage->CurrentPage = 0; 6 pPage->TotalInfo = 0; 7 pPage->OnePageInfo = OnePageInfo; 8 while(pHead) 9 { 10 pPage->TotalInfo++; 11 pHead = pHead->next; 12 } 13 pPage->TotalPage = pPage->TotalInfo%pPage->OnePageInfo == 0 ? pPage->TotalInfo / pPage->OnePageInfo : pPage->TotalInfo / pPage->OnePageInfo + 1; //三目運算符 相當于if-else的簡寫 14 15 return pPage; 16 } 17 void ShowInfo(List *pHead,Page *pPage) //對結點進行截分 18 { 19 int PageBegin = (pPage->CurrentPage - 1) * pPage->OnePageInfo + 1; 20 int PageEnd = (pPage->CurrentPage) * (pPage->OnePageInfo); 21 int InfoNum = 0; 22 while(pHead) 23 { 24 InfoNum++; 25 if(InfoNum >= PageBegin && InfoNum <= PageEnd) 26 printf("%d\t%s\t%s\n",pHead->id,pHead->name,pHead->tel); 27 pHead = pHead->next; 28 } 29 return; 30 31 } 32 void TurnPage(List *pHead,Page *pPage) //利用按鍵進行翻頁以及其他功能 33 { 34 char c = 's'; 35 while(1) 36 { 37 switch(c) 38 { 39 case 's': 40 if(pPage->CurrentPage < pPage->TotalPage) 41 { 42 pPage->CurrentPage++; 43 ShowInfo(pHead,pPage); 44 ShowMenu(pPage); 45 } 46 else 47 { 48 printf("已經是最后一頁了!\n"); 49 ShowMenu(pPage); 50 } 51 break; 52 case 'w': 53 if(pPage->CurrentPage > 1) 54 { 55 pPage->CurrentPage--; 56 ShowInfo(pHead,pPage); 57 ShowMenu(pPage); 58 } 59 else 60 { 61 printf("已經是第一頁了!\n"); 62 ShowMenu(pPage); 63 } 64 break; 65 case 'e': 66 return; 67 break; 68 case 'c': 69 return; 70 break; 71 case 'd': 72 return; 73 break; 74 case 'y': 75 return; 76 break; 77 case 'u': 78 return; 79 break; 80 default: 81 printf("請輸入規定的按鍵!\n"); 82 break; 83 } 84 c = GetKey(); 85 g_Key = c; 86 // getchar(); //清空緩沖區內的\n 87 } 88 }思路:難點在于第一個模塊中確定哪些信息是能直接獲取的,哪些是間接獲得的。也是心血來潮用了一個三目運算符,感覺和if-else沒啥區別,可能是我太菜了,哈哈哈,第二個模塊中結點截獲的開始位置和終止位置的確定也是一個難點,利用已知信息來確定。第三個難點其實就是我找了很長時間bug的那個‘\n’,有興趣的話可以把?c = GetKey(); 直接寫成c = getchar()體驗一下。
?
第六個:添加功能過于簡單就不直接把模塊列出來了,直接在源碼中展示,畫個重點,我覺得最難的部分 查詢功能就要來了
6.Query()
1 void Query(List *pHead) 2 { 3 List *pDel; 4 List *newpHead = NULL; 5 List *newpEnd = NULL; 6 char Choose; 7 char *KeyWord = NULL; 8 List *pNode = NULL; 9 List *pMark = pHead; 10 while(1) 11 { 12 while(1) 13 { 14 printf("請輸入查詢關鍵字: "); 15 KeyWord = GetString(); 16 printf("a.確認 其他鍵.重新輸入\n"); 17 Choose = GetKey(); 18 //switch(Choose) 19 //{ 20 //case 'a': 21 // printf("%s\n",KeyWord); 22 // return; 23 // break; 24 //case 'c': 25 // printf("請重新輸入!\n"); 26 // free(KeyWord); //堆區內存不需要的話就要及時釋放 27 // break; 28 //} 29 if(Choose == 'a') //第二種方法 30 { 31 break; 32 } 33 else 34 { 35 free(KeyWord); //堆區內存不需要的話就要及時釋放 36 KeyWord = NULL; 37 } 38 } 39 pHead = pMark; 40 while(pHead) 41 { 42 if(!strncmp(pHead->name,KeyWord,strlen(KeyWord)) || !strncmp(pHead->tel,KeyWord,strlen(KeyWord))) //輸入的長度可以用字符串長度 43 { 44 pNode = (List *)malloc(sizeof(List)); //創建一個新的鏈表 用現成的接口和函數進行調用 45 pNode->id = pHead->id; 46 pNode->name = pHead->name; 47 pNode->tel = pHead->tel; 48 pNode->next = NULL; 49 AddNode(&newpHead,&newpEnd,pNode); 50 } 51 pHead = pHead->next; 52 } 53 Browse(newpHead); 54 while(newpHead) //清除之前所有的結點 55 { 56 pDel = newpHead; 57 newpHead = newpHead->next; 58 free(pDel); 59 pDel = NULL; 60 } 61 if('e' == g_Key || 'd' == g_Key || 'u' == g_Key) 62 { 63 return; 64 } 65 } 66 }思路:我想做一個前綴模糊查詢,難點在于1.多個功能按鍵的嵌套 2.如何加入按鍵 3.查詢后的信息如何在遍歷呢,解決如下1.我也做了嘗試發現switch的話一個case里需要加很多東西,就用if-else代替了,意外發現效果還不錯,2.利用已有的獲取菜單里的模塊 加入按鍵,并且設一個全局變量,能在不同模塊下都有不一樣的菜單 3.這個我也是思考了很久,決定重新創建一個鏈表,專門存查找的信息,并且為了養成好滴習慣,堆區不用的空間,立馬及時的清理干凈。
接下來的修改和刪除功能就很簡單了,總結起來就是 不要造成內存浪費,記得一級和二級指針的區別,其他的和查詢就很像啦
?
接下來直接上源碼了
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<time.h> 4 #include<string.h> 5 typedef struct NODE 6 { 7 int id; 8 char *name; 9 char *tel; 10 struct NODE *next; 11 }List; 12 typedef struct PAGE 13 { 14 int CurrentPage; //當前頁數 15 int TotalPage; //總頁數 16 int TotalInfo; //總條數 17 int OnePageInfo; //每頁多少條 18 }Page; 19 int GetId(); 20 char *GetName(); 21 char *GetTel(); 22 List *GetNode(); 23 List *GetMyNode(); 24 void AddNode(List **ppHead,List **ppEnd,List *pNode); //添加通訊錄信息 25 void InitInfo(List **ppHead,List **ppEnd,int n); //初始化數據 26 Page *GetPage(List *pHead,int OnePageInfo); //獲得頁碼信息 27 void ShowInfo(List *pHead,Page *pPage); //展示當前頁信息 28 void TurnPage(List *pHead,Page *pPage); //翻頁功能 29 char GetKey(); //獲得按鍵,將緩沖區內的\n給排除掉 30 void Browse(List *pHead); //瀏覽通訊錄信息 31 void ShowMenu(Page *pPage); //頁碼信息顯示 32 char *GetString(); //獲取字符串(scanf()函數無法給指針賦值) 33 void AddMessage(List **ppHead,List **ppEnd); //添加通訊錄信息功能 34 void Query(List *pHead); //查詢功能 35 void DeleteInfo(List **ppHead,List **ppEnd); //刪除通訊錄信息功能 36 void DeleteNode(List **ppHead,List **ppEnd,int id); //刪除結點模塊 37 void UpDataInfo(List *pHead); //修改通訊錄信息功能 38 int g_MenuType; //全局變量以g_開頭 39 char g_Key; //判斷是否為b 40 int main() 41 { 42 char c; 43 List *pHead = NULL; 44 List *pEnd = NULL; 45 InitInfo(&pHead,&pEnd,10); 46 while(1) 47 { 48 printf("1.查看通訊錄\n"); 49 printf("2.添加信息\n"); 50 printf("3.查詢信息\n"); 51 printf("4.刪除信息\n"); 52 printf("5.修改信息\n"); 53 printf("q.退出\n"); 54 c = GetKey(); 55 switch(c) 56 { 57 case '1': 58 g_MenuType = 1; 59 Browse(pHead); 60 break; 61 case '2': 62 AddMessage(&pHead,&pEnd); 63 break; 64 case '3': 65 g_MenuType = 3; 66 Query(pHead); 67 break; 68 case '4': 69 g_MenuType = 4; 70 DeleteInfo(&pHead,&pEnd); 71 break; 72 case '5': 73 g_MenuType = 5; 74 UpDataInfo(pHead); 75 break; 76 case 'q': 77 return 0; 78 break; 79 } 80 } 81 return 0; 82 } 83 int GetId() 84 { 85 static int id = 0; 86 id++; 87 return id; 88 } 89 char *GetName() //隨機分配姓名 90 { 91 char *pname = (char *)malloc(6); 92 int i; 93 for(i = 0;i < 5;i++) 94 { 95 pname[i] = rand()%26 + 'a'; 96 } 97 pname[i] = '\0'; 98 99 return pname; 100 } 101 char *GetTel() //隨機分配電話號碼 102 { 103 char *ptel = (char *)malloc(12); 104 int i; 105 int num = rand()%4+1; 106 switch(num) 107 { 108 case 1: 109 strcpy_s(ptel,12,"132"); 110 break; 111 case 2: 112 strcpy_s(ptel,12,"157"); 113 break; 114 case 3: 115 strcpy_s(ptel,12,"188"); 116 break; 117 default: 118 strcpy_s(ptel,12,"150"); 119 break; 120 } 121 for(i = 3;i < 11;i++) 122 { 123 ptel[i] = rand()%10 + '0'; 124 } 125 ptel[i] = '\0'; 126 127 return ptel; 128 } 129 List *GetNode() 130 { 131 List *pTemp = (List *)malloc(sizeof(List)); 132 pTemp->id = GetId(); 133 pTemp->name = GetName(); 134 pTemp->tel = GetTel(); 135 pTemp->next = NULL; 136 137 return pTemp; 138 } 139 List *GetMyNode() 140 { 141 List *pTemp = (List *)malloc(sizeof(List)); 142 pTemp->id = GetId(); 143 printf("請輸入姓名: "); 144 pTemp->name = GetString(); 145 printf("請輸入電話: "); 146 pTemp->tel = GetString(); 147 pTemp->next = NULL; 148 149 150 return pTemp; 151 } 152 void AddNode(List **ppHead,List **ppEnd,List *pNode) 153 { 154 if(*ppHead == NULL) 155 { 156 *ppHead = pNode; 157 } 158 else 159 { 160 (*ppEnd)->next = pNode; 161 } 162 *ppEnd = pNode; 163 164 return; 165 } 166 void InitInfo(List **ppHead,List **ppEnd,int n) 167 { 168 int i; 169 srand((unsigned int)time(NULL)); 170 for(i = 0;i < n;i++) 171 { 172 AddNode(ppHead,ppEnd,GetNode()); 173 } 174 175 } 176 Page *GetPage(List *pHead,int OnePageInfo) 177 { 178 179 Page *pPage = (Page *)malloc(sizeof(Page)); 180 pPage->CurrentPage = 0; 181 pPage->TotalInfo = 0; 182 pPage->OnePageInfo = OnePageInfo; 183 while(pHead) 184 { 185 pPage->TotalInfo++; 186 pHead = pHead->next; 187 } 188 pPage->TotalPage = pPage->TotalInfo%pPage->OnePageInfo == 0 ? pPage->TotalInfo / pPage->OnePageInfo : pPage->TotalInfo / pPage->OnePageInfo + 1; //三目運算符 相當于if-else的簡寫 189 190 return pPage; 191 } 192 void ShowInfo(List *pHead,Page *pPage) 193 { 194 int PageBegin = (pPage->CurrentPage - 1) * pPage->OnePageInfo + 1; 195 int PageEnd = (pPage->CurrentPage) * (pPage->OnePageInfo); 196 int InfoNum = 0; 197 while(pHead) 198 { 199 InfoNum++; 200 if(InfoNum >= PageBegin && InfoNum <= PageEnd) 201 printf("%d\t%s\t%s\n",pHead->id,pHead->name,pHead->tel); 202 pHead = pHead->next; 203 } 204 return; 205 206 } 207 void TurnPage(List *pHead,Page *pPage) 208 { 209 char c = 's'; 210 while(1) 211 { 212 switch(c) 213 { 214 case 's': 215 if(pPage->CurrentPage < pPage->TotalPage) 216 { 217 pPage->CurrentPage++; 218 ShowInfo(pHead,pPage); 219 ShowMenu(pPage); 220 } 221 else 222 { 223 printf("已經是最后一頁了!\n"); 224 ShowMenu(pPage); 225 } 226 break; 227 case 'w': 228 if(pPage->CurrentPage > 1) 229 { 230 pPage->CurrentPage--; 231 ShowInfo(pHead,pPage); 232 ShowMenu(pPage); 233 } 234 else 235 { 236 printf("已經是第一頁了!\n"); 237 ShowMenu(pPage); 238 } 239 break; 240 case 'e': 241 return; 242 break; 243 case 'c': 244 return; 245 break; 246 case 'd': 247 return; 248 break; 249 case 'y': 250 return; 251 break; 252 case 'u': 253 return; 254 break; 255 default: 256 printf("請輸入規定的按鍵!\n"); 257 break; 258 } 259 c = GetKey(); 260 g_Key = c; 261 // getchar(); //清空緩沖區內的\n 262 } 263 } 264 char GetKey() 265 { 266 char c; 267 char z = '!'; 268 int flag = 1; 269 while((c=getchar()) != '\n' || 1 == flag) //考慮了\n在之前的情況 270 { 271 z = c; 272 flag = 0; 273 } 274 return z; 275 } 276 void Browse(List *pHead) 277 { 278 Page *pPage = GetPage(pHead,5); 279 TurnPage(pHead,pPage); 280 } 281 void ShowMenu(Page *pPage) 282 { 283 switch(g_MenuType) 284 { 285 case 1: 286 printf("當前%d頁 共%d頁 共%d條 w上一頁\ts下一頁\te返回\n",pPage->CurrentPage,pPage->TotalPage,pPage->TotalInfo); 287 break; 288 case 3: 289 printf("當前%d頁 共%d頁 共%d條 w上一頁\ts下一頁\tc重新查詢\te返回\n",pPage->CurrentPage,pPage->TotalPage,pPage->TotalInfo); 290 break; 291 case 4: 292 printf("當前%d頁 共%d頁 共%d條 w上一頁\ts下一頁\td刪除信息\te返回\n",pPage->CurrentPage,pPage->TotalPage,pPage->TotalInfo); 293 break; 294 case 5: 295 printf("當前%d頁 共%d頁 共%d條 w上一頁\ts下一頁\tu修改信息\te返回\n",pPage->CurrentPage,pPage->TotalPage,pPage->TotalInfo); 296 break; 297 } 298 299 300 } 301 char *GetString() 302 { 303 int size = 5; 304 int count = 0; 305 char *str = (char *)malloc(size); 306 char *pMark = str; 307 char *newstr = NULL; 308 char c; 309 while((c = getchar()) != '\n') 310 { 311 *str = c; 312 str++; 313 count++; 314 if(count + 1 == size) 315 { 316 *str = '\0'; 317 size += 5; 318 newstr = (char *)malloc(size); 319 strcpy_s(newstr,size,pMark); 320 free(pMark); 321 pMark = newstr; 322 str = newstr + count; 323 } 324 } 325 *str = '\0'; 326 327 return pMark; 328 } 329 void AddMessage(List **ppHead,List **ppEnd) 330 { 331 List *pNode = GetMyNode(); 332 AddNode(ppHead,ppEnd,pNode); 333 } 334 void Query(List *pHead) 335 { 336 List *pDel; 337 List *newpHead = NULL; 338 List *newpEnd = NULL; 339 char Choose; 340 char *KeyWord = NULL; 341 List *pNode = NULL; 342 List *pMark = pHead; 343 while(1) 344 { 345 while(1) 346 { 347 printf("請輸入查詢關鍵字: "); 348 KeyWord = GetString(); 349 printf("a.確認 其他鍵.重新輸入\n"); 350 Choose = GetKey(); 351 //switch(Choose) 352 //{ 353 //case 'a': 354 // printf("%s\n",KeyWord); 355 // return; 356 // break; 357 //case 'c': 358 // printf("請重新輸入!\n"); 359 // free(KeyWord); //堆區內存不需要的話就要及時釋放 360 // break; 361 //} //第一種方法 用switch去選擇按鍵 362 if(Choose == 'a') //第二種方法 363 { 364 break; 365 } 366 else 367 { 368 free(KeyWord); //堆區內存不需要的話就要及時釋放 369 KeyWord = NULL; 370 } 371 } 372 pHead = pMark; 373 while(pHead) 374 { 375 if(!strncmp(pHead->name,KeyWord,strlen(KeyWord)) || !strncmp(pHead->tel,KeyWord,strlen(KeyWord))) //輸入的長度可以用字符串長度 376 { 377 pNode = (List *)malloc(sizeof(List)); //創建一個新的鏈表 用現成的接口和函數進行調用 378 pNode->id = pHead->id; 379 pNode->name = pHead->name; 380 pNode->tel = pHead->tel; 381 pNode->next = NULL; 382 AddNode(&newpHead,&newpEnd,pNode); 383 } 384 pHead = pHead->next; 385 } 386 Browse(newpHead); 387 while(newpHead) //清除之前所有的結點 388 { 389 pDel = newpHead; 390 newpHead = newpHead->next; 391 free(pDel); 392 pDel = NULL; 393 } 394 if('e' == g_Key || 'd' == g_Key || 'u' == g_Key) 395 { 396 return; 397 } 398 } 399 } 400 void DeleteNode(List **ppHead,List **ppEnd,int id) 401 { 402 List *pDel = NULL; 403 List *pMov = *ppHead; 404 if((*ppHead)->id == id) 405 { 406 pDel = *ppHead; 407 *ppHead = (*ppHead)->next; 408 free(pDel->name); 409 free(pDel->tel); 410 free(pDel); 411 pDel = NULL; 412 printf("刪除成功!\n"); 413 return; 414 } 415 if(pMov->next) 416 { 417 if(pMov->next->id == id) 418 { 419 if(pMov->next == *ppEnd) 420 { 421 pDel = *ppEnd; 422 *ppEnd = pMov; 423 (*ppEnd)->next = NULL; 424 } 425 else 426 { 427 pDel = pMov->next; 428 pMov->next = pMov->next->next; 429 } 430 free(pDel->name); 431 free(pDel->tel); 432 free(pDel); 433 pDel = NULL; 434 printf("刪除成功!\n"); 435 return; 436 } 437 pMov = pMov->next; 438 } 439 } 440 void DeleteInfo(List **ppHead,List **ppEnd) 441 { 442 int i; 443 while(1) 444 { 445 Query(*ppHead); 446 if('e'==g_Key) 447 { 448 break; 449 } 450 printf("請輸入要刪除的編號: "); 451 scanf("%d",&i); 452 DeleteNode(ppHead,ppEnd,i); 453 printf("y.繼續刪除 其他鍵返回\n"); 454 if(GetKey() != 'y') 455 { 456 break; 457 } 458 } 459 } 460 void UpDataInfo(List *pHead) 461 { 462 char *str = NULL; 463 int id; 464 while(1) 465 { 466 Query(pHead); 467 if('e'==g_Key) 468 { 469 break; 470 } 471 printf("請輸入修改的編號: "); 472 scanf("%d",&id); //用getchar()清除緩沖區內信息 473 getchar(); 474 while(pHead) 475 { 476 if(pHead->id == id) 477 { 478 printf("請修改姓名: "); 479 str = GetString(); 480 if(strlen(str) > 0) 481 { 482 free(pHead->name); 483 pHead->name = str; 484 } 485 printf("請修改電話號: "); 486 str = GetString(); 487 if(strlen(str) > 0) 488 { 489 free(pHead->tel); 490 pHead->tel = str; 491 } 492 return; 493 } 494 pHead = pHead->next; 495 } 496 } 497 }?
?
2019-04-28?23:37:16? 編程小菜雞自我反省,大佬勿噴,謝謝!!!
?
轉載于:https://www.cnblogs.com/xgmzhna/p/10787796.html
總結
以上是生活随笔為你收集整理的c语言小项目---通讯录2.0的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: keycloak 调研资料
- 下一篇: 【转】Linux将composer的bi