上次完成的学生管理系统是组队完成,而这次我们单独完成,虽然有上次的可以参考,但是依旧是有很多问题需要解决。
首先的问题便是要求使用的快速排序无法实现,在最开始自己编写的快排函数调用时,总是查询第一个数据时可以正常调用,而查询第二个数据时便是段错误,研究了很久并且找大神帮忙,也没有解决这个问题,最后只得将大师兄代码摘下来自己修改加了上去。
1 // 按学号快速排序,为后面二分法做准备
2 void num_sort(Node *head,Node* tail)
3 {
4 if(NULL == head || NULL == tail || head == tail)
5 return;
6 Node* flag=head;
7 Node* prev=head;
8 Node* cur=head->next;
9
10 while(cur!= tail->next)
11 {
12 student* stu_f = flag->data;
13 student* stu_c = cur->data;
14 if(stu_f->num > stu_c->num)
15 {
16 prev=prev->next;
17 swap(prev,cur);
18 }
19 cur=cur->next;
20
21 }
22 swap(prev,flag);
23 num_sort(head,prev);
24 num_sort(prev->next,tail);
25 }
而关于二分查找,一开始我听大佬说:“干嘛要用二分查找?二分查找的前提是有序,但是既然已经有序了,直接用遍历不好了”,一开始我觉得没什么不对,后来同桌指点“现在我们写的项目数据很少,所以用不用二分查找没什么区别,但是以后数据很多,比如上万了,那么二分查找效率会高很多”,我才发现自己是不知身在此山中。
1 //二分查找
2 Node* _find_list(List* list,size_t left,size_t right,size_t id)
3 {
4 Node* node = NULL;
5 if(left>=right || id>=right) return NULL;
6 int p = (left+right)/2,i=0;
7 if(id <= list->count/2)
8 {
9 if(p == id)
10 {
11 node = list->head;
12 for(i=0;i<p;i++,node=node->next);
13 return node;
14 }
15 if(p > id)
16 return _find_list(list,left,p,id);
17 else
18 return _find_list(list,p+1,list->count/2,id);
19 }
20 else
21 {
22 if(p == id)
23 {
24 node = list->tail;
25 for(i=list->count-1;i>p;i--,node=node->prev);
26 return node;
27 }
28 if(p > id)
29 return _find_list(list,list->count/2+1,p,id);
30 else
31 return _find_list(list,p+1,right,id);
32 }
33 }
34 Node* find_list(List* list,size_t id)
35 {
36 return _find_list(list,0,list->count,id);
37 }
关于这个使用递归的二分查找函数的逻辑:
首先判断是否符合查找条件,不符合则返回空,然后if语句从链表左端开始查找,如果标杆值和id相同则整个半条链查找,如果p>id,则把链表最左端和p以及id返回递归,从链表最左端到p这一段链表继续查找,其余语句则和这一逻辑相同,不再赘述。
而关于加密文件,我还没有实现,只是了解了将需要加密的单个提取出来加密, 这样也只是加密了int类型的,无法加密float类型数据,也无法做到大师兄要求的按字节加密,目前正在学习。