关于学生管理平台怎么在运用链表的情况下修改结构体里的数据并且能够打印出来
//////////////////////
这是我修改数据之前的代码,只有姓名年龄学号成绩,但是最终的程序是要加一个等级的,等级是lg(成绩+1)这样算的
#include <stdio.h>
#include<conio.h>
#include<stdlib.h>
#include <string.h>
#include <math.h>
typedef struct _Student
{
char name[20];// 姓名
int age; //年龄
int stuNum;//学号
int score;//成绩
}Student;
//链表(车厢)
typedef struct _Node
{
Student stu; //学生
struct _Node* pNext;//指向下一个节点的指针
}Node;
//头结点
Node* g_pHead = NULL; //头结点
然后我就想知道,我这样改行不行,
typedef struct _Student
{
char name[20];// 姓名
int age; //年龄
int stuNum;//学号
int score;//成绩
double Level;//定义等级
}Student;
这个结构体在录入学生成绩,修改学生成绩时需要用到的,接下来我就要展示我的录入学生成绩和修改学生成绩,由于我链表不是太精通,而且我也是在别的大佬的帮助下用的链表,所以请各位能不能用链表(顺着这个思路帮我修改一下)
这是录入学生信息并打印,这一个我运行正常了,可以给你们看下面的截图
//录入学生信息
void InputStudent() {
char charge; //准备打印学生信息
//创建一个新节点
Node* pNewNode = (Node*)malloc(sizeof(Node));
pNewNode->pNext = NULL;
//头插法链表
if (g_pHead == NULL) //没有头
{
g_pHead = pNewNode; //定义一个头
}
else
{
pNewNode->pNext = g_pHead;
g_pHead = pNewNode;
}
printf("请输入学生姓名:\n");
scanf("%s", pNewNode->stu.name);
printf("请输入学生的年龄:\n");
scanf("%d", &pNewNode->stu.age);
printf("请输入学生的学号:\n");
scanf("%d", &pNewNode->stu.stuNum);
printf("请输入学生的成绩:\n");
scanf("%d", &pNewNode->stu.score);
printf("学生信息录入成功\n");
system("pause");//画面停留
//清屏
system("cls");
}
void PrintStudent() //打印学生信息
{
system("cls");
printf("-----------------------------------------------------——---------------\n");
printf("-- 欢迎使用学生管理平台(超级无敌牛逼版vol.2) --\n");
printf("------------------------------------------------------------------------\n");
printf("-- -学号- -姓名- -年龄- -成绩- -等级- -积分 --\n");
printf("------------------------------------------------------------------------\n");
//遍历链表
Node* p = g_pHead;
while (p != NULL)//只要节点不到头就一直往下打印
{
double Level = log10(p->stu.score + 1);
printf("-- -%d- -%s- -%d- -%d- -%.0f- -%d- --\n",
p->stu.stuNum,
p->stu.name,
p->stu.age,
p->stu.score,
Level,
p->stu.score);
p = p->pNext;
}
system("pause");//画面停留
//清屏
system("cls");
}
//保存学生信息
可是问题就出现在如何修改学生信息的时候这个等级也会跟着变化,比如小明的100分,我要修改为60分,这样下去,按照正确的代码的话应该等级降为1级,但是我的bug就在这里出现了
首先给你们看修改前的源码
//修改学生信息
void ModifyStudent()
{
int nStuNum;
printf("请输入需要修改学生信息的学号:\n");
scanf("%d", &nStuNum);
Node* p = g_pHead;
while (p != NULL)
{
if (p->stu.stuNum == nStuNum)
{
printf("请输入要修改的学生的姓名 年龄 成绩:\n");
scanf("%s %d %d", p->stu.name, &p->stu.age, &p->stu.score);
printf("修改成功\n");
break;
}
p = p->pNext;
}
if (p == NULL)
{
printf("没有找到该学生的信息\n");
}
system("pause"); //画面停留
system("cls"); //清屏
}
这样如果运行的话,修改的成绩并不会影响等级,然后我就进行了如下的修改
//修改学生信息
void ModifyStudent()
{
int nStuNum;
printf("请输入需要修改学生信息的学号:\n");
scanf("%d", &nStuNum);
Node* p = g_pHead;
while (p != NULL)
{
if (p->stu.stuNum == nStuNum)
{
printf("请输入要修改的学生的姓名 年龄 成绩:\n");
scanf("%s %d %d", p->stu.name, &p->stu.age, &p->stu.score);
p->stu.Level = log10(p->stu.score + 1); //**看这里看这里,这个就是我修改的地方,我直接把这个p指向的Level给这么赋值行不行,主要我真的不太懂,请大家帮忙改动__**
printf("修改成功\n");
break;
}
p = p->pNext;
}
if (p == NULL)
{
printf("没有找到该学生的信息\n");
}
system("pause"); //画面停留
system("cls"); //清屏
}
这次运行的结果出错了,等级仍未变为1级,反而还是2级,截图如下
_修改前_
/////////////////////////////////
所以我的问题就在这里,请各位帮忙,如果能找出我的错误,我不胜感激
等级不用处理。在输出时再处理就行了。