程序思維導圖

代碼表示(代碼參考:長春大學-牛言濤老師)
如有錯誤請指出歡迎交流
1 #include<stdio.h> 2 #include<malloc.h>//動態存儲分配函數頭文件 3 #include<math.h>//包含數學函數的文件 4 #include<string.h>//一個和字符串處理相關的頭文件 5 #include<process.h>//包含用於和宏指令的作用聲明與螺紋和過程一起使用的C標頭文件 6 #define ERROR 0 //宏定義 7 #define OK 1 8 #define over -2 9 #define ListInitSize 20 10 #define ListIncrement 5 11 #define Namelen 8 12 #define Majorlen 20 13 #define INIT_N 3 14 typedef int Status; //自定義類型語句 Status i 等價於 int i 15 typedef char StatusC; 16 17 typedef struct{ 18 StatusC number[10]; //學號:081330385 19 StatusC name[Namelen+1]; //姓名:郭靖 20 StatusC gender; //性別:男 21 StatusC telephone[12]; //電話:15890377853 22 StatusC qqNumber[13]; //QQ:485284320 23 StatusC major[Majorlen+1];//專業:計算機科學與技術 24 25 }Student;//類型為學生 26 27 typedef struct{ 28 29 Student *elem; //存儲空間的基址 30 Status length; //當前長度 31 Status listsize; //當前分配的存儲容量(以sizeof(Studnet)為單位) 32 }Sqlist; 33 34 //信息初始化,構造一個空的線性表 35 Status InitList(Sqlist &l){ 36 37 l.elem=(Student *)malloc(ListInitSize*sizeof(Student)); 38 //申請LIST_INIT_SIZE個大小為整型(Student)字節的空間, 39 //把空間指針給L.elem 40 if(!l.elem)exit(over); 41 //判斷l中的數據成員elem是否為0,為0即執行if下面語句 42 l.length=0; 43 //賦值 44 l.listsize=ListInitSize; 45 return OK; 46 } 47 48 //插入記錄 49 Status ListInsert(Sqlist &l,Status i,Student s){ 50 51 Student *newbase; 52 if(i<1||i>l.length+1) 53 return ERROR;//i值不合法 54 if(l.length>=l.listsize)//當前存儲空間已經滿了,增加分配空間 55 { 56 newbase=(Student*)realloc(l.elem,( 57 ListInitSize+ListIncrement)*(sizeof(Student))); 58 /* 59 先釋放原來L.elem所指內存區域,並按照 60 (LIST_INIT_SIZE+ListIncrement)*sizeof(Student) 61 的大小重新分配空間其中ListIncrement為20, 62 同時將原有數據從頭到尾拷貝到新分配的內存區域, 63 並返回該內存區域的首地址。即重新分配存儲器塊。 64 */ 65 if(!newbase)exit(over); 66 // 判斷newbase是否為0,為0即執行if下面語句 67 l.elem=newbase; 68 //賦值 69 l.listsize+=ListIncrement; 70 } 71 for(Status j=l.length;j>=i;j--) 72 l.elem[j]=l.elem[j-1]; 73 //賦值 74 l.elem[i-1]=s; 75 l.length++; 76 return OK; 77 } 78 79 //打印輸出線性表中的信息 80 void print(Sqlist &l){ 81 82 if(l.length==0) 83 printf("空表,無任何記錄!\n\n"); 84 printf("學號 姓名 性別 手機號 QQ 專業\n"); 85 printf("******************************\n"); 86 87 for(Status i=0;i<l.length;i++){ 88 89 printf("%-10s %-8s",l.elem[i].number,l.elem[i].name); 90 //輸出學好 姓名 91 if(l.elem[i].gender=='m')printf("男"); 92 //判斷語句 93 else printf("女"); 94 printf("%14s %9s %10s",l.elem[i].telephone,l.elem[i].qqNumber,l.elem[i].major); 95 //輸出電話號碼 qq號碼 專業 96 printf("\n"); 97 } 98 printf("------------------------------\n"); 99 } 100 101 //打印輸出線性表中指定學生的信息 102 void print_single(Student s){ 103 104 printf("學號 姓名 性別 手機號 QQ 專業\n"); 105 printf("******************************\n"); 106 printf("%-10s %-8s",s.number,s.name); 107 //輸出學好 姓名 108 if(s.gender=='m')printf("男"); 109 else printf("女"); 110 printf("%14s %9s %10s",s.telephone,s.qqNumber,s.major); 111 //輸出電話號碼 qq號碼 專業 112 printf("\n"); 113 printf("------------------------------\n"); 114 } 115 116 //接受鍵盤輸入信息 117 void ScanIn(Sqlist &l){ 118 119 StatusC a[2]; 120 Status i; 121 printf("\t 您選擇插入一條學生記錄\n"); 122 do{ 123 Student s; 124 printf("\t 請輸入學號:"); 125 scanf("%s",s.number); 126 printf("\t 請輸入姓名(<=%d個字符):",Namelen); 127 scanf("%s",s.name); 128 129 printf("\t 請輸入電話號碼:"); 130 scanf("%s",s.telephone); 131 printf("\t 請輸入QQ號:"); 132 scanf("%s",s.qqNumber); 133 printf("\t 請輸入專業:"); 134 scanf("%s",s.major); 135 printf("\t 請輸入性別:(m:男,f:女)"); 136 scanf("%*c%c",&s.gender); 137 printf("\t 請輸入你要插入的位置(1<=i<=%d):",l.length+1); 138 scanf("%d",&i); 139 ListInsert(l,i,s); 140 printf("\t 您想繼續插入記錄嗎?(y/n)\t"); 141 scanf("%s",a); 142 143 }while(strcmp(a,"y")==0||strcmp(a,"Y")==0); 144 //調用strcmp函數 145 } 146 147 //刪除通訊中第i條記錄 148 Status ListDelete(Sqlist &l,int i,Student s){ 149 150 Status j; 151 if(i<1||i>l.length)return ERROR; 152 //判斷 153 else{ 154 155 s=l.elem[i-1]; 156 for(j=i;j<=l.length;j++)l.elem[j-1]=l.elem[j]; 157 l.length--; 158 return OK; 159 } 160 } 161 162 //按照升序排列 163 void SortorderAscend(Sqlist &l){ 164 165 system("cls");//清空前面的信息之輸出下面信息 166 Student s; 167 for(Status i=0;i<l.length-1;i++) 168 for(Status j=0;j<l.length-i-1;j++){ 169 //循環比較大小 ,排列順序 170 if(strcmp(l.elem[j].number,l.elem[j+1].number)>0){ 171 //strcmp() 以二進制的方式進行比較,不會考慮多字節或寬字節字符; 172 //用來比較字符串(區分大小寫) 173 s=l.elem[j]; 174 l.elem[j]=l.elem[j+1]; 175 l.elem[j+1]=s; 176 } 177 } 178 printf("*****按照升序排序成功!******\n\n"); 179 } 180 181 //判斷姓名是否相同 182 Status EqualName(Student s1,Student s2){ 183 184 if(strcmp(s1.name,s2.name))return ERROR; 185 //比較兩個字符串是否相同 186 else return OK; 187 } 188 189 //定位某個元素 190 int LocateElem(Sqlist l,Student s,Status(*compare)(Student,Student)) { 191 192 Status i=1; 193 Student *p=l.elem; 194 while(i<=l.length&&!compare(*p++,s))i++; 195 if(i<=l.length) 196 return i; 197 //定位元素的位置 198 else 199 return 0; 200 } 201 202 //按照姓名查找 203 void searchName(Sqlist l,Status(*equal)(Student,Student)){ 204 205 system("cls");//清空前面的信息之輸出下面信息 206 Student s; 207 Status j; 208 StatusC a[2]; 209 do{ 210 printf("\t 請輸入你要查找的學生的姓名:"); 211 scanf("%s",s.name); 212 j=LocateElem(l,s,equal); 213 if(!j)printf("沒有查找到你所要查找的學生記錄!\n"); 214 else print_single(l.elem[j-1]); 215 printf("\t 您想繼續查找嗎?(y/n)\t"); 216 scanf("%s",a); 217 218 }while(strcmp(a,"y")==0||strcmp(a,"Y")==0); 219 } 220 221 //修改姓名 222 void ModifyName(Sqlist &l,Status(*equal)(Student,Student)){ 223 224 system("cls");//清空前面的信息之輸出下面信息 225 Student s; 226 Status j; 227 StatusC number_new[10],name_new[Namelen+1],gender_new, 228 telephone_new[12],qqNumber_new[13],major_new[Majorlen+1]; 229 StatusC a[2]; 230 do{ 231 printf("\t 請輸入你要更改的學生的姓名:"); 232 scanf("%s",s.name); 233 j=LocateElem(l,s,equal); 234 if(!j)printf("沒有查找到你所要查找的學生記錄!\n"); 235 else { 236 237 print_single(l.elem[j-1]); 238 Status isOrNo=1; 239 printf("\n修改通訊錄:1 學號,2 姓名,3 性別,4 電話,5 QQ號,6 專業, 0 取消\n") ; 240 while(isOrNo){ 241 242 printf("--------------------------\n"); 243 printf("請選擇需要修改的屬性序號:"); 244 scanf("%d",&isOrNo); 245 switch(isOrNo){ 246 247 case 1: 248 printf("請輸入更改后的學號:"); 249 scanf("%s",number_new); 250 strcpy(l.elem[j-1].number,number_new); 251 break; 252 case 2: 253 printf("請輸入更改后的姓名:"); 254 scanf("%s",name_new); 255 strcpy(l.elem[j-1].name,name_new); 256 break; 257 case 3: 258 printf("請輸入更改后的性別:"); 259 scanf("%*c%c",&l.elem[j-1].gender); 260 break; 261 case 4: 262 printf("請輸入更改后的電話:"); 263 scanf("%s",telephone_new); 264 strcpy(l.elem[j-1].telephone,telephone_new); 265 break; 266 case 5: 267 printf("請輸入更改后的QQ號:"); 268 scanf("%s",qqNumber_new); 269 strcpy(l.elem[j-1].qqNumber,qqNumber_new); 270 break; 271 case 6: 272 printf("請輸入更改后的專業:"); 273 scanf("%s",major_new); 274 strcpy(l.elem[j-1].major,major_new); 275 break; 276 277 } 278 } 279 printf("\n****更改后該條記錄變為****\n\n"); 280 print_single(l.elem[j-1]); 281 } 282 printf("您想繼續修改嗎?(y/n)\t"); 283 scanf("%s",a); 284 }while(strcmp(a,"y")==0||strcmp(a,"Y")==0); 285 } 286 287 //主菜單 288 void menu(){ 289 290 system("cls");//清空前面的信息之輸出下面信息 291 printf("\t*********************\n"); 292 printf("\t**歡迎使用學生通訊錄管理系統**\n"); 293 printf("\t*********************\n"); 294 printf("\t**請選擇如下操作,輸入序號**\n"); 295 printf("\t 0:退出系統\n"); 296 printf("\t 1:將初始學生記錄插入線性表\n"); 297 printf("\t 2:顯示線性表中所有內容\n"); 298 printf("\t 3:向線性表中增加一條記錄\n"); 299 printf("\t 4:從線性表中刪除一條記錄\n"); 300 printf("\t 5:按照姓名修改一條記錄\n"); 301 printf("\t 6:按照姓名查找一條記錄\n"); 302 printf("\t 7:按照學號升序排列通訊錄\n"); 303 printf("\t*********************\n"); 304 printf("\t 您想進行什么操作,請選擇\n"); 305 306 } 307 308 //主函數 309 int main(){ 310 311 Sqlist l; 312 Status i,select; //select 變量標記用戶的選擇 313 if(InitList(l)!=OK)printf("\n\t線性表初始化失敗!\n"); 314 Student s[INIT_N]={{"081404327","馬東",'m',"13729947569","87384747" ,"機械工程"}, 315 {"081404527","李東",'m',"13729985469","84786747" ,"軟件工程"}, 316 {"081435797","馬西",'f',"12329947569","84735777" ,"通訊工程"}}; 317 menu(); 318 scanf("%d",&select); 319 while(select){ 320 switch(select){ 321 case 1: //初始化數據 322 system("cls");//清空前面的信息之輸出下面信息 323 for(i=0;i<INIT_N;i++){ 324 325 if(ListInsert(l,i+1,s[i])!=OK) 326 printf("\t初始化數據失敗!\n"); 327 328 } 329 if(i==INIT_N)printf("\t初始化數據成功\n\n"); 330 print(l); 331 printf("\n輸入0:退出,輸入11:返回主菜單\t"); 332 break; 333 case 2://顯示線性表中的記錄 334 system("cls");//清空前面的信息之輸出下面信息 335 print(l); 336 printf("\n輸入0:退出,輸入11:返回主菜單\t"); 337 break; 338 case 3://接受鍵盤輸入,並把記錄插入到線性表中 339 system("cls");//清空前面的信息之輸出下面信息 340 ScanIn(l); 341 system("cls");//清空前面的信息之輸出下面信息 342 print(l); 343 printf("\n輸入0:退出,輸入11:返回主菜單\t"); 344 break; 345 case 4://刪除通訊錄中某條信息 346 system("cls");//清空前面的信息之輸出下面信息 347 Student *s2=l.elem; 348 print(l); 349 printf("您想刪除第幾條通訊錄1~%d:\n",l.length); 350 int k; 351 scanf("%d",&k); 352 Student de_s; 353 system("cls");//清空前面的信息之輸出下面信息 354 if(ListDelete(l,k,de_s)==OK){ 355 print(l); 356 printf("\t%-6s 已經刪除成功!\n",de_s.name); 357 } 358 printf("\n輸入0:退出,輸入11:返回主菜單\t"); 359 break; 360 case 5://按照姓名修改一條記錄 361 ModifyName(l,EqualName); 362 printf("\n輸入0:退出,輸入11:返回主菜單\t"); 363 break; 364 case 6://按照姓名查找記錄 365 searchName(l,EqualName); 366 printf("\n輸入0:退出,輸入11:返回主菜單\t"); 367 break; 368 case 7://按照學好升序排列 369 system("cls");//清空前面的信息之輸出下面信息 370 SortorderAscend(l); 371 print(l); 372 printf("\n輸入0:退出,輸入11:返回主菜單\t"); 373 break; 374 case 11://返回主菜單 375 menu(); 376 break; 377 } 378 scanf("%d",&select); 379 } 380 return 0; 381 382 383 }
結果顯示
主菜單

將初始學生信息插入線性表中

讀取線性表中信息

插入一條學生信息

刪除一條學生信息

更改學生信息

查找學生信息

將學生信息排序

