用c语言实现学生信息管理(该简易代码可实现基本的增删查改,但不包含查重,有很多需要改进的地方)

下面进入主题

包含4个部分


  1. 头文件
  2. 结构体定义
  3. 实现每一部分功能的函数
  4. 主函数调用每一个功能

1.头文件

#include
#include //实现代码框大小和颜色改变
#include
#define LEN sizeof(struct Student)

2结构体定义

struct Student
{//数据域
char number[20]; //学号
char name[10]; //姓名
char sex[4]; //性别
int Chinese; //语文成绩
int Math; //数学成绩
int English; //英语成绩
//指针域

struct Student* next; //指向下一个数据的指针
};
struct Student* head = NULL;//全局
struct Student* end = NULL;//全局

3.函数部分代码

1.菜单函数

void Menu()//定义一个Menu 函数
{
printf(“1、学生信息录入\n”);
printf(“2、学生单个成绩查询\n”);
printf(“3、查询全部学生成绩\n”);
printf(“4、修改学生信息\n”);
printf(“5、删除学生信息\n”);
printf(“6、退出系统\n”);
}

2,添加函数

void Add()//添加函数
{
system(“cls”);//清屏
int count;
printf(“请输入要录入信息的个数:”);
scanf(“%d”,&count);
struct Student *s1,*s2,*temp;
s1=s2=(struct Student*)malloc(sizeof(Student));//s1,s2开辟空间
if(head==NULL)//如果头等于空,说明就是第一个
{
head = s1;//让s1当头
}
else
{
end->next = s1 ;//
}
int i = 1;
while(count>0)//循环输入
{
printf(“请输入第%d位学生信息:\n”,i++);
printf(“学号:\n”);
scanf(“%s”,s1->number);
printf(“姓名:\n”);
scanf(“%s”,s1->name);
printf(“性别:\n”);
scanf(“%s”,s1->sex);
printf(“语文成绩:\n”);
scanf(“%d”,&s1->Chinese);
printf(“数学成绩:\n”);
scanf(“%d”,&s1->Math);
printf(“英语成绩:\n”);
scanf(“%d”,&s1->English);
count–;
s2->next=s1;//把s1 中数据给s2 ;然后s1继续开辟空间 让数据存到s1中
s2=s1;
s1=(struct Student*)malloc(sizeof(Student));
printf(“添加成功!\n”);
system(“pause”);//暂停
system(“cls”);
}
s2->next= NULL;
end = s2;
printf(“全部添加成功!\n”);
system(“pause”);
}

查找部分采用遍历查找

3,学生查找(通过学号查找)

void View()
{
system(“cls”);
struct Student *VS;
printf(“输入要查询信息的学生学号:\n”);
char num[10];
int view=1;
scanf(“%s”,&num);
for(VS=head;VS!=NULL;VS=VS->next)
{
if(strcmp(VS->number,num)==0)//两个结构体比较;如果相等就说明找到了;
{
printf(“成功找到!\n”);
printf(“学号:%s\t姓名:%s\t性别:%s\n”,VS->number,VS->name,VS->sex);
printf(“语文:%d\t数学:%d\t英语:%d”,VS->Chinese,VS->Math,VS->English);
view=0;
break;
}
//不相等就接着往下找
}
if(view==1)
{
printf(“不好意思,未找到!\n”);
}
system(“pause”);//等待 进行下一次选择
}

4,所有学生信息展示

void ViewAll()//定义一个展示全部学生成绩的函数
{
system(“cls”);
struct Student *VA;
if(head!=NULL)//头部等于空 说明里面存有数据
{
printf(“所有学生成绩如下:\n”);
for(VA=head;VA!=NULL;VA=VA->next )
{
printf(“学号:%s\t姓名:%s\t性别:%s\n”,VA->number,VA->name,VA->sex);
printf(“语文:%d\t数学:%d\t英语:%d\n”,VA->Chinese,VA->Math,VA->English);

}
}
else
{
printf(“该系统中还未录入信息”);
}
system(“pause”);
}

5,学生信息修改(先找到这个节点然后新定义的结构体指针指向这个节点)

void Repair() //修改 函数
{
system(“cls”);
struct Student *RS;
char num[10];
int repa = 1;
printf(“输入要修改成绩学生的学号:\n”);
scanf(“%s”,num);
for(RS=head;RS!=NULL; RS=RS->next)
{
if(strcmp(RS->number,num)==0)//寻找节点
{
printf(“成功找到该学生”);
printf(“学号:%s\t姓名:%s\t性别:%s\n”,RS->number,RS->name,RS->sex);
printf(“语文:%d\t数学:%d\t英语:%d\n”,RS->Chinese,RS->Math,RS->English);
repa = 0;
printf(“学号:\n”);
scanf(“%s”,&RS->number); //RS是新定义的结构体指针 把RS中数据传到之前的里面
printf(“姓名:\n”);
scanf(“%s”,&RS->name);
printf(“性别:\n”);
scanf(“%s”,&RS->sex);
printf(“语文成绩:\n”);
scanf(“%d”,&RS->Chinese);
printf(“数学成绩:\n”);
scanf(“%d”,&RS->Math);
printf(“英语成绩:\n”);
scanf(“%d”,&RS->English);
printf(“修改成功”);
system(“pause”);
}

}
if(repa)
{
printf(“输入信息有误,未查询到”);
system(“pause”);

}

删除是采用先找到要删除的节点然后让它前面的节点直接指向它后面的节点

6,删除部分

void Delete()
{
system(“cls”);
int flag =1;
while(flag)
{
printf(“请输入要删除的学生学号:”);
char num[10];
scanf(“%s”,&num);
struct Student * DS,*temp; //定义结构体指针
for(DS=head;DS!=NULL;)
{
if(strcmp(DS->number,num)==0)
{
if(DS==head) //如果DS是第一个节点
{
head = DS->next; //DS的下一个是NULL当头 ,删除完毕
flag = 0;
printf(“删除成功!\n”);
system(“pause”);
}
else
{
flag = 0;
printf(“删除成功!\n”);
temp->next= DS->next;
free(DS); //把DS这个空间释放
system(“pause”);
}

}
temp = DS;
DS=DS->next;
}
if(flag==1)
{
printf(“未找到该学生学号!\n”);

system(“pause”);
break;
}
}

7,主函数(调用上面函数)

int main()
{
system(“color 72”);//更改运行框颜色
system(” mode con cols=66 lines=33″);//更改运行框大小
int choice;
printf(“请选择要使用的功能:\n”);

while(1) //循环
{
Menu(); //每次循环都会调用 这个函数让主屏幕上显示
scanf(“%d”,&choice);

switch (choice)
{
case 1:
Add();
break;
case 2:
View();
break;
case 3:
ViewAll();
break;
case 4:
Repair();
break;
case 5:
Delete();
break;
case 6:
exit(0); //退出
break;
default:
printf(“输入有误,请重新选择:”);
}
system(“cls”);//每次查找结束 会清空屏幕信息
}
}

4,源代码

#include #include //可实现运行框颜色及大小改变#include #define LEN sizeof(struct Student)struct Student{char number[20];//学号 char name[10];//姓名 char sex[4];//性别 int Chinese;//语文成绩 int Math;//数学成绩 int English;//英语成绩 struct Student* next;//指向下一个数据的指针 };struct Student* head = NULL;//全局 struct Student* end = NULL;//全局  void Menu()//定义一个Menu 函数  { printf("1、学生信息录入\n");printf("2、学生单个成绩查询\n");printf("3、查询全部学生成绩\n");printf("4、修改学生信息\n");printf("5、删除学生信息\n");printf("6、退出系统\n");}  void Add()//添加函数 {system("cls");//清屏 int count;printf("请输入要录入信息的个数:");scanf("%d",&count);struct Student *s1,*s2,*temp; s1=s2=(struct Student*)malloc(sizeof(Student));//s1,s2开辟空间 if(head==NULL)//如果头等于空,说明就是第一个 {head = s1;//让s1当头 }else{end->next = s1 ;//}int i = 1;while(count>0)//循环输入 {printf("请输入第%d位学生信息:\n",i++);printf("学号:\n");scanf("%s",s1->number);printf("姓名:\n");scanf("%s",s1->name);printf("性别:\n");scanf("%s",s1->sex);printf("语文成绩:\n");scanf("%d",&s1->Chinese);printf("数学成绩:\n");scanf("%d",&s1->Math);printf("英语成绩:\n");scanf("%d",&s1->English);count--;s2->next=s1;//把s1 中数据给s2 ;然后s1继续开辟空间 让数据存到s1中 s2=s1;s1=(struct Student*)malloc(sizeof(Student));printf("添加成功!\n");system("pause");//暂停system("cls");}s2->next= NULL;end = s2;printf("全部添加成功!\n");system("pause");}void View(){system("cls");struct Student *VS;printf("输入要查询信息的学生学号:\n");char num[10];int view=1;scanf("%s",&num);for(VS=head;VS!=NULL;VS=VS->next){if(strcmp(VS->number,num)==0)//两个结构体比较;如果相等就说明找到了; {printf("成功找到!\n");printf("学号:%s\t姓名:%s\t性别:%s\n",VS->number,VS->name,VS->sex);printf("语文:%d\t数学:%d\t英语:%d",VS->Chinese,VS->Math,VS->English);view=0;break;}//不相等就接着往下找 }if(view==1){printf("不好意思,未找到!\n");}system("pause");//等待 进行下一次选择 }void ViewAll()//定义一个展示全部学生成绩的函数 {system("cls");struct Student *VA;if(head!=NULL)//头部等于空 说明里面存有数据 {printf("所有学生成绩如下:\n");for(VA=head;VA!=NULL;VA=VA->next ){printf("学号:%s\t姓名:%s\t性别:%s\n",VA->number,VA->name,VA->sex);printf("语文:%d\t数学:%d\t英语:%d\n",VA->Chinese,VA->Math,VA->English);}}else{printf("该系统中还未录入信息");}system("pause");}void Repair()//修改 函数 {system("cls");struct Student *RS;char num[10];int repa = 1;printf("输入要修改成绩学生的学号:\n");scanf("%s",num);for(RS=head;RS!=NULL;RS=RS->next){if(strcmp(RS->number,num)==0)//寻找节点 {printf("成功找到该学生");printf("学号:%s\t姓名:%s\t性别:%s\n",RS->number,RS->name,RS->sex);printf("语文:%d\t数学:%d\t英语:%d\n",RS->Chinese,RS->Math,RS->English);repa = 0;printf("学号:\n");scanf("%s",&RS->number);//RS是新定义的结构体指针 把RS中数据传到之前的里面 printf("姓名:\n");scanf("%s",&RS->name);printf("性别:\n");scanf("%s",&RS->sex);printf("语文成绩:\n");scanf("%d",&RS->Chinese);printf("数学成绩:\n");scanf("%d",&RS->Math);printf("英语成绩:\n");scanf("%d",&RS->English);printf("修改成功");system("pause");}}if(repa){printf("输入信息有误,未查询到");system("pause");}}void Delete(){system("cls");int flag =1;while(flag){printf("请输入要删除的学生学号:");char num[10];scanf("%s",&num);struct Student * DS,*temp;//定义结构体指针 for(DS=head;DS!=NULL;){if(strcmp(DS->number,num)==0){if(DS==head)//如果DS是第一个节点 {head = DS->next;//DS的下一个是NULL当头 ,删除完毕 flag = 0;printf("删除成功!\n");system("pause");}else{flag = 0;printf("删除成功!\n");temp->next= DS->next;free(DS);//把DS这个空间释放 system("pause");}}temp = DS;DS=DS->next;}if(flag==1){printf("未找到该学生学号!\n");system("pause");break;}}}int main(){ system("color 72");//运行框颜色改变system(" mode con cols=66 lines=33");//运行框大小改变int choice;printf("请选择要使用的功能:\n"); while(1)//循环 {Menu();//每次循环都会调用 这个函数让主屏幕上显示     scanf("%d",&choice);switch (choice) {case 1:Add();break;case 2:View();break;case 3:ViewAll();break;case 4:Repair();break;case 5:Delete();break;case 6:exit(0);//退出 break;default:printf("输入有误,请重新选择:");     }    system("cls");//每次查找结束 会清空屏幕信息  }}