c语言编辑删除学生,用C语言编辑一个学生管理系统,是链表,在add和delete出了问题...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值