/* 
* C语言学生管理系统(动态链表版)
* 界面比较混乱,因为只是实现了初步功能,同时学生可以修改自己的成绩,这一点不是很好,后面会改进,还有一些功能需要读者自己去发现和修改,谢谢! * 作者:老猫历险记 * 时间:2017年4月6号 * 功能:增添新键数据 * 平台:linux (Ubuntu)
*/ 创建main.h 内容为下 #ifndef _MAIN_H_ #define _MATH_H_ #include"stu.h" #include"teacher.h" #include"ClassTutor.h" void edit();/*管理员操作界面*/ void interface();/*总登录界面*/ void login_manger();/*管理员登录界面*/ #endif

创建stu.h文件,由于老师、班主任的头文件可以直接用学生的模板来套,所以我详细的讲解stu.h文件的敲写,需要和stu.c函数一起看。
 1 #ifndef _STU_H_
 2 #define _STU_H_
 3 #include<stdio.h>
 4 #include<string.h>
 5 #include<stdlib.h>
 6 #define NONE  "\033[m" /*宏定义声明颜色*/
 7 #define RED   "\033[0;32;31m" 
 8 #define LIGHT_RED    "\033[1;31m" 
 9 #define GREEN         "\033[0;32;32m" 
10 #define LIGHT_GREEN   "\033[1;32m" 
11 #define BLUE          "\033[0;32;34m" 
12 #define LIGHT_BLUE    "\033[1;34m" 
13 #define DARY_GRAY     "\033[1;30m" 
14 #define CYAN          "\033[0;36m" 
15 #define LIGHT_CYAN    "\033[1;36m" 
16 #define PURPLE        "\033[0;35m" 
17 #define LIGHT_PURPLE     "\033[1;35m" 
18 #define BROWN            "\033[0;33m" 
19 #define YELLOW           "\033[1;33m" 
20 #define LIGHT_GRAY       "\033[0;37m" 
21 #define WHITE            "\033[1;37m"/*宏定义声明颜色,一共16种颜色*/
22 #define LL sizeof(NODE)   /*宏定义,说明sizeof(NODE)用LL替换*/
23typedef struct student  /*结构体数据,包含学生内容的所有数据*/
24 {
25     char name[32];  /*定义字符串类型数据*/
26     char pawd[32];  /*定义字符串类型数据*/
27     char id[32];  /*定义字符串类型数据*/
28     int clss;    /*定义整型数据*/
29     char obje[32];  /*定义字符串类型数据*/
30     float cpro;    /*定义单精度类型数据*/
31     float chin;    /*定义单精度类型数据*/
32     float math;    /*定义单精度类型数据*/
33     float add;    /*定义单精度类型数据*/
34 }S;//学生结构体
35 
36 typedef struct node
37 {
38     S student;/*内嵌S型结构体数据变量student*/
39     struct node* next;/*指向自身结构体的指针*/
40 }NODE,*PH;//学生初始链表构建有内容头结点,此处定义了一种node结构体的NODE类型,NODE现在是类型名,后面数据读取分配大小时需要用到NODE。
41 
42 typedef struct head
43 {
44     int len_s;
45     struct node *pfhead;
46 }Head,*PF;//学生空头结点,说明的是后面利用PF,先创建一个空指针节点,指针指向空,节点存取数据len_s.
47 
48 void login_student();/*学生登录界面,直接登录没有参数和返回值*/
49 void edit_student();/*登录嵌入函数,编辑学生的信息,没有传参和返回值*/
50 PF creat_student();/*创建学生存储链表,由于需要返回空节点指针(也是链表的头),所以需要定义为PF类型*/
51 PH student_data();/*创建学生信息,由于创建的节点是保存学生的信息的,需要定义为PH类型*/
52 PF insert_student(PF phead);/*插入学生信息,利用头结点的移动和student_data的返回值来添加,需要返回一个头结点,所以定义为PF型*/
53 PF modify_student_list(PF phead);/*修改学生信息,利用头结点的传参遍历来获取学生数据,比较进行修改数据,这边需要进行传参和返回值,类型为PF*/
54 void search_student(PF phead);/*搜索学生信息,利用头结点的传参遍历来搜索学生信息,由于不需要改变学生信息,所以不需要返回值*/
55 PF read_student();/*读取学生信息,利用创建空节点的函数来不断将文本中的数据读取添加到所创建的新链表中,同时返回头节点,所以函数定义需要使用PF类型*/
56 void prin_student(PF phead);/*打印学生信息,打印学生信息使用到传参,在函数内部创建一个PH类型数据节点==传参节点指向下一个的结构体内容*/
57 void save_student(PF phead);/*保存学生信息,利用头结点的传参和新建PH类型的数据节点来遍历存取数据,所以需要传参,是否需要返回值,由于对链表无操作,所以不需要返回值*/
58 PF delete_student(PF phead);/*删除学生信息,由于需要使用到头结点进行传参,同时返回修改后的头结点,所以需要使用到PF来定义。*/
59 #endif
创建teacher.h文件
 1 #ifndef _TEACHER_H_
 2 #define _TEACHER_H_
 3 #define DD sizeof(Date)
 4 #include"stu.h"
 5 typedef struct teacher
 6 {
 7     char name[32];
 8     char pawd[32];
 9     char clss[32];
10     char id[32];
11 }T;//老师结构体
12 
13 typedef struct date
14 {
15     T teacher;
16     struct date* next;
17 }Date,*PT;//老师初始链表构建有内容头结点
18 
19 typedef struct back
20 {
21     int len_t;
22     struct date *pbhead;
23 }Back,*PB;//老师空头结点
24 
25 void login_teacher();/*老师登录界面*/
26 PB creat_teacher();/*创建老师存储链表*/
27 PT teacher_data();/*创建老师信息*/
28 void get_teacher_data();/*老师对学生和自己的操作*/
29 PB insert_teacher(PB phead);/*插入老师信息*/
30 void search_teacher(PB phead);/*搜索老师信息*/
31 void prin_teacher(PB phead);/*打印老师信息*/
32 PB modify_teacher_list(PB phead);/*修改老师信息*/
33 PB delete_teacher(PB phead);/*删除老师信息*/
34 PB read_teacher();/*打开老师存储文本信息*/
35 void save_teacher(PB phead);/*保存老师信息*/
36 
37 #endif

