自己实现的如有缺漏欢迎提出

/* 原创文章 转载请附上原链接: https://www.cnblogs.com/jiujue/p/10325628.html   */

设计内容:

设计一个排序和查找系统。能够实现对给定的一组学生的借书证信息(如:卡号、姓名、系别、班号等)进行排序和查找。

1)按照卡号顺序进行排序;

2)能够实现查找某个系的所有的借书卡号并输出。

设计要求:

(1)建立关于借书证信息结点的结构体;

(2)定义借书证信息的记录并录入基本信息;

(3)写出用某种排序算法(如冒泡排序)按关键字对记录进行排序的算法函数;

  (4)对借书证信息的记录按系名建立索引查找结构;

  (5)输入某个要查找的系名,用索引查找方法查找并输出该系的所有借书证信息。

是学期末的课程设计,自己弄完觉得还可以,提供给有需要的人做参考。

有图万岁:

下面是代码实现:

1.头文件:(my_head.h)

 1 #pragma once
 2 #define _CRT_SECURE_NO_WARNINGS
 3 #include<stdio.h>
 4 #include<windows.h>
 5 #include<stdlib.h>
 6 
 7 //这里改系别总个数
 8 #define depratment_number 3
 9 
10 typedef int once_sort;
11 
12 typedef struct card_node {
13 
14     once_sort is_sort;
15 
16     long long number;
17     char *name;
18     char *department;
19     long long  class_number;
20     struct card_node *next_node;
21     struct card_node *same_department_next_node;
22 }cr_node;
23 
24 
25 cr_node* initialize(cr_node** head);
26 int initialize_sort(cr_node *head);
27 //
28 int print(cr_node* head);
29 
30 int print_one(cr_node*node);
31 
32 int print_on_same_depart(cr_node *same_depaet_head);
33 
34 int print_same_depart(cr_node *index_list[depratment_number], char *str_depratment[depratment_number]);
35 
36 //
37 int input(cr_node*head);
38 
39 //
40 cr_node * find(cr_node * head, long long number);
41 
42 //
43 cr_node* delete_cr_crde(cr_node * head, long long number);
44 
45 //
46 cr_node *make_indexes_list(cr_node *head, char _str_depratment[]);
47 
48 cr_node *get_indexes_list(cr_node *head, char *department[], cr_node *index_list[depratment_number]);
49 
50 //
51 int sort_class_number(cr_node **head);
52 int get_class_sort_list(cr_node *head);
53 int sort_class_link(cr_node **head, int total);
54 
55 int sort_crad_number(cr_node **head);
56 int get_crad_number_sort_list(cr_node *head);
57 int sort_card_link(cr_node **head, int total);
View Code

