关于student-lite的总结①

上次完成的学生管理系统是组队完成,而这次我们单独完成,虽然有上次的可以参考,但是依旧是有很多问题需要解决。

首先的问题便是要求使用的快速排序无法实现,在最开始自己编写的快排函数调用时,总是查询第一个数据时可以正常调用,而查询第二个数据时便是段错误,研究了很久并且找大神帮忙,也没有解决这个问题,最后只得将大师兄代码摘下来自己修改加了上去。

 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类型数据,也无法做到大师兄要求的按字节加密,目前正在学习。

posted on 2018-12-27 09:50  FutureNow  阅读(163)  评论(0)    收藏  举报