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\tname = %s\tsex = %c\tmath = %0.2f\tchinese =%0.2f\tenglish =%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("学号\t姓名\t性别\t数学\t语文\t英语\n\n");
102 head = head->next;
103 while(head)
104 {
105 printf("%d\t%s\t%c\t%0.2f\t%0.2f\t%0.2f\n",
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("请输出删除学生的姓名\n");
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("不存在这个学生\n");
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("输入要修改成绩学生姓名\n");
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("不存在这个学生\n");
151 else
152 {
153 printf("选择要修改成绩的学科:1>.数学\t2>.语文\t3>.英语\t4>.全部修改\n");
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("\t\t*****************欢迎使用ZY学生管理系统****************\n\n");
234 int choice;
235 while(1)
236 {
237 printf("1>.添加学生信息\n2>.查找学生信息\n3>.删除学生信息\n4>.修改学生信息\n5>.排列学生成绩\n6>.退出\n");
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 }