2.main函数入口:(source_1.c)

  1 #include"my_head.h"
  2 
  3 int CARD_NUMBER = 0;
  4 
  5 //point menu
  6 void print_menu()
  7 {
  8     printf("                                                                 n");
  9     printf("                /-----------------------------------------------/n"); 
 10     printf("                / ***          借书证管理系统             ******/n"); 
 11     printf("                /  -->选项 :                             ******/n");
 12     printf("                / ***    1.按卡号排序并输出前后结果   <    ******/n"); 
 13     printf("                / ***    2.差找并输一个系的所有借书卡号 <  ******/n"); 
 14     printf("                / ***    3.录入一个借书证   <              ******/n"); 
 15     printf("                / ***    4.删除一个借书证   <              ******/n");
 16     printf("                / ***    5.按关键字(例如 班号)进行排序 <   ******/n"); 
 17     printf("                / ***    6.建立索引表并用其查找 <          ******/n"); 
 18     printf("                / ***    7.退出本程序   <                  ******/n"); 
 19     printf("                / ***    8.打印现有的借书证信息   <        ******/n");
 20     printf("                / ***    9.惊喜 最好不要选        <        ******/n");
 21     printf("                /-----------------------------------------------/n"); 
 22     printf("n a                    #_#  请输入所要执行的操作 #_#n");
 23     printf("n                          (请输入数字 1-8 选择操作)n"); Sleep(500);
 24 }
 25 
 26 int main()
 27 {
 28     system("color d");
 29 
 30     system("title .                                                                                          #借书证信息管理系统# ");
 31     
 32     cr_node* head=NULL;
 33     cr_node* temp_node = NULL;
 34     cr_node *index_list[depratment_number];
 35 
 36     cr_node *sort_list[10];
 37     int i = 0;
 38 
 39     char str_find_depart_temp[64];
 40 
 41     long long temp = 0;
 42     int i_find_same = 0;
 43 
 44     initialize(&head);
 45 
 46     //添加系别步骤 1.在下方字符串里添加系名 2。在头文件定义里更改系别总个数 
 47     char *str_depratment[depratment_number] = { "计算机系","外语系","艺术系" };
 48 
 49 
 50     int operation;
 51     int exit_op;
 52     operation = 0;
 53 
 54     while (1)
 55     {
 56         print_menu();
 57         operation = 10;
 58         printf("n请输入你要进行的操作 (确认输入时可能有时需两次按下 Enter 键): n");
 59 
 60         scanf("%d",&operation);
 61         
 62         {getchar(); getchar(); }
 63 
 64         switch (operation)
 65         {
 66         case 1:        //排序
 67 
 68             sort_crad_number(&head);
 69 
 70             system("pause");
 71             Sleep(200);
 72             system("cls");
 73             break;
 74 
 75         case 2:        //查找一个系的全部成员并输出
 76 
 77             get_indexes_list(head, str_depratment, index_list);
 78 
 79             printf("请输入你要查找的系的名称 注: 先有 如下系名记录在系统  n");
 80 
 81             gets_s(str_find_depart_temp,sizeof(str_find_depart_temp));
 82             printf("%sn", str_find_depart_temp);
 83             if ("\0" == str_find_depart_temp||"" == str_find_depart_temp)
 84             {
 85                 printf("输入的系别有误 请重新输入n");
 86                 goto END;
 87             }
 88 
 89             {
 90                 int x=0;
 91 
 92                 while (x < depratment_number)
 93                 {
 94                     if (strstr(index_list[x]->department, str_find_depart_temp))
 95                     {
 96                         print_on_same_depart(index_list[x]);
 97                         goto END;
 98                     }
 99                     ++x;
100                 }
101                 if (x > depratment_number)
102                 {
103                     printf("输入的系别有误 请重新输入n");
104                     goto END;
105                 }
106             }
107             
108 
109 
110     
111 
112 
113 END:        system("pause");
114             Sleep(200);
115             system("cls");
116             break;
117 
118         case 3:        //录入一个
119 
120             input(head);
121 
122             system("pause");
123             Sleep(200);
124             system("cls");
125             break;
126 
127         case 4:        //删除
128 
129             printf("please input card_number : n");
130             scanf("%lld", &temp);
131 
132             head = delete_cr_crde(head, temp);
133 
134             system("pause");
135             Sleep(200);
136             system("cls");
137             break;
138 
139         case 5:        //排序
140 
141             sort_class_number(&head);
142 
143             system("pause");
144             Sleep(200);
145             system("cls");
146             break;
147 
148         case 6:        //建立索引表并用其查找
149 
150             get_indexes_list(head, str_depratment,index_list);
151 
152             print_same_depart(index_list, str_depratment);
153 
154             system("pause");
155             Sleep(200);
156             system("cls");
157             break;
158 
159         case 7:        //exit()
160             
161             printf("a");                            //are you want quit ?                    //warning you soon quit 
162             exit_op= MessageBox(NULL, "确认过眼神,是要退出的人 !! ", "挽留一下下可以吗?", MB_YESNO);
163             if (6 == exit_op)
164             {
165                 exit(-1);
166             }
167             printf("t    您已取消退出 请继续使用 *_* nn");
168 
169             system("pause");
170             Sleep(200);
171             system("cls");
172             break;
173 
174         case 8:        //打印现有的
175 
176             print(head);
177 
178             system("pause");
179 
180             Sleep(200);
181             system("cls");
182             break;
183         case 9:    
184 
185             printf("a People always have choicse。。。。n");
186             printf("n But always the wrong choice n");
187             printf("n Cherish what you have at the momentn");
188             printf("n");
189             Sleep(2000);
190 
191             system("cls");
192 
193             while (1)
194             {
195                 static int t = 0;
196                 if (t == 8)
197                 {
198                     t = 0;
199                 }
200                 char str[20];
201                 sprintf(str, "color %d%d", t, t + 1);
202                 if (0 == t % 2)
203                 {
204                     system("title .                                                                                          让你乱点 哈哈哈 ");
205                 }
206                 else
207                 {
208                     system("title .                                                                                          下次记得做个乖宝宝 !!! ");
209                 }
210                 system(str);
211                 printf("%sn","且行且珍惜");
212                 ++t;
213                 //Sleep(150);
214             }
215 
216             system("pause");
217 
218             Sleep(200);
219             system("cls");
220             break;
221 
222         default:
223                                     //please input select operation number of you
224             printf("a                   !!!!请输入 1 - 6 的数字来选择你的操作!!!!!n");
225             Sleep(500);
226                                     //tips : refresh after on 3 seconds ,again try input 
227             printf("a                      *_* 提示: 2 秒后刷新 您可再次输入选项 *_* n");
228 
229             Sleep(2000);
230             system("cls");
231             break;
232         }
233     }
234     return 0;
235 }
View Code