创建ClassTutor.h文件

 1 #ifndef _CLASS_TUTOR_H_
 2 #define _CLASS_TUTOR_H_
 3 #include"stu.h"
 4 #include"teacher.h"
 5 #define PsP sizeof(P_class_Tutor)
 6 typedef struct Class_Tutor
 7 {
 8     char ID[32];
 9     char name[32];
10     char pawd[32];    
11 }C;
12 
13 typedef struct class_Tutor
14 {
15     C Class_Tutor;
16     struct class_Tutor *next;
17 }P_class_Tutor,*PC;
18 typedef struct pm
19 {
20     int len_c;
21     struct class_Tutor *pchead;
22 }lp,*PM;//老师空头结点
23 
24 void edit_Class_Tutor();/*班主任编辑内容*/
25 void login_Class_Tutor();/*班主任登录界面*/
26 PM creat_Class_Tutor();/*创建班主任存储链表*/
27 PC Class_Tutor_data();/*创建班主任信息*/
28 PM insert_Class_Tutor(PM phead);/*插入班主任信息*/
29 void prin_Class_Tutor(PM phead);/*打印班主任信息*/
30 PM modify_Class_Tutor_list(PM phead);/*修改班主任信息*/
31 void search_Class_Tutor(PM phead);/*搜索班主任信息*/
32 PM delete_Class_Tutor(PM phead);/*删除班主任信息*/
33 PM read_Class_Tutor();/*打开班主任存储文本信息*/
34 void save_Class_Tutor(PM phead);/*保存班主任信息*/
35 #endif

