Advertisement

链表实现学生信息管理系统(C语言)

阅读量:
复制代码
 #include <string.h>

    
 #include <stdio.h>
    
 #include <stdlib.h>
    
 #include <math.h>
    
 typedef int Status;
    
 int language;
    
 typedef struct
    
 {
    
     char num[12];
    
     char name[20];
    
     char sex;
    
     int sum_of_subject;
    
     int grade[20];
    
 } stu;
    
  
    
 typedef struct LNode
    
 {
    
     stu student;
    
     LNode *next;
    
 } node, *LinkList;
    
  
    
 Status InofGBK(LNode *head)
    
 {
    
     LinkList p, r; // p是当前进行操作的指针,r是rear
    
     r = head;
    
     int n;
    
     printf("输入学生总数:");
    
     scanf("%d", &n);
    
     printf("输入每个学生的信息:\n");
    
     int i;
    
     for (i = 1; i <= n; i++)
    
     {
    
     p = (LinkList)malloc(sizeof(LNode));
    
     p->next = NULL;
    
  
    
     printf("输入学号:\n");
    
     scanf("%s", p->student.num);
    
     printf("输入学生姓名:\n");
    
     scanf("%s", p->student.name);
    
     printf("输入性别:\n");
    
     // fflush(stdin);
    
     getchar();
    
     scanf("%c", &p->student.sex);
    
     printf("输入科目总数:\n");
    
     scanf("%d", &p->student.sum_of_subject);
    
     for (int i = 0; i < p->student.sum_of_subject; ++i)
    
     {
    
         printf("输入第%d科的成绩:\n", i + 1);
    
         scanf("%d", &p->student.grade[i]);
    
     }
    
  
    
     r->next = p;
    
     r = r->next;
    
     }
    
     return n;
    
 }
    
  
    
 Status InofANSCII(LNode *head)
    
 {
    
     LinkList p, r; // p是当前进行操作的指针,r是rear
    
     r = head;
    
     int n;
    
     printf("enter the sum:");
    
     scanf("%d", &n);
    
     printf("enter perinformation:\n");
    
     int i;
    
     for (i = 1; i <= n; i++)
    
     {
    
     p = (LinkList)malloc(sizeof(LNode));
    
     p->next = NULL;
    
  
    
     printf("enter student number:\n");
    
     scanf("%s", p->student.num);
    
     printf("enter student's name:\n");
    
     scanf("%s", p->student.name);
    
     printf("enter sex:\n");
    
     // fflush(stdin);
    
     getchar();
    
     scanf("%c", &p->student.sex);
    
     printf("enter the total of all subjects:\n");
    
     scanf("%d", &p->student.sum_of_subject);
    
     for (int i = 0; i < p->student.sum_of_subject; ++i)
    
     {
    
         printf("enter the score of %dth:\n", i + 1);
    
         scanf("%d", &p->student.grade[i]);
    
     }
    
  
    
     r->next = p;
    
     r = r->next;
    
     }
    
     return n;
    
 }
    
  
    
 void out(LNode *head, char sex_)
    
 {
    
     LinkList p;
    
     p = head;
    
     bool flag = 1;
    
     while (p->next != NULL)
    
     {
    
     p = p->next;
    
     if (sex_ == '@' || sex_ == p->student.sex)
    
     {
    
         if (language)
    
         {
    
             printf("%s 's\nschool number is: %s\nsex is: %c\n", p->student.name, p->student.num, p->student.sex);
    
             for (int i = 0; i < p->student.sum_of_subject; ++i)
    
                 printf("the score of the %dth subject is %d\n", i + 1, p->student.grade[i]);
    
         }
    
         else
    
         {
    
             printf("%s的\n学号是: %s\n性别是: %c\n", p->student.name, p->student.num, p->student.sex);
    
             for (int i = 0; i < p->student.sum_of_subject; ++i)
    
                 printf("第%d门学科的成绩是%d\n", i + 1, p->student.grade[i]);
    
         }
    
         printf("\n");
    
         if (flag)
    
             getchar();
    
         flag = 0;
    
     }
    
     }
    
     getchar();
    
 }
    
  
    
 void InsertList(LNode *head)
    
 {
    
     int i = 0;
    
     int k;
    
     LinkList p, r;
    
     r = head;
    
     stu e;
    
     if (language)
    
     printf("if need specific postion,please enter \"1\"\nelse enter any key\n");
    
     else
    
     printf("如果需要在特定位置插入,输入\"1\"\n不需要只需输入任意键\n");
    
     getchar();
    
     char c;
    
     c = getchar();
    
     if (c == '1')
    
     {
    
     if (language)
    
     {
    
         printf("please enter where you'll insert\n");
    
         scanf("%d", &k);
    
         printf("please enter the information of the student who'll be inserted:\n");
    
         printf("enter school number:\n");
    
         scanf("%s", e.num);
    
         printf("enter name:\n");
    
         scanf("%s", e.name);
    
         printf("enter sex:\n");
    
         getchar();
    
         scanf("%c", &e.sex);
    
         printf("enter the total of all subjects:\n");
    
         scanf("%d", &e.sum_of_subject);
    
         for (int i = 0; i < e.sum_of_subject; ++i)
    
         {
    
             printf("enter the score of %dth:\n", i + 1);
    
             scanf("%d", &e.grade[i]);
    
         }
    
     }
    
     else
    
     {
    
         printf("请输入你想插入学生的位置\n");
    
         scanf("%d", &k);
    
         printf("请输入插入学生的信息:\n");
    
         printf("请输入学号:\n");
    
         scanf("%s", e.num);
    
         printf("请输入名字:\n");
    
         scanf("%s", e.name);
    
         printf("请输入性别:\n");
    
         fflush(stdin);
    
         scanf("%c", &e.sex);
    
         printf("输入科目总数:\n");
    
         scanf("%d", &e.sum_of_subject);
    
         for (int i = 0; i < e.sum_of_subject; ++i)
    
         {
    
             printf("输入第%d科的成绩:\n", i + 1);
    
             scanf("%d", &e.grade[i]);
    
         }
    
     }
    
     while (r && i < k - 1)
    
     {
    
         r = r->next;
    
         i++;
    
     }
    
     if (r != NULL)
    
     {
    
         p = (LinkList)malloc(sizeof(LNode));
    
         p->student = e;
    
         p->next = r->next;
    
         r->next = p;
    
     }
    
     else
    
     {
    
         printf("insert wrang\n");
    
     }
    
     }
    
     else
    
     {
    
     if (language)
    
     {
    
         printf("please enter the information of the student who'll be inserted:\n");
    
         printf("enter school number:\n");
    
         scanf("%s", e.num);
    
         printf("enter name:\n");
    
         scanf("%s", e.name);
    
         printf("enter sex:\n");
    
         getchar();
    
         scanf("%c", &e.sex);
    
         printf("enter the total of all subjects:\n");
    
         scanf("%d", &e.sum_of_subject);
    
         for (int i = 0; i < e.sum_of_subject; ++i)
    
         {
    
             printf("enter the score of %dth:\n", i + 1);
    
             scanf("%d", &e.grade[i]);
    
         }
    
     }
    
     else
    
     {
    
         printf("请输入插入学生的信息:\n");
    
         printf("请输入学号:\n");
    
         scanf("%s", e.num);
    
         printf("请输入名字:\n");
    
         scanf("%s", e.name);
    
         printf("请输入性别:\n");
    
         fflush(stdin);
    
         scanf("%c", &e.sex);
    
         printf("输入科目总数:\n");
    
         scanf("%d", &e.sum_of_subject);
    
         for (int i = 0; i < e.sum_of_subject; ++i)
    
         {
    
             printf("输入第%d科的成绩:\n", i + 1);
    
             scanf("%d", &e.grade[i]);
    
         }
    
     }
    
     while (1)
    
     {
    
         if (r->next == NULL)
    
             break;
    
         r = r->next;
    
     }
    
     p = (LinkList)malloc(sizeof(LNode));
    
     p->student = e;
    
     p->next = r->next;
    
     r->next = p;
    
     }
    
 }
    
  
    
 void DeleteList(LNode *head)
    
 {
    
     LinkList p, r;
    
     int k;
    
     r = head;
    
     k = 0;
    
     if (language)
    
     printf("who you will delete and enter his(her) school number:\n");
    
     else
    
     printf("请输入你想删除学生的学号:\n");
    
     char nu[12];
    
     scanf("%s", nu);
    
     stu e;
    
     bool flag = 0;
    
     while (r->next != NULL)
    
     {
    
     if (!strcmp(nu, r->next->student.num))
    
     {
    
         p = r->next;
    
         // free(r->next);
    
         r->next = p->next;
    
         free(p);
    
         flag = 1;
    
         break;
    
     }
    
     r = r->next;
    
     }
    
     if (flag)
    
     {
    
     if (language)
    
         printf("Accept!\n");
    
     else
    
         printf("删除成功!\n");
    
     getchar();
    
     }
    
     else
    
     {
    
     if (language)
    
         printf("Not found!\n");
    
     else
    
         printf("未找到该学生!");
    
     getchar();
    
     }
    
     getchar();
    
     return;
    
 }
    
  
    
 Status searchway()
    
 {
    
     int x;
    
     if (language)
    
     {
    
     printf("please choose way to search:\n");
    
     printf("\"1\" for name\n\"2\" for student number\n\"3\" for grades\n\"4\" for sex\n");
    
     }
    
     else
    
     {
    
     printf("请选择一种方式搜索:\n");
    
     printf("\"1\" 代表按姓名\n\"2\" 代表按学号\n\"3\" 代表按单科成绩\n\"4\" 代表性别\n");
    
     }
    
     scanf("%d", &x);
    
     getchar();
    
     return x;
    
 }
    
  
    
 void search1(LNode *head)
    
 {
    
     LinkList p;
    
     p = head;
    
     if (language)
    
     printf("please enter student's name:\n");
    
     else
    
     printf("请输入学生姓名:");
    
     stu e;
    
     scanf("%s", e.name);
    
     bool flag = 0;
    
     while (p->next != NULL)
    
     {
    
     p = p->next;
    
     if (!strcmp(e.name, p->student.name))
    
     {
    
         if (language)
    
         {
    
             printf("school number is: %s\nsex is: %c\n", p->student.num, p->student.sex);
    
             for (int i = 0; i < p->student.sum_of_subject; ++i)
    
                 printf("the score of the %dth subject is %d\n", i + 1, p->student.grade[i]);
    
         }
    
         else
    
         {
    
             printf("学号是: %s\n性别是: %c\n", p->student.num, p->student.sex);
    
             for (int i = 0; i < p->student.sum_of_subject; ++i)
    
                 printf("第%d门学科的成绩是%d\n", i + 1, p->student.grade[i]);
    
         }
    
         getchar();
    
         flag = 1;
    
         break;
    
     }
    
     }
    
     if (!flag)
    
     {
    
     if (language)
    
         printf("Wrang!\n");
    
     else
    
         printf("学生不存在!\n");
    
     getchar();
    
     }
    
     getchar();
    
     return;
    
 }
    
  
    
 void search2(LNode *head)
    
 {
    
     LinkList p;
    
     if (language)
    
     printf("please enter the school number of student:\n");
    
     else
    
     printf("请输入学生学号:");
    
     stu e;
    
     char nu[12];
    
     scanf("%s", nu);
    
     p = head;
    
     bool flag = 0;
    
     while (p->next != NULL)
    
     {
    
     p = p->next;
    
     if (!strcmp(nu, p->student.num))
    
     {
    
         if (language)
    
         {
    
             printf("name is: %s\nsex is: %c\n", p->student.name, p->student.sex);
    
             for (int i = 0; i < p->student.sum_of_subject; ++i)
    
                 printf("the score of the %dth subject is %d\n", i + 1, p->student.grade[i]);
    
         }
    
         else
    
         {
    
             printf("姓名是: %s\n性别是: %c\n", p->student.name, p->student.sex);
    
             for (int i = 0; i < p->student.sum_of_subject; ++i)
    
                 printf("第%d门学科的成绩是%d\n", i + 1, p->student.grade[i]);
    
         }
    
         getchar();
    
         flag = 1;
    
         break;
    
     }
    
     }
    
     if (!flag)
    
     {
    
     if (language)
    
         printf("Wrang!\n");
    
     else
    
         printf("学生不存在!\n");
    
     getchar();
    
     }
    
     getchar();
    
     return;
    
 }
    
  
    
 void search3(LNode *head, const int subject)
    
 {
    
     LinkList p;
    
     p = head;
    
     if (language)
    
     {
    
     printf("please enter student's score:\n");
    
     printf("We'll match you with the student(students) with the closest score automatically\n");
    
     }
    
     else
    
     {
    
     printf("请输入学生该门科成绩:\n");
    
     printf("我们将会自动为您匹配 与您输入的成绩 最接近的学生:\n");
    
     }
    
     int sco;
    
     scanf("%d", &sco);
    
     int dev = 1e5;
    
     char mark[20][12];
    
     int k = 0; //存同分的人数
    
     while (p->next != NULL)
    
     {
    
     p = p->next;
    
     if (abs(p->student.grade[subject] - sco) < dev) //查找(所输入成绩与学生成绩)差值最小的学生,并将学号存入mark[]
    
     {
    
         dev = abs(p->student.grade[subject] - sco);
    
         k = 0;
    
         strcpy(mark[0], p->student.num);
    
     }
    
     else if (abs(p->student.grade[subject] - sco) == dev) //继续查找是否有相同成绩的人
    
     {
    
         strcpy(mark[++k], p->student.num);
    
     }
    
     }
    
     LinkList q;
    
     q = head;
    
     int i = 0;
    
     for (; i <= k; i++)
    
     {
    
     while (q->next != NULL)
    
     {
    
         q = q->next;
    
         if (!strcmp(mark[i], q->student.num))
    
         {
    
             if (language)
    
             {
    
                 printf("school number is: %s\nname is: %s\nsex is: %c\n", q->student.num, q->student.name, q->student.sex);
    
                 for (int i = 0; i < q->student.sum_of_subject; ++i)
    
                     printf("the score of the %dth subject is %d\n", i + 1, q->student.grade[i]);
    
             }
    
             else
    
             {
    
                 printf("学号是: %s\n姓名是: %s\n性别是: %c\n", q->student.num, q->student.name, q->student.sex);
    
                 for (int i = 0; i < q->student.sum_of_subject; ++i)
    
                     printf("第%d门学科的成绩是%d\n", i + 1, q->student.grade[i]);
    
             }
    
             printf("\n");
    
             getchar();
    
             break;
    
         }
    
     }
    
     }
    
     getchar();
    
     return;
    
 }
    
  
    
 void menuofANSCII()
    
 {
    
     printf("*****************************************************\n");
    
     printf("*               1.enter students                    *\n");
    
     printf("*               2.search nodes                      *\n");
    
     printf("*               3.insert node                       *\n");
    
     printf("*               4.delete node                       *\n");
    
     printf("*               5.show all nodes                    *\n");
    
     printf("*               6.exit                              *\n");
    
     printf("*               plaese chose a function             *\n");
    
     printf("*****************************************************\n");
    
 }
    
  
    
 void menuofGBK()
    
 {
    
     printf("*****************************************************\n");
    
     printf("*               1.逐个输入学生信息                  *\n");
    
     printf("*               2.根据特征搜索学生                  *\n");
    
     printf("*               3.插入学生                          *\n");
    
     printf("*               4.删除学生                          *\n");
    
     printf("*               5.显示所有学生                      *\n");
    
     printf("*               6.退出                              *\n");
    
     printf("*               请选择相应功能                      *\n");
    
     printf("*****************************************************\n");
    
 }
    
  
    
 int main()
    
 {
    
     printf("请选择你的语言:\n\"0\"代表中文\n\"1\"refers to English\n");
    
     scanf("%d", &language);
    
     int x;
    
     LNode *head;
    
     head = (LinkList)malloc(sizeof(LNode));
    
     head->next = NULL;
    
     bool flag = 0;
    
     while (1)
    
     {
    
     system("cls");
    
     if (language)
    
         menuofANSCII();
    
     else
    
         menuofGBK();
    
     scanf("%d", &x);
    
  
    
     switch (x)
    
     {
    
     case 1:
    
         if (language)
    
             flag = InofANSCII(head);
    
         else
    
             flag = InofGBK(head);
    
         break;
    
     case 2:
    
         switch (searchway())
    
         {
    
         case 1:
    
             search1(head);
    
             break;
    
         case 2:
    
             search2(head);
    
             break;
    
         case 3:
    
             if (language)
    
                 printf("plesse enter the serial number of the subject:\n");
    
             else
    
                 printf("输入你想查找的科目序号:\n");
    
             int ord;
    
             scanf("%d", &ord);
    
             search3(head, ord - 1);
    
             break;
    
         case 4:
    
             if (language)
    
                 printf("plesse enter the sex you want:\n");
    
             else
    
                 printf("输入你想查找的性别:\n");
    
             char c;
    
             c = getchar();
    
             out(head, c);
    
         }
    
         break;
    
     case 3:
    
         if (!flag)
    
         {
    
             if (language)
    
                 printf("you must enter students by \"1\" first!\nenter any key to exit");
    
             else
    
                 printf("你必须先使用\"1\"输入学生信息\n输入任意键退出");
    
             getchar();
    
             getchar();
    
             break;
    
         }
    
         InsertList(head);
    
         break;
    
     case 4:
    
         DeleteList(head);
    
         break;
    
     case 5:
    
         out(head, '@');
    
         break;
    
     case 6:
    
         return 0;
    
     }
    
     }
    
 }
    
  
    
 /*
    
 测试数据:
    
 输入
    
 3
    
 01
    
 zhang
    
 f
    
 3
    
 34 56 56
    
 02
    
 li
    
 m
    
 3
    
 78 90 97
    
 03
    
 huang
    
 f
    
 3
    
 34 54 67
    
  
    
 插入
    
 1
    
 4
    
 04
    
 ai
    
 f
    
 3
    
 89 78 90
    
  
    
 */
    
    
    
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-17/G9ha2RdirHCwFIuMbELZJ7np0Ntl.png)

全部评论 (0)

还没有任何评论哟~