3.删除一个信息:(delete_cr_node.c)

 1 #include"my_head.h"
 2 
 3 extern CARD_NUMBER;
 4 
 5 cr_node* delete_cr_crde(cr_node * head,long long number)
 6 {
 7     cr_node *t1, *t2;
 8     t1 = head;
 9     t2 = head;
10     if (number == head->number)
11     {
12         t2 = head;
13         head = head->next_node;
14         free(t2);
15         return head;
16     }
17     while (t1 != NULL && t1->number != number)
18     {
19         t2 = t1;
20         t1 = t1->next_node;
21     }
22     if (NULL == t1)
23     {
24         printf("n **** !!!!!!! key unexistent of in library_card_system !!!!!!! ****nn");
25         goto Exception;
26     }
27     if (number == t1->number)
28     {
29         t2->next_node = t1->next_node;
30         CARD_NUMBER--;
31         free(t1);
32 
33         return head;
34     }
35 
36     
37 
38 Exception:    return head;
39 
40 }
View Code

4.查找:(find.c)

 1 #include"my_head.h"
 2 
 3 extern CARD_NUMBER;
 4 
 5 cr_node * find(cr_node * head, long long number)
 6 {
 7     if (NULL == head)
 8     {
 9         return NULL;
10     }
11     else
12     {
13         while (head->number != number)
14         {
15             head = head->next_node;
16         }
17         if (NULL == head)
18         {
19             return NULL;
20         }
21         else
22         {
23             return head;
24         }
25     }
26     
27 }
View Code

5.获取排序后的顺序:(get_indexes_list.c)

 1 #include "my_head.h"
 2 extern CARD_NUMBER;
 3 cr_node *make_indexes_list(cr_node *head, char _str_depratment[])
 4 {
 5     cr_node *p1 = NULL;
 6     cr_node *p2 = head;
 7     if (NULL == head)
 8     {
 9         printf("输入为空 请检查 n");
10         return NULL;
11     }
12     while (head)
13     {
14         if (strstr(head->department, _str_depratment))
15         {
16             p1 = head;
17             p2 = p1;
18             head = head->next_node;
19             break;
20         }
21         else
22         {
23             head = head->next_node;
24         }
25     }
26     while (head)
27     {
28         if (strstr(head->department, _str_depratment))
29         {
30             p2->same_department_next_node = head;
31             p2 = p2->same_department_next_node;
32             head = head->next_node;
33         }
34         else
35         {
36             head = head->next_node;
37         }
38     }
39     if (NULL == p1)
40     {
41         printf("提示:有未录入的系 如有需要请添加 n");
42         return NULL;
43     }
44     p2->same_department_next_node = NULL;
45     return p1;
46 }
47 cr_node*get_indexes_list(cr_node*head, char*department[],
48     cr_node *index_list[depratment_number])
49 {
50     int i = 0;
51     while (i < depratment_number)
52     {
53         index_list[i] = make_indexes_list(head, department[i]);
54         ++i;
55     }
56     return index_list;
57 }
View Code

