1 #include
2 #include//动态存储分配函数头文件
3 #include//包含数学函数的文件
4 #include//一个和字符串处理相关的头文件
5 #include//包含用于和宏指令的作用声明与螺纹和过程一起使用的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 charStatusC;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 returnOK;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 returnOK;77 }78
79 //打印输出线性表中的信息
80 void print(Sqlist &l){81
82 if(l.length==0)83 printf("空表,无任何记录!");84 printf("学号 姓名 性别 手机号 QQ 专业");85 printf("******************************");86
87 for(Status i=0;i
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("");97 }98 printf("------------------------------");99 }100
101 //打印输出线性表中指定学生的信息
102 voidprint_single(Student s){103
104 printf("学号 姓名 性别 手机号 QQ 专业");105 printf("******************************");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("");113 printf("------------------------------");114 }115
116 //接受键盘输入信息
117 void ScanIn(Sqlist &l){118
119 StatusC a[2];120 Status i;121 printf("您选择插入一条学生记录");122 do{123 Student s;124 printf("请输入学号:");125 scanf("%s",s.number);126 printf("请输入姓名(<=%d个字符):",Namelen);127 scanf("%s",s.name);128
129 printf("请输入电话号码:");130 scanf("%s",s.telephone);131 printf("请输入QQ号:");132 scanf("%s",s.qqNumber);133 printf("请输入专业:");134 scanf("%s",s.major);135 printf("请输入性别:(m:男,f:女)");136 scanf("%*c%c",&s.gender);137 printf("请输入你要插入的位置(1<=i<=%d):",l.length+1);138 scanf("%d",&i);139 ListInsert(l,i,s);140 printf("您想继续插入记录吗?(y/n)");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,inti,Student s){149
150 Status j;151 if(i<1||i>l.length)returnERROR;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 returnOK;159 }160 }161
162 //按照升序排列
163 void SortorderAscend(Sqlist &l){164
165 system("cls");//清空前面的信息之输出下面信息
166 Student s;167 for(Status i=0;i
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("*****按照升序排序成功!******");179 }180
181 //判断姓名是否相同
182 Status EqualName(Student s1,Student s2){183
184 if(strcmp(s1.name,s2.name))returnERROR;185 //比较两个字符串是否相同
186 else returnOK;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 returni;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("请输入你要查找的学生的姓名:");211 scanf("%s",s.name);212 j=LocateElem(l,s,equal);213 if(!j)printf("没有查找到你所要查找的学生记录!");214 else print_single(l.elem[j-1]);215 printf("您想继续查找吗?(y/n)");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("请输入你要更改的学生的姓名:");232 scanf("%s",s.name);233 j=LocateElem(l,s,equal);234 if(!j)printf("没有查找到你所要查找的学生记录!");235 else{236
237 print_single(l.elem[j-1]);238 Status isOrNo=1;239 printf("修改通讯录:1 学号,2 姓名,3 性别,4 电话,5 QQ号,6 专业, 0 取消") ;240 while(isOrNo){241
242 printf("--------------------------");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("****更改后该条记录变为****");280 print_single(l.elem[j-1]);281 }282 printf("您想继续修改吗?(y/n)");283 scanf("%s",a);284 }while(strcmp(a,"y")==0||strcmp(a,"Y")==0);285 }286
287 //主菜单
288 voidmenu(){289
290 system("cls");//清空前面的信息之输出下面信息
291 printf("*********************");292 printf("**欢迎使用学生通讯录管理系统**");293 printf("*********************");294 printf("**请选择如下操作,输入序号**");295 printf("0:退出系统");296 printf("1:将初始学生记录插入线性表");297 printf("2:显示线性表中所有内容");298 printf("3:向线性表中增加一条记录");299 printf("4:从线性表中删除一条记录");300 printf("5:按照姓名修改一条记录");301 printf("6:按照姓名查找一条记录");302 printf("7:按照学号升序排列通讯录");303 printf("*********************");304 printf("您想进行什么操作,请选择");305
306 }307
308 //主函数
309 intmain(){310
311 Sqlist l;312 Status i,select; //select 变量标记用户的选择
313 if(InitList(l)!=OK)printf("线性表初始化失败!");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
325 if(ListInsert(l,i+1,s[i])!=OK)326 printf("初始化数据失败!");327
328 }329 if(i==INIT_N)printf("初始化数据成功");330 print(l);331 printf("输入0:退出,输入11:返回主菜单");332 break;333 case 2://显示线性表中的记录
334 system("cls");//清空前面的信息之输出下面信息
335 print(l);336 printf("输入0:退出,输入11:返回主菜单");337 break;338 case 3://接受键盘输入,并把记录插入到线性表中
339 system("cls");//清空前面的信息之输出下面信息
340 ScanIn(l);341 system("cls");//清空前面的信息之输出下面信息
342 print(l);343 printf("输入0:退出,输入11:返回主菜单");344 break;345 case 4://删除通讯录中某条信息
346 system("cls");//清空前面的信息之输出下面信息
347 Student *s2=l.elem;348 print(l);349 printf("您想删除第几条通讯录1~%d:",l.length);350 intk;351 scanf("%d",&k);352 Student de_s;353 system("cls");//清空前面的信息之输出下面信息
354 if(ListDelete(l,k,de_s)==OK){355 print(l);356 printf("%-6s 已经删除成功!",de_s.name);357 }358 printf("输入0:退出,输入11:返回主菜单");359 break;360 case 5://按照姓名修改一条记录
361 ModifyName(l,EqualName);362 printf("输入0:退出,输入11:返回主菜单");363 break;364 case 6://按照姓名查找记录
365 searchName(l,EqualName);366 printf("输入0:退出,输入11:返回主菜单");367 break;368 case 7://按照学好升序排列
369 system("cls");//清空前面的信息之输出下面信息
370 SortorderAscend(l);371 print(l);372 printf("输入0:退出,输入11:返回主菜单");373 break;374 case 11://返回主菜单
375 menu();376 break;377 }378 scanf("%d",&select);379 }380 return 0;381
382
383 }