该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
RT,希望各位大神帮一下
#include
#include
struct student
{
int num;
int grade;
struct student *next;
};
int list(int i)
{
printf("请选项下列功能:\n");
printf("1 打印\n");
printf("2 增加\n");
printf("3 删除\n");
printf("4 更改\n");
printf("5 查询\n");
printf("6 关闭程序\n");
scanf("%d",&i);
return i;//返回i才能在后面的switch中用
}
void print(struct student *k)
{
printf("列表结果是:\n");
printf("学号 成绩\n");
while (k!=NULL)
{
printf("%d %d\n",k->num,k->grade);
k=k->next;
}
}
void add(struct student *k)
{
int i;
struct student *a;
printf("请输入你要增加到哪个学生后面:\n");
scanf("%d",&i);
while(k!=NULL)/*while语句的原型是while(表达式)语句,当表达式为非0值时,执行while语句中的嵌套语句。
那么while(1)其中1代表一个常量表达式,他永远不会等于0。所以,循环会一直执行下去。除非你设置break等类似的跳出循环语句循环才会中止*/
{
if (k->num==i)
{
struct student *knext;
knext=k->next;
a=(struct student *)malloc(sizeof(struct student));
printf("请输入新增加学生的学号和成绩:\n");
scanf("%d %d",&a->num,&a->grade);
k->next=a;
a->next=knext;
printf("添加同学%d成功\n",a->num);
break;//因为是while(1),在添加成功后要手动停止
}
else if(k->num!=i)//在没有找到i同学或者最后一项之前都进行循环
{
printf("未找到此学生!\n");
break;
}
k=k->next;
}
}
void delet(struct student *k)
{
int i;
printf("请问你要删除哪个学生\n");
scanf("%d",&i);
while(1)//加循环
{
//struct student *forward;把要删除的k结构体和它前面一项建立关系
if(k->next->num==i)
{
//forward=k;
k->next=k->next->next;
printf("删除同学%d成功!\n",i);
break;
}
else if(k!=NULL)
{
printf("未找到学生\n");
break;
}
k=k->next;
}
}
void change(struct student *k)
{
int i,j;
printf("请输入你要修改的学生学号:\n");
scanf("%d",&i);
while(1)//加循环
{
if (k->num==i)
{
printf("请输入你要修改的内容:\n1.学号 2.成绩 3.学号和成绩\n");
scanf("%d",&j);
switch(j)
{
case 1:printf("学号是:");scanf("%d",&k->num);break;//取地址符?
case 2:printf("成绩是:");scanf("%d",&k->grade);break;
case 3:printf("学号和成绩是:");scanf("%d %d",&k->num,&k->grade);break;
default:break;
}
printf("修改同学%d成功!",k->num);
break;
}
else if (k->num!=i)
{
printf("未找到此同学!\n");
break;
}
k=k->next;
}
}
void find(struct student *k)
{
int i;
printf("请输入你要查询的学生学号:\n");
scanf("%d",&i);
while(1)//加循环才能依次查找
{
if (k->num==i)
{
printf("你想查找的学生信息为:\n学号:%d 成绩:%d\n",k->num,k->grade);
break;
}
else if (k==NULL)
{
printf("未找到此同学!\n");
}
k=k->next;
}
}
int main()
{
struct student *head,*a,*b;
int n,i=1;//给i赋初值
n=0;
b=a=(struct student *)malloc(sizeof (struct student));
printf("请输入学生的学号和成绩\n");
head=NULL;
scanf("%d %d",&a->num,&a->grade);//去掉\n
while(a->num!=0)
{
n++;
if(n==1)
{
head=a;//把输入第一项a的地址转给head,同时由于下面n=2时的else操作中a和b的next链接,使得当b,head为第一项地址,a为第二项地址时,b->next=a等效于head->=a,从而达成head和第二项链接成功
}
else if(n!=1)
{
b->next=a;//b的下一项是a,next这个指针相当于钩子链接了a和b
}
b=a;//相当于a和b去搭桥,a去开拓,b在上一处接绳子
a=(struct student *)malloc(sizeof(struct student));
printf("请输入学生的学号和成绩\n");
scanf("%d %d",&a->num,&a->grade);//去掉\n
}//一旦输入a->num=0,就结束了输入名单
b->next=NULL;
while ((i=list(i))!=6)//这样赋值才能把选择赋给main函数中的i
{
switch(i)
{
case 1: print(head); break;
case 2: add(head); break;
case 3: delet(head); break;//delete与头文件中的函数重名了
case 4: change(head); break;
case 5: find(head); break;
default: break;
}
}
free(head);
return 0;
}