6.初始化系统中的信息:(initialize.c)//这步可不执行 不影响使用

 1 #include"my_head.h"
 2 
 3 extern CARD_NUMBER;
 4 
 5 cr_node* initialize(cr_node** head) 
 6 {
 7     cr_node *p1=NULL, *p2 = NULL, *p3 = NULL;
 8 
 9     p1 = (cr_node*)malloc(sizeof(cr_node));
10     p2 = (cr_node*)malloc(sizeof(cr_node));
11     p3 = (cr_node*)malloc(sizeof(cr_node));
12 
13     p1->name = "张三";
14     p1->number = 1003;
15     p1->class_number = 2003;
16     p1->department = "计算机系";
17     p1->next_node = p2;
18     p1->same_department_next_node = NULL;
19     p1->is_sort = 0;
20     CARD_NUMBER++;
21 
22     p2->name = "王五";
23     p2->number = 1001;
24     p2->class_number = 2002;
25     p2->department = "外语系";
26     p2->next_node = p3;
27     p2->same_department_next_node = NULL;
28     p2->is_sort = 0;
29     CARD_NUMBER++;
30 
31     p3->name = "李四";
32     p3->number = 1002;
33     p3->class_number = 2001;
34     p3->department = "艺术系";
35     p3->next_node = NULL;
36     p3->same_department_next_node = NULL;
37     p3->is_sort = 0;
38     CARD_NUMBER++;
39 
40     *head = p1;
41 }
View Code

7. 初始化链表的顺序:(init_sort.c)//博主的排序实现使用了和往常不一样的方法 有兴趣的可以好好研究哦 

 1 #include"my_head.h"
 2 
 3 
 4 int initialize_sort(cr_node *head)
 5 {
 6     while (head)
 7     {
 8         head->is_sort = 0;
 9         head = head->next_node;
10     }
11     return 1;
12 }
View Code

8.录入一个信息的实现:(input_one.c):

 1 #include"my_head.h"
 2 
 3 extern CARD_NUMBER;
 4 
 5 int input(cr_node *head)
 6 {
 7     cr_node *p1 = NULL;
 8 
 9     char str[sizeof(cr_node)];
10 
11     static long long number;2
12     char *name = (char *)malloc(10);
13     char *department = (char *)malloc(64);
14     static long long  class_number;
15 
16     p1 = (cr_node *)malloc(sizeof(cr_node));
17     p1->next_node = NULL;
18 
19     while (head->next_node)
20     {
21         head = head->next_node;
22     }
23 
24     getchar();
25 
26     printf("请输入需要录入的信息  nn(输入格式提示 
27     例如:[卡号 姓名 系别 班号] 
28     中括号里面的为一次录入,不用写中括号。 )nn");
29 
30     gets_s(str, sizeof(cr_node));
31 
32     sscanf(str,"%lld %s %s %lld",
33         &number, name,
34         department,&class_number);
35 
36     p1->number = number;
37     p1->name= name;
38     p1->department = department;
39     p1->class_number = class_number;
40     p1->is_sort = 0;
41     p1->same_department_next_node = NULL;
42 
43     printf("你刚刚的输入是:n");
44     printf("card_number tname tdepartment tclass_numbernna");
45 
46     printf("%lldtt%s t%s tt%lldnn",
47     p1->number, p1->name,
48     p1->department, p1->class_number);
49 
50     head->next_node=p1;
51     CARD_NUMBER++;
52 
53     system("pause");
54     return 0;
55 }
View Code

