NullAerber 2015-10-12 07:36 采纳率: 100%
浏览 1608
已采纳

关于“学生管理系统”这个程序编程的一些问题

#include
#include

typedef struct student
{
int num;
int score;
struct student *next;

}student;

void add(student *s)//全局的增加函数
{
printf("请输入学生学号与分数:\n");
scanf("%d %d",&s->num,&s->score);
}

void print(student *head)
{
printf("--------------打印--------------\n");
printf("学号 分数\n");
while((head=head->next)!=NULL)
{
printf("%d %d\n",head->num,head->score);
}
printf("打印成功!\n");
printf("--------------------------------\n");
//printf("按回车键继续");
//char a;
//scanf("%c",&a);

}

void mDelete(student *s)//先定义一个函数,函数的参数s是studen类,s是已存入num和grade的指针,s是我们需要删掉的对象
{
int num;
printf("--------------删除--------------\n");
printf("请输入要删除学生的学号:");
scanf("%d",&num);
while(s!=NULL)//当存在这么一个我们需要的结构体s的不为空指针
{
struct student *last=s;//定义一个student类的变量为last,把参数s的num和grade赋给last
s=s->next;//把指针s下一项的地址给s
if(s->num==num)
{
last->next=s->next;//把s的前一项和s的后一项直接相连接
printf("删除学生%d成功!\n",num);
printf("--------------------------------\n");
return;
}

}
printf("未找到学生%d!\n",num);
printf("--------------------------------\n");

}

void mAdd(student *s)//先定义一个函数,函数的参数s是studen类,s是已存入num和grade的指针,s是我们增加的前一名同学
{
int num;//声明用于计数的num
printf("--------------添加--------------\n");
printf("请输入要添加到哪个学生之后:");
scanf("%d",&num);
while(s!=NULL)//当参数不为空指针时开始循环
{
struct student *next=s->next;//声明一个next的指针,把已经确定的s的下一项的地址给指针next
if(s->num==num)//寻找满足输入num数字条件的那个结构体,用if语句来确定某个确定的结构体
{
student *a=(student *)malloc(sizeof(student));//给新同学开辟内存a是我们新增加的同学
add(a);
num=a->num;//把新同学的的学号给刚刚输入的号码
s->next=a;//链接
a->next=next;
printf("添加学生%d成功!\n",num);//可以把num改成a->num
printf("--------------------------------\n");
return;
}
s=next;//没懂,考虑删除换成直接打印“未找到”//s=next;就是跟i++类似的,让循环继续下去,否则会死循环,不会结束。
}
printf("未找到学生%d!\n",num);
printf("--------------------------------\n");
}

void update(student *s)
{
int num;
printf("--------------更新--------------\n");
printf("请输入要更新的学生的学号:");
scanf("%d",&num);
while(s!=NULL)
{
if(s->num==num)
{
printf("输入学生%d的新分数:\n",num);
scanf("%d",&s->score);
printf("更新学生%d成功!\n",num);
printf("--------------------------------\n");
return;
}
s=s->next;
}
printf("未找到学生%d!\n",num);
printf("--------------------------------\n");
}

void findScore(student *s)
{
int num;
printf("--------------查找--------------\n");
printf("请输入要查找的学生学号:");
scanf("%d",&num);
while(s!=NULL)
{
if(s->num==num)
{
printf("查找成功!\n学生%d的分数为%d\n",num,s->score);
printf("--------------------------------\n");
return;
}
s=s->next;
}
printf("未找到学生%d!\n",num);
printf("--------------------------------\n");
}

void findNum(student *s)
{
int score;
printf("--------------查找--------------\n");
printf("请输入要查找的成绩:");
scanf("%d",&score);
printf("分数为%d的学生学号为:\n",score);
while(s!=NULL)
{
if(s->score==score)
{
printf("%d\n",s->num);
}
s=s->next;
}
printf("查找完毕!\n");
printf("--------------------------------\n");
}

int printFunction()
{
printf("============================\n");
printf("输入以下数字执行对应功能:\n");
printf("1.打印\n");
printf("2.删除\n");
printf("3.添加\n");
printf("4.更新\n");
printf("5.查找分数\n");
printf("6.查找学生\n");
printf("7.退出\n");
printf("============================\n\n");
printf("输入你的选择:");
int a=0;
scanf("%d",&a);
return a;
}

student *create()
{
student *head,*a,*b;
head=(student *)malloc(sizeof(student));
a=b=(student *)malloc(sizeof(student));
add(a);
head->num=0;
head->score=0;
head->next=a;
while(a->num!=0)
{
b=a;
a=(student *)malloc(sizeof(student));
add(a);
b->next=a;
}
b->next=NULL;
return head;
}

int main()
{
puts("这是一个链表测试工程。");
student *head;
head=create();
int choose;
while((choose=printFunction())!=7)
{
switch(choose)
{
case 1: print(head); break;
case 2: mDelete(head); break;
case 3: mAdd(head); break;
case 4: update(head); break;
case 5: findScore(head); break;
case 6: findNum(head); break;
default: break;
}
}
free(head);
return 0;
}

为什么需要用while来循环。

  • 写回答

2条回答 默认 最新

  • lx624909677 2015-10-12 10:30
    关注

    你用的是链表,链表需要自己去控制遍历,while的作用就是遍历你的链表,知道遍历到链表结束为止

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器