该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
太多了贴一部分,主要是删除算法,主方法的上一个
#include
#include
#include
typedef struct Student/*结构体是一种构造数据类型,可以由若干个成员组成*/
{
char name[20]; //姓名
char ID[30]; //学号
char sex[20]; //性别
int c; //c语言成绩
int math; //数学成绩
int eng; //英语成绩
float average; //平均分
int sum; //总分
};
//单链表的存储结构
typedef struct LNode
{
Student stu; //学生信息
struct LNode *next;
}*LinkLinst;
//创建链表,输入学生信息,后插法
void InitList(LinkLinst &L) //构造一个空链表
{
L=new LNode; //建立头结点
L->next=NULL;
}
//学生信息数目/链表的长度
int length(LinkLinst &L)
{
int len=0;
LinkLinst p;
p=L->next; //指向首元结点
while(p)
{
len++;
p=p->next;
//指向最后一个结点
}
return len;
}
//录入m个学生信息,尾插法
void input(LinkLinst &L,int len,int m)
{
length(L);
LinkLinst p;
p=L; //指向头结点
if(p->next!=NULL)
{
for(int j=1;j<=len;j++)
{
p=p->next;
}
}
for(int i=1;i<=m;i++)
{ LinkLinst w=(LinkLinst)malloc(sizeof(LNode)); //动态分配空间,存储学生信息
printf("请输入学生的姓名:");scanf("%s",&w->stu.name);getchar();
printf("请输入学生的学号:");scanf("%s",&w->stu.ID);getchar();
printf("请输入学生的性别:");scanf("%s",&w->stu.sex);getchar(); //字符的输入函数
printf("请输入学生的数学分数:");scanf("%d",&w->stu.math);
printf("请输入学生的c语言分数:");scanf("%d",&w->stu.c);
printf("请输入学生的英语分数:");scanf("%d",&w->stu.eng);
w->stu.sum=w->stu.c+w->stu.eng+w->stu.math ;
printf("学生的总分是:%d\n",w->stu.sum);
w->stu.average=w->stu.sum/3.0;
printf("学生的平均分是:%.2lf\n",w->stu.average);
p->next=w;
p=w;
w->next=NULL;
}
printf("学生信息录入成功!\n");
}
//修改学生信息
void change(LinkLinst L)
{
printf("您要修改信息的学生学号是?");
char id[10];
scanf("%s",&id);
getchar();
LinkLinst p;
p=L->next;
while(1)
{
if(p&&strcmp(p->stu.ID,id)!=0)
p=p->next;
if(p==NULL)
{printf("没有该学生的成绩\n");break;}
if(strcmp(p->stu.ID,id)==0)
{
printf("请输入学生的姓名:");scanf("%s",&p->stu.name);getchar();
printf("请输入学生的学号:");scanf("%s",&p->stu.ID);getchar();
printf("请输入学生的性别:");scanf("%s",&p->stu.sex);getchar(); //字符的输入函数
printf("请输入学生的数学分数:");scanf("%d",&p->stu.math);
printf("请输入学生的c语言分数:");scanf("%d",&p->stu.c);
printf("请输入学生的英语分数:");scanf("%d",&p->stu.eng);
p->stu.sum=p->stu.c+p->stu.eng+p->stu.math ;
printf("学生的总分是:%d\n",p->stu.sum);
p->stu.average=p->stu.sum/3.0;
printf("学生的平均分是:%.2lf\n",p->stu.average);
break;
}
}
}
//删除学生信息
void initDelete(LinkLinst &L,int len)
{
printf("您要删除信息的学生学号是?");
char id[10];
scanf("%s",&id);
getchar();
LinkLinst p;
LinkLinst q;
LinkLinst r;
p=L;
while(1)
{
q=p; //q指向被删结点的前一个结点
p=p->next;
if(p==NULL)
{printf("没有该学生的成绩\n");break;}
if(strcmp(p->stu.ID,id)==0)
{
r=p; //临时保存被删结点的地址以备释放
q->next=r->next; //改变删除结点前驱结点的指针域
free(p);
printf("信息删除成功!\n");
break;
}
}
}
void main()
{
int a; //项目序号
int n; //输入的学生信息数目
int m; //插入的学生信息数目
char i;
LinkLinst L;
InitList(L); //创建链表
do
{
printf(" 欢迎进入学生成绩查询系统 \n");
printf("\n 请选择功能列表 \n");
printf("\n 1 录入学生信息 ");
printf("\n 2 已经录入信息的学生人数 ");
printf("\n 3 按姓名查找学生成绩 ");
printf("\n 4 按学号查找学生成绩 ");
printf("\n 5 查找不及格学生成绩 ");
printf("\n 6 统计学生成绩等级人数 ");
printf("\n 7 学生成绩排序 ");
printf("\n 8 输出学生信息 ");
printf("\n 9 修改学生信息 ");
printf("\n 10 删除学生信息 ");
printf("\n");
printf("\n输入您要选择项目的序号:");
scanf("%d",&a);
switch(a)
{
case 1:
{
printf("您要录入的学生信息数目是?");
scanf("%d",&m);
int l=length(L);
input(L,l,m);
}
break;
case 2:
{
printf("学生人数是:%d\n",length(L));
}break;
case 3:
searchname(L); break;
case 4:
searchID(L); break;
case 5:
nopass(L); break;
case 6:
rank(L);break;
case 7:
paixu(L);break;
case 8:
out(L);break;
case 9:
change(L); break;
case 10:
{int l=length(L);
initDelete(L,l); break;}
}
printf("是否继续(y/n)");
if(getchar()=='n') break;
}while(getchar()=='y');
}