user-0 提问: 【新人】用链表创建学生管理系统【重问求解救】

回复:
user: user-1
content: 没毛病啊，程序一开始把header置为NULL，然后传进函数里，函数里判断为NULL，提示这句话

user: user-0
content: 点进插入学生信息时，显示链表为空将数据插入到链表头，是哪里出问题了，需要补全？

user: user-2
content: 以上代码是改好的，建议你测试一下；源码逻辑有问题，链表需要多学习下；

user: user-2
content: 个人建议： 1. 定义变量不建议使用下划线开头；只有系统里的或者内核里的变量名或者函数名才使用； 2. 宏定义没有最后面的;号，不建议加； 3. 注释不一定都要加，注释越少约好（需要在定义函数，变量时见名知义），可以加少量的注释，但是不能加错误的注释； 4. 成绩使用单精度就可以了，双精度会浪费； 5. 菜单功能描述不清晰； #include <stdio.h> #include <stdlib.h> #include <string.h>  struct stu_base {     char _No[10];     float _Chinese;     float _Mathematics;     float _English;     float _Average;     struct stu_base *_next; };  typedef struct stu_base _stu;  _stu *_header = NULL;  #define _cout(STU) printf("学号:%s,语文:%.1f,数学:%.1f,英语:%.1f,平均分:%.1f\n",STU->_No,STU->_Chinese,STU->_Mathematics,STU->_English,STU->_Average)  void init_stu(_stu *_stu_init) {     memset(_stu_init->_No, 0, sizeof(_stu_init->_No));     _stu_init->_Chinese = _stu_init->_English = _stu_init->_Mathematics = _stu_init->_Average = 0.0;     _stu_init->_next = NULL; }  void insert_stu(_stu *_list) {     char _No[10];     float _Chinese;     float _Mathematics;     float _English;     float _Average;      printf("请分别输入学号 语文成绩 数学成绩 英语成绩\n");     scanf("%s %f %f %f", _No, &_Chinese, &_Mathematics, &_English);     _Average = (_Chinese + _Mathematics + _English) / 3.0;     _stu *_list_1 = (_stu *)malloc(sizeof(_stu));      init_stu(_list_1);     strcpy(_list_1->_No,_No);     _list_1->_Chinese = _Chinese;     _list_1->_Mathematics = _Mathematics;     _list_1->_English = _English;     _list_1->_Average = _Average;     _list_1->_next = NULL;     if (!_list)     {         printf("链表为空。将数据插入到链表头\n");         _header = _list_1;     } else {         printf("请输入在哪个学号之后插入\n");         scanf("%s", _No);         _stu *header = _list;         _stu *header_next = _list->_next;         while (header_next && strcmp(header->_No, _No))         {             header = header_next;             if (header == NULL)             {                 printf("找不到数据，插入失败\n");                 free(_list_1);                 return;             }             header_next = header->_next;         }          _list_1->_next = header_next;         header->_next = _list_1;     }      printf("插入数据成功\n");  } void lookup_stu(_stu *_list)//往链表里面查找学生信息 {  } void modify_stu(_stu *_list)//往链表里面修改某个学生信息 {  } void delete_stu(_stu *_list)//往链表里面删除学生信息 {  } void All_output_stu(_stu *_list)//以平均分高低输出链表中所有学生的信息 {     /*TEST*/     _stu *header = _list;      while (header) {         _cout(header);         header = header->_next;     } } void Exit_routine(_stu *_list)//退出程序,删除所有结点 {     _stu *p, *q;      p = _list;     while (p) {         q = p->_next;         free(p);         p = q;     } }  void menu(void) {     printf("欢迎使用学生管理系统\n");     printf("1.插入学生信息\n");     printf("2.查找学生信息\n");     printf("3.修改某个学生信息\n");     printf("4.删除学生信息\n");     printf("5.以平均分高低输出所有学生的信息\n");     printf("6.退出程序\n"); } int main() {     int _switch;     while (1)     {         menu();         printf(">>>");         scanf("%d",&_switch);         switch (_switch)         {             case 1:                 insert_stu(_header);                 break;             case 2:                 lookup_stu(_header);                 break;             case 3:                 modify_stu(_header);                 break;             case 4:                 delete_stu(_header);                 break;             case 5:                 All_output_stu(_header);                 break;             case 6:                 Exit_routine(_header);                 break;             default:                 printf("选择有误，请重新输入\n");                 fflush(stdin);                 break;         }     }      return 0; }