创建stu.c文件

  1 #include"stu.h"
  2 /*******************************************************************************************
  3 创建空节点指针,用来指向内容首节点。
  4 创建头指针用来指向链表第一个元素        phead->pfhead=NULL   !!!
  5 *******************************************************************************************/
  6 
  7 PF creat_student()
  8 {
  9     PF phead=NULL;
 10     phead=(PF)malloc(sizeof(Head));
 11     phead->pfhead=NULL;
 12     phead->len_s=0;
 13     return phead;
 14 }
 15 
 16 /*******************************************************************************************
 17 
 18 录信息函数      p=(PH)malloc(LL)
 19 *******************************************************************************************/
 20 
 21 PH student_data()
 22 {
 23     PH p;
 24     p=(PH)malloc(LL);
 25     printf("请输入以下信息\n\n");
 26     printf("NAME:");
 27     scanf("%s",p->student.name);
 28     getchar();
 29     printf("PAWD:");
 30     scanf("%s",p->student.pawd);
 31     getchar();
 32     printf("ID:");
 33     scanf("%s",p->student.id);
 34     getchar();
 35     printf("CLSS:");
 36     scanf("%d",&p->student.clss);
 37     getchar();
 38     printf("OBJE:");
 39     scanf("%s",p->student.obje);
 40     getchar();
 41     printf("CPRO:");
 42     scanf("%f",&p->student.cpro);
 43     getchar();
 44     printf("CHIN:");
 45     scanf("%f",&p->student.chin);
 46     getchar();
 47     printf("MATH:");
 48     scanf("%f",&p->student.math);
 49     getchar();
 50     printf("ADD:");
 51     scanf("%f",&p->student.add);
 52     getchar();
 53     
 54 
 55     return p;
 56 }
 57 
 58 
 59 
 60 
 61 
 62 /*******************************************************************************************
 63 
 64 创建链表     p->next=phead->pfhead;       phead->pfhead=p;
 65 *******************************************************************************************/
 66 PF insert_student(PF phead)
 67 {
 68     PH p=NULL;
 69     int i=0,k=0;
 70     while(1)
 71     {
 72         if(k!=0)
 73         {
 74             printf("if want to add ,input 1\texit:input 0\n");
 75             printf("your choose:");
 76             scanf("%d",&i);
 77             getchar();
 78             if(i==0)
 79             {
 80                 break;
 81             }
 82         }
 83         p=student_data();
 84         p->next=phead->pfhead;
 85         phead->pfhead=p;
 86         k++;
 87         phead->len_s++;
 88     }
 89 
 90     return phead;
 91 }
 92 
 93 
 94 /*******************************************************************************************
 95 
 96 输出链表    
 97 *******************************************************************************************/
 98 void prin_student(PF phead)
 99 {
100     PH p=phead->pfhead;
101     printf("学生信息如下:\n");
102     printf("姓名\t密码\t昵称\t班级\t专业\tc语言\t语文\t数学\t总分\n");
103     while(p!=NULL)
104     {
105         printf("%-8s%-8s%-8s%-8d%-8s%-8.2f%-8.2f%-8.2f%-8.2f\n",p->student.name,p->student.pawd,p->student.id,p->student.clss,p->student.obje,p->student.cpro,p->student.chin,p->student.math,p->student.cpro+p->student.chin+p->student.math);
106         p=p->next;
107     }
108     //printf("any exit");
109     //getchar();
110 }
111 
112 
113 /*******************************************************************************************
114 
115 查找链表中学生的信息
116 *******************************************************************************************/
117 
118 void search_student(PF phead)
119 {
120     PH p=phead->pfhead;
121     char id[32];
122     printf("please input id:");
123     scanf("%s",id);
124     getchar();
125     while(p!=NULL)
126     {
127     if(strcmp(p->student.id,id)==0)
128     {
129         printf("%-8s%-8s%-8s%-8d%-8s%-8.2f%-8.2f%-8.2f%-8.2f\n",p->student.name,p->student.pawd,p->student.id,p->student.clss,p->student.obje,p->student.cpro,p->student.chin,p->student.math,p->student.add);
130     return ;
131     }
132         p=p->next;
133     }
134     printf("no this boy\n");
135     printf("input any to exit:");
136     getchar();
137     return ;
138 }
139 /*******************************************************************************************************************
140 
141 删除链表中的信息    p2=p1;     p1=p1->next;
142 *******************************************************************************************************************/
143 PF delete_student(PF phead)
144 {
145     PH p1=phead->pfhead;
146     PH p2;
147     char name[32];
148     printf("\ninput  NAME:");
149     scanf("%s",name);
150     getchar();
151     while(p1!=NULL&&strcmp(name,p1->student.name))
152     {
153         p2=p1;
154         p1=p1->next;
155     }
156     if(strcmp(p1->student.name,name)==0)
157     {    
158         printf("是否确定删除!");
159         printf("确定删除请输入:1   取消:0\n");
160         int i;
161         scanf("%d",&i);
162         if(i==1)
163     {
164         if(p1==phead->pfhead)
165         {
166             phead->pfhead=p1->next;
167         }
168         else
169         {
170             p2->next=p1->next;
171         }
172         phead->len_s--;
173     }
174         if(i==0)return phead;
175     }
176     return phead;
177 }
178 /********************************************
179 修改学生信息
180 
181 ********************************************/
182 
183 PF modify_student_list(PF phead)
184 {
185     PH temp;
186     char ch[32];
187     int a;
188     printf("输入需要修改的ID:");
189     scanf("%s",ch);
190     getchar();
191     temp=(PH)malloc(sizeof(NODE));
192     temp=phead->pfhead;
193     while(temp!=NULL)
194     {
195         if(strcmp(temp->student.id,ch)==0)
196         {    
197             break;
198         }
199         temp=temp->next;
200     }
201     if(temp==NULL)
202     {
203         printf("无此id\n");
204         getchar();
205         printf("按任意键退出");
206         return phead;
207     }
208     else
209     {
210         printf("开始修改\n");
211         while(1)
212         {
213             printf("1:名字  2:密码  3:id 4:班级 5:科目 6:c语言 7:语文 8:数学 9:离开\n");
214             scanf("%d",&a);
215             getchar();
216             switch(a)
217             {
218                 case 1:
219                         printf("名字:");
220                         scanf("%s",temp->student.name);
221                         getchar();
222                         printf("修改成功\n");
223                         break;
224                 case 2:
225                         printf(" 
                       
                    
                    

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论