9.打印信息的实现: //由于要求打印实现了很多 有兴趣的朋友可以用回调改一改 看起来会好一点

  (print_all.c):

 1 #include"my_head.h"
 2 
 3 extern CARD_NUMBER;
 4 
 5 int print(cr_node* head)
 6 {
 7     printf("当前系统共存储 %d 个借书证信息,所有信息如下:nn", CARD_NUMBER);
 8     printf("card_number tname tdepartment tclass_numbernna");
 9     while (NULL!=head)
10     {
11         printf("  %lldtt%s t%s t%lldnn",
12                 head->number, head->name, 
13                 head->department, head->class_number);
14         head = head->next_node;
15     }
16     return 0;
17 }
View Code

  (print_all_same_depart.c):

 1 #include"my_head.h"
 2 
 3 extern CARD_NUMBER;
 4 
 5 int print_same_depart(cr_node *index_list[depratment_number], char *str_depratment[depratment_number])
 6 {
 7     cr_node *list_head = NULL;
 8 
 9     int i = 0;
10 
11     while (i < depratment_number)
12     {
13         list_head = index_list[i];
14         
15         
16         if (NULL == list_head)
17         {
18             printf("-->%s未录入 :n",str_depratment[i]);
19             
20             ++i;
21             break;
22         }
23         printf("-->%s有如下 :n", str_depratment[i]);
24         printf("ncard_number tname tdepartment tclass_numbernna");
25         while (NULL != list_head)
26         {
27 
28             printf("  %lldtt%s t%s tt%lldnn",
29                 list_head->number, list_head->name,
30                 list_head->department, list_head->class_number);
31 
32             list_head = list_head->same_department_next_node;
33 
34         }
35         ++i;
36     }
37 
38     
39     return 0;
40 }
View Code

  (print_on_same_department.c):

 1 #include"my_head.h"
 2 
 3 extern CARD_NUMBER;
 4 
 5 int print_on_same_depart(cr_node *same_depaet_head)
 6 {
 7         printf("ncard_number tname tdepartment tclass_numbernna");
 8         while (NULL != same_depaet_head)
 9         {
10             printf("  %lldtt%s t%s tt%lldnn",
11                 same_depaet_head->number, same_depaet_head->name,
12                 same_depaet_head->department, same_depaet_head->class_number);
13             same_depaet_head = same_depaet_head->same_department_next_node;
14         }
15          return 0;
16 }
View Code

  (print_one.c):

 1 #include"my_head.h"
 2 
 3 extern CARD_NUMBER;
 4 
 5 int print_one(cr_node* head)
 6 {
 7     printf("card_number tname tdepartment tclass_numbernna");
 8 
 9         printf("  %lldtt%s t%s t%lldnn",
10             head->number, head->name,
11             head->department, head->class_number);
12     return 0;
13 }
View Code

