1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 /* 5 一个小项目,学生管理 6 核心思想:初始化文件,读文件生成链表,插入节点,退出时将链表data域写入文件保存,用文件当做数据库。 7 8 第一步:实现总目标(菜单):1>.初始化数据 2>.添加学生信息 3>.查找学生信息 4>.删除学生信息 5>.修改学生信息 6>.排序 7>.退出 9 10 第二步:逐一实现单个目标 11 1>.初始化数据。创建初始的数据,读文件生成链表。 12 2>.添加学生信息。创建结点插入链表实现添加学生信息 13 3>.查找学生信息。遍历链表查找学生,并且显示学生所有信息 14 4>.删除学生信息。遍历链表找到结点,然后找到该结点前区,删除该结点 15 5>.修改学生信息。遍历链表找到结点,然后修改结点的data域 16 6>.排序。此处排序依据每门功课的成绩排序 17 7>.退出程序。退出时将链表的data域写入文件保存。 18 */ 19 typedef struct student 20 { 21 int num; 22 char name[30]; 23 char sex; 24 float math; 25 float chinese; 26 float english; 27 // float phy; 28 // float chem; 29 // float sport; 30 }STU; 31 typedef struct node 32 { 33 STU data; 34 struct node * next; 35 }NODE; 36 //初始化 37 void init() 38 { 39 STU stu[] = { 40 {1001,"张三",'x',100,100,100}, 41 {1002,"李四",'x',100,100,100}, 42 {1003,"王麻子",'x',100,100,100} 43 }; 44 45 FILE * fp = fopen("stu.data","wb+"); 46 //一次将初始化数据全部写入文件 47 fwrite((void *)stu,sizeof(stu),1,fp); 48 49 //查看初始化数据 50 /* rewind(fp); 51 52 STU Stu; 53 while(fread((void *)&Stu,sizeof(STU),1,fp) >0 ) 54 { 55 printf("num = %d name = %s sex = %c math = %0.2f chinese =%0.2f english =%0.2f", 56 Stu.num,Stu.name,Stu.sex,Stu.math,Stu.chinese,Stu.english); 57 putchar(10); 58 } 59 */ 60 fclose(fp); 61 } 62 //读文件生成链表 63 NODE * createList() 64 { 65 NODE *head = (NODE *)malloc(sizeof(NODE)); 66 head->next = NULL; 67 68 FILE *fp = fopen("stu.data","rb"); 69 if(NULL == fp) 70 return NULL; 71 NODE *sur = (NODE *)malloc(sizeof(NODE)); 72 while(fread((void *)&sur->data,sizeof(STU),1,fp) >0 ) 73 { 74 sur->next = head->next; 75 head->next = sur; 76 77 sur = (NODE *)malloc(sizeof(NODE)); 78 } 79 free(sur); 80 fclose(fp); 81 return head; 82 } 83 //添加学生(插入节点) 84 void insertNode(NODE *head) 85 { 86 NODE * sur = (NODE *)malloc(sizeof(NODE)); 87 printf("请输入学号:");scanf("%d",&sur->data.num); 88 printf("请输入姓名:");scanf("%s",sur->data.name);getchar(); 89 printf("请输入性别:");scanf("%c",&sur->data.sex); 90 printf("请输入数学:");scanf("%f",&sur->data.math); 91 printf("请输入语文:");scanf("%f",&sur->data.chinese); 92 printf("请输入英语:");scanf("%f",&sur->data.english); 93 94 sur->next = head->next; 95 head->next = sur; 96 97 } 98 //查看学生(遍历链表) 99 void displaystudent(NODE *head) 100 { 101 printf("学号 姓名 性别 数学 语文 英语 "); 102 head = head->next; 103 while(head) 104 { 105 printf("%d %s %c %0.2f %0.2f %0.2f ", 106 head->data.num,head->data.name,head->data.sex,head->data.math,head->data.chinese,head->data.english); 107 head = head->next; 108 } 109 } 110 //删除学生(删除结点) 111 void deleteStudent(NODE *head) 112 { 113 char ch[50]; 114 NODE *p = head; 115 printf("请输出删除学生的姓名 "); 116 scanf("%s",ch); 117 while(p) 118 { 119 p = p->next; 120 if(strcmp(p->data.name,ch) == 0) 121 break; 122 } 123 if(NULL == p) 124 printf("不存在这个学生 "); 125 else 126 { 127 while(head->next != p) 128 { 129 head = head->next; 130 } 131 head->next = p->next; 132 free(p); 133 } 134 } 135 //修改学生信息(data域重新赋值) 136 void modScore(NODE *head) 137 { 138 139 printf("输入要修改成绩学生姓名 "); 140 char ch[50]; 141 scanf("%s",ch); 142 NODE * p = head; 143 while(p) 144 { 145 p = p->next; 146 if(strcmp(p->data.name,ch) == 0) 147 break; 148 } 149 if(NULL == p) 150 printf("不存在这个学生 "); 151 else 152 { 153 printf("选择要修改成绩的学科:1>.数学 2>.语文 3>.英语 4>.全部修改 "); 154 int i; 155 scanf("%d",&i); 156 switch(i) 157 { 158 case 1: 159 printf("数学成绩修改为:");scanf("%f",&p->data.math); 160 break; 161 case 2: 162 printf("语文成绩修改为:");scanf("%f",&p->data.chinese); 163 break; 164 case 3: 165 printf("英语成绩修改为:");scanf("%f",&p->data.english); 166 break; 167 case 4: 168 printf("数学成绩修改为:");scanf("%f",&p->data.math); 169 printf("语文成绩修改为:");scanf("%f",&p->data.chinese); 170 printf("英语成绩修改为:");scanf("%f",&p->data.english); 171 break; 172 } 173 } 174 } 175 //求链表长度 176 int lenList(NODE *head) 177 { 178 int len = 0; 179 head = head->next; 180 while(head) 181 { 182 len++; 183 head = head->next; 184 } 185 return len; 186 } 187 //排序(只写一种排序把,按照数学成绩排序) 188 void PopList(NODE *head) 189 { 190 int len = lenList(head); 191 NODE * sur,*p,*q,*temp; 192 int i,j; 193 for(i = 0;i<len-1;i++) 194 { 195 sur = head; 196 p = sur->next; 197 q = p->next; 198 for(j = 0;j<len-1-i;j++) 199 { 200 if(p->data.math > q->data.math) 201 { 202 sur->next = q; 203 p->next = q->next; 204 q->next = p; 205 206 temp = p; 207 p = q; 208 q = temp; 209 } 210 sur = sur->next; 211 p = p->next; 212 q = q->next; 213 } 214 215 } 216 } 217 //退出程序(保存链表中的数据,即:将链表中的数据写入文件,文件当做数据库来使用) 218 void saveStudent2File(NODE *head) 219 { 220 head = head->next; 221 FILE * fp = fopen("stu.data","wb"); 222 while(head) 223 { 224 fwrite((void *)&head->data,sizeof(STU),1,fp); 225 head = head->next; 226 } 227 fclose(fp); 228 } 229 void menu() 230 { 231 //读文件生成链表 232 NODE *head = createList(); 233 printf(" *****************欢迎使用ZY学生管理系统**************** "); 234 int choice; 235 while(1) 236 { 237 printf("1>.添加学生信息 2>.查找学生信息 3>.删除学生信息 4>.修改学生信息 5>.排列学生成绩 6>.退出 "); 238 scanf("%d",&choice); 239 switch(choice) 240 { 241 case 1: 242 //添加学生信息(插入节点) 243 insertNode(head); 244 break; 245 case 2: 246 //查看学生信息(遍历链表) 247 displaystudent(head); 248 break; 249 case 3: 250 //删除学生信息 251 deleteStudent(head); 252 break; 253 case 4: 254 //修改学生信息 255 modScore(head); 256 break; 257 case 5: 258 //排列学生成绩 259 PopList(head); 260 break; 261 case 6: 262 //退出程序(保存链表中的数据,即:将链表中的数据写入文件) 263 saveStudent2File(head); 264 return ; 265 } 266 } 267 } 268 int main(void) 269 { 270 //初始化数据 271 // init(); 272 menu(); 273 274 return 0; 275 }