帮忙看看注释对不啊
#include <stdio.h>#include <conio.h>
typedef struct student //定义结构体
{
int num; //定义整形变量
char name[20]; //定义字符串数组
char sex; //定义字符串变量
int age; //定义整形变量
int dormitory_num; //定义整形变量
float score; //定义浮点形变量
struct student *nextstu; //定义结构体变量
}STU_INFO;
STU_INFO *head;//定义结构体类型的指针变量
STU_INFO *rear;//定义结构体类型的指针变量
int i = 0; //i为记录学生个数的全局变量
int insert_stu(void);/*插入信息*/
int delete_stu(void);/*删除信息*/
int print_stu(void);/*输出信息*/
int judge_stu(int j_num);/*判断学号是否重复*/
STU_INFO *link_stu(STU_INFO *p_link, int insert_num);/*学生信息连接*/
int main(void)
{
int key = 0; //定义整形变量且赋值
STU_INFO *p_stu = NULL; //将结构体变量置空
head = (STU_INFO *)malloc(sizeof(STU_INFO)); //调用函数为head申请空间
head->nextstu = NULL; //将heed->nextstu置空
while(1) //while函数条件为真执行,为假退出
{
printf("************************\n");
printf("*1.插入学生信息 *\n");
printf("*2.删除学生信息 *\n");
printf("*3.输出学生信息 *\n");
printf("*4.将学生信息保存到文件*\n");
printf("*5.退出 *\n");
printf("************************\n");
printf("请选择:"); //输出请选择
scanf("%d",&key); //输入变量key的值
switch(key) //判断key的值
{
case 1: //为1进行下列判断
{
if(insert_stu()) //判断值为真
{
i++; //i增值
printf("\n插入成功!\n\n"); //输出插入成功
}
else
{
printf("\n插入失败!\n\n"); //否则输出插入失败
}
break; //返回
}
case 2: //为2进行下列判断
{
if(delete_stu()) //判断值为真
{
i--; //i减值
printf("\n删除成功!\n\n"); //输出删除成功
}
else
{
printf("\n删除失败!\n\n"); //否则输出删除失败
}
break; //返回
}
case 3: //为3进行下列判断
{
if(print_stu()) //判断值为真
{
printf("\n输出成功!\n\n"); //输出输出成功
}
else
{
printf("\n输出失败!\n\n"); //否则输出输出失败
}
break; //返回
}
case 4: //为4输出提示信息
{
printf("此功能目前未实现,敬请关注最新版本!\n\n"); //输出此功能目前未实现,敬请关注最新版本!
break;//返回
}
case 5: //为5输出提示信息
{
printf("感谢使用本软件,更多功能请注册!O(∩_∩)O\n"); //输出感谢使用本软件,更多功能请注册!O(∩_∩)O
exit();//退出
}
default:
{
printf("\n操作不正确,请重新选择!\n\n"); //都不满足输出操作不正确,请重新选择!
break;//返回
}
}
//clrscr();
}
}
int insert_stu(void) //函数声明
{
STU_INFO *p_insert; //声明指向指向结构体的变量
p_insert = (STU_INFO *)malloc(sizeof(STU_INFO)); //为p_insert开辟内存空间
printf("输入学号:"); //输出输入学号
scanf("%d",&p_insert->num); //输入p_inser的值
getchar(); //取得字符
if(i) //判断i的值
{
if(judge_stu(p_insert->num))//判断学号是否重复为真时
{
p_insert->nextstu = link_stu(p_insert,p_insert->num);//把输入的学号值赋给p_insert
}
else
{
free(p_insert);//否则释放空间
return 0;//返回0值
}
}
else
{
head->nextstu = p_insert;//把p_insert的节点值赋给head的下一元素
p_insert->nextstu = NULL;//p_insert的下一个值设为空
rear = p_insert;//把p_insert的值给rear
}
printf("输入姓名:");//输出输入姓名
scanf("%s",p_insert->name);//给p_insert->name输入值
getchar();//取得字符
printf("输入性别(m/f):");//输出输入性别(m/f)
scanf("%c",&p_insert->sex);//给p_insert->sex输入值
getchar();//取得字符
printf("输入年龄:");//输出输入年龄:
scanf("%d",&p_insert->age);//给p_insert->age输入值
getchar();//取得字符
printf("输入宿舍号:");//输出输入宿舍号:
scanf("%d",&p_insert->dormitory_num);//给p_insert->dormitory_num输入值
getchar();//取得字符
printf("输入成绩:");//输出输入成绩:
scanf("%f",&p_insert->score);//给p_insert->score输入值
return 1;//返回1
}
int delete_stu(void)//函数声明
{
STU_INFO *temp = head->nextstu;//temp记录临时结点
int delete_num = 0;//定义要删除的初始值为0
printf("要删除的学号是:");
scanf("%d",&delete_num); //将要删除的学号赋给delete_num
if(temp->num == delete_num)//判断要删除的学号与temp中的是否相等
{
head->nextstu = temp->nextstu;//把temp节点下一个元素赋给head->nextstu
free(temp);//释放temp
return 1;//返回1
}
else
{
while(temp->nextstu != NULL && temp->nextstu->num != delete_num)//当临时结点不为空和不等于要删除的学号时
{
temp = temp->nextstu;//把temp的下一个节点的值赋给temp
}
if(temp->nextstu == NULL)//当temp->nextstu的值为空时
{
printf("\n学号为 %d 的学生信息不存在 !",delete_num);//输出学号为delete_num的学生信息不存在
return 0;//返回0
}
else
{
temp->nextstu = temp->nextstu->nextstu;//把temp->nextstu临时节点的值赋temp->nextstu
free(temp);//释放temp
return 1;//返回0
}
}
return 0;//返回0
}
int print_stu(void)//函数声明
{
STU_INFO *temp = head->nextstu;//把head的下一个节点值赋给结构体类型的指针temp
if(temp != NULL)//判断temp不为空时
{
while(temp->nextstu != NULL)//当temp->nextstu的值不为空时
{
printf("学号:%3d,姓名:%-8s,",temp->num,temp->name);//输出学号temp->num,姓名temp->name
printf("性别:%c,年龄:%3d,",temp->sex,temp->age);//输出性别temp->sex年龄temp->age)
printf("宿舍号:%4d,成绩:%4.2f\n",temp->dormitory_num,temp->score);//输出宿舍号temp->dormitory_num,成绩temp->score
temp = temp->nextstu;//把temp的下一个节点的元素给temp
}
printf("学号:%3d,姓名:%-8s,",temp->num,temp->name);//输出学号temp->num,姓名temp->name
printf("性别:%c,年龄:%3d,",temp->sex,temp->age);//输出性别temp->sex年龄temp->age)
printf("宿舍号:%4d,成绩:%4.2f\n",temp->dormitory_num,temp->score);//输出宿舍号temp->dormitory_num,成绩temp->score
return 1;//返回1
}
else
{
return 0;//返回0
}
}
int judge_stu(int j_num)//函数声明
{
STU_INFO *temp = head->nextstu;//把head的下一个节点值赋给结构体类型的指针temp
while(temp->nextstu != NULL && temp->num != j_num)//当temp的下一个节点的值不为空和temp的值不为空时
{
temp = temp->nextstu;//把temp的下一个节点的元素值赋给temp
}
if(temp->num == j_num)//判断temp->num的值和j_num的值
{
return 0;//为真返回0
}
else
{
return 1;//否则返回1
}
}
STU_INFO *link_stu(STU_INFO *p_link, int insert_num)//定义结构体类型的link_stu形参为结构体类型的指针p_link和int类型的insert_sum
{
STU_INFO *temp; //temp记录临时节点位置
temp = head->nextstu;//把temp的下一个节点的元素值赋给temp
if(temp->num > insert_num)//判断当temp->num的值大于insert_num的值时
{
p_link->nextstu = head->nextstu;//把head的下一个节点的元素值赋给p_link的下一个节点
head->nextstu = p_link;//指针指向head的下一个元素
return p_link->nextstu;//返回指针的下一个节点的元素值
}
else
{
while(temp->nextstu != NULL)//当temp的下一个节点的元素值不等于空时
{
if(temp->num < insert_num && temp->nextstu->num > insert_num)//判断当temp的值小于insert的值或temp的下一个节点的值小于insert的值时
{
p_link->nextstu = temp->nextstu;//把temp的下一个节点的元素值赋给p_link的下一个节点
temp->nextstu = p_link;//把指针指向temp的下一个元素
return p_link->nextstu;//返回p_link的下一个节点的元素值
}
else
{
temp = temp->nextstu;//把temp的下一个节点的元素给temp
}
}
if(temp->num < insert_num)//当插入的学号大于temp中的学号时
{
rear->nextstu = p_link;//把指针指向rear的下一个节点的元素值
rear = p_link;//把p_link的值赋给rear
return NULL;//返回空
}
}
return NULL;//返回空
}