10.两个排序的实现:(分别按 班号 卡号 的排序)

  (sort_class_number.c):

  1 #include"my_head.h"
  2 
  3 static cr_node **array_save = NULL;
  4 
  5 int get_class_sort_list(cr_node *head)
  6 {
  7 
  8     int total = 0;
  9 
 10     int x_save = 0;
 11 
 12     int flag=0;
 13 
 14     cr_node *temp_total = head;
 15 
 16     cr_node *temp_2 = head;
 17     
 18     cr_node *min_node = NULL;
 19     cr_node *current_node = NULL;
 20     
 21     while (temp_total)
 22     {
 23         temp_total = temp_total->next_node;
 24         ++total;
 25     }
 26 
 27     flag = total;
 28 
 29     array_save = (cr_node **)malloc(sizeof(cr_node*)*total);
 30 
 31     for(int j=0;j<total;++j)
 32     { 
 33         min_node = NULL;
 34         current_node = head;
 35         while (!min_node)
 36         {
 37             if (flag < 0)
 38             {
 39                 goto END;
 40             }
 41             if (temp_2->is_sort == 0)
 42             {
 43                 min_node = temp_2;
 44             }
 45             else
 46             {
 47                 temp_2 = temp_2->next_node;
 48             }
 49         }
 50 
 51         
 52         for (int i=0; i < total; ++i)
 53         {
 54             
 55             if (min_node->class_number > current_node->class_number&&0==current_node->is_sort)
 56             {
 57                 min_node = current_node;
 58                 current_node = current_node->next_node;
 59             }
 60             else
 61             {
 62                 current_node = current_node->next_node;
 63             }
 64         }
 65         min_node->is_sort = 1;
 66          *(array_save+ x_save)= min_node;
 67         
 68         ++x_save;
 69         --flag;
 70 
 71         
 72     }
 73 
 74 
 75 END: return total;
 76     
 77 
 78 }
 79 
 80 
 81 int sort_class_number(cr_node **head)
 82 {
 83     printf(" 按班号排序前 : n");
 84     print(*head);
 85 
 86     initialize_sort(*head);
 87 
 88     int total= get_class_sort_list(*head);
 89 
 90     sort_class_link(head, total);
 91 
 92     printf(" 按班号排序后 : n");
 93 
 94     print(*head);
 95 }
 96 
 97 
 98 int sort_class_link(cr_node **head, int total)
 99 {
100     int flag__=0;
101 
102     cr_node *p1 = NULL;
103     cr_node *p2 = *head;
104     cr_node **p3 = NULL;
105     cr_node **p4 = NULL;
106 
107     p1 = p2;
108 
109     while (p1 != NULL && p2 != NULL)
110     {
111         p1 = p2;
112         p2 = p1->next_node;
113 
114         p1->next_node = NULL;
115 
116     }
117 
118     *head = array_save[0];
119     
120     p3 = array_save;
121     
122 
123     while (flag__<total-1)
124     {
125         //p4 = &(*p3)->next_node;
126         
127         (*p3)->next_node = *(p3+1);
128         ++p3;
129         ++flag__;
130     }
131 
132 
133 
134 }
View Code

  (sort_crad_number.c):

  1 #include"my_head.h"
  2 
  3 static cr_node **array_save = NULL;
  4 
  5 int get_crad_number_sort_list(cr_node *head)
  6 {
  7 
  8     int total = 0;
  9 
 10     int x_save = 0;
 11 
 12     int flag = 0;
 13 
 14     cr_node *temp_total = head;
 15 
 16     cr_node *temp_2 = head;
 17 
 18     cr_node *min_node = NULL;
 19     cr_node *current_node = NULL;
 20 
 21     while (temp_total)
 22     {
 23         temp_total = temp_total->next_node;
 24         ++total;
 25     }
 26 
 27     flag = total;
 28 
 29     array_save = (cr_node **)malloc(sizeof(cr_node*)*total);
 30 
 31     for (int j = 0; j < total; ++j)
 32     {
 33         min_node = NULL;
 34         current_node = head;
 35         while (!min_node)
 36         {
 37             if (flag < 0)
 38             {
 39                 goto END;
 40             }
 41             if (temp_2->is_sort == 0)
 42             {
 43                 min_node = temp_2;
 44             }
 45             else
 46             {
 47                 temp_2 = temp_2->next_node;
 48             }
 49         }
 50 
 51 
 52         for (int i = 0; i < total; ++i)
 53         {
 54 
 55             if (min_node->number > current_node->number && 0 == current_node->is_sort)
 56             {
 57                 min_node = current_node;
 58                 current_node = current_node->next_node;
 59             }
 60             else
 61             {
 62                 current_node = current_node->next_node;
 63             }
 64         }
 65         min_node->is_sort = 1;
 66         *(array_save + x_save) = min_node;
 67 
 68         ++x_save;
 69         --flag;
 70 
 71 
 72     }
 73 
 74 
 75 END: return total;
 76 
 77 }
 78 
 79 
 80 int sort_card_link(cr_node **head, int total)
 81 {
 82     int flag__ = 0;
 83 
 84     cr_node *p1 = NULL;
 85     cr_node *p2 = *head;
 86     cr_node **p3 = NULL;
 87     cr_node **p4 = NULL;
 88 
 89     p1 = p2;
 90 
 91     while (p1 != NULL && p2 != NULL)
 92     {
 93         p1 = p2;
 94         p2 = p1->next_node;
 95 
 96         p1->next_node = NULL;
 97 
 98     }
 99 
100     *head = array_save[0];
101 
102     p3 = array_save;
103 
104     while (flag__ < total - 1)
105     {
106 
107         (*p3)->next_node = *(p3 + 1);
108         ++p3;
109         ++flag__;
110     }
111 
112 }
113 
114 int sort_crad_number(cr_node **head)
115 {
116     printf(" 按卡号排序前 : n");
117     print(*head);
118 
119     initialize_sort(*head);
120 
121     int total = get_crad_number_sort_list(*head);
122 
123     sort_card_link(head, total);
124 
125     printf(" 按卡号排序后 : n");
126 
127     print(*head);
128 }
View Code

 

结语:有问题欢迎提在下方 ,本人在校学生,时间较为充裕, 有时间会回复的。

/* 原创文章 转载请附上原链接: https://www.cnblogs.com/jiujue/p/10325628.html   */

内容来源于网络如有侵权请私信删除
你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!