想写一个学生成绩管理系统,写了几个函数了;到链表节点的删除函数是,无论想删那个学号,都删的是第一个,感觉程序没问题啊,希望帮忙给找找错误
代码如下
主函数
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
#define LEN sizeof(struct Student)
#include"声明.h"
#include"自定义函数.h"
int main(void)
{
char s[15];
while(1)
{
printf("请输入功能编号完成相应功能\n");
printf("1.输入学生信息并保存\n");
printf("2.从文件中读取学生信息,并建立链表\n");
printf("3.按学号删除学生信息\n");
printf("4.按学号插入学生信息\n");
printf("5.显示当前文件信息\n");
printf("6.查找总成绩最高的学生\n");
printf("7,寻找指定学号或姓名的学生并修改该学生信息 \n");
printf("8.查找某个专业、某门课程的成绩小于某个分数的学生\n");
printf("9.删除某个班级、某门课程的成绩小于某个分数的学生\n");
printf("10.按照姓名排序\n");
printf("11.保存当前信息\n");
printf("其他,推出系统\n");
int x;
struct Student *h;
char y[15];
printf("亲输入编号:");
scanf("%d",&x);
switch(x)
{
case(1):
h=input();
save(h);
break;
case(2):
printf("请输入要查找的文件名:\n");
getchar();
gets(s);
h=creatlist(s);
printf("\n");
printf("注册链表成功\n");
break;
case(3):
printf("请输入要删除的学生的学号:\n");
scanf("%s",y);
h=del(h,y);
break;
case(5):
printf("当前信息如下:\n");
print(h);
break;
}
}
return 0;
}
自定义函数
struct Student * input()
{
n=0;
printf("请输入学生人数:");
scanf("%d",&a);
printf("请录入这%d名学生的信息:\n",a);
struct Student *head;
struct Student *p1,*p2;
head=(struct Student *)malloc(LEN);
while(n<a)
{
p1=(struct Student*)malloc(LEN);
scanf("%s%s%s%d%d%d%d",p1->num,p1->name,p1->major,&p1->classNo,&p1->score[0],&p1->score[1],&p1->score[2]);
p1->sum=0;
p1->sum=p1->score[0]+p1->score[1]+p1->score[2];
n++;
if(n==1)
{
head->next=p1;
p2=p1;
}
else
{
p2->next=p1;
p2=p1;
}
p2->next=NULL;
}
return head;
}
void save(struct Student *head)
{
struct Student *p1;
p1=head->next;
char s[15];
FILE *fp;
printf("请输入要建立的文件的名称:\n");
scanf("%s",s);
if((fp=fopen(s,"wb"))==NULL)
{
printf("打开文件失败");
exit(0);
}
while(p1!=NULL)
{
if(fwrite(p1,LEN,1,fp)!=1)
{
printf("写入文件失败\n");
}
p1=p1->next;
}
printf("写入文件成功!\n");
fclose(fp);
}
struct Student *creatlist(char *s)
{
FILE *fp;
struct Student *p1,*p2,*head;
if((fp=fopen(s,"rb"))==NULL)
{
printf("打开文件失败");
exit(0);
}
head=(struct Student *)malloc(LEN);
p1=(struct Student *)malloc(LEN);
if((fread(p1,LEN,1,fp))==0)
{
printf("wrong\n");
exit(0);
}
head->next=p1;
p2=p1;
while(p1->next!=NULL)
{
p1=(struct Student *)malloc(LEN);
fread(p1,LEN,1,fp);
p2->next=p1;
p2=p1;
}
return (head);
}
struct Student *del(struct Student *head,char *s)
{
struct Student *p1,*p2;
p2=head;
p1=head->next;
int w=atoi(s),e=atoi(p1->num);
while(w!=e&&p1->next!=NULL)//判断是否符合条件
{
p2=p2->next;
p1=p1->next;
e=atoi(p1->num);
}
p2->next=p1->next;
return head;
}
void print(struct Student*head)
{
struct Student *p;
printf("\n学号\t姓名\t专业 \t\t班级 成绩0 成绩1 成绩2 \t");
p=head->next;//从第二个开始打印
while(p!=NULL)
{
printf("\n%s\t%-6s\t%-10s\t%d\t%d\t%d\t%d\t", p->num, p->name, p->major,p->classNo,p->score[0],p->score[1],p->score[2]);
p=p->next;//循环
}
printf("\n");
}
函数声明
struct Student {
char num[10];//学号
char name[15];//姓名
char major[10];//专业computer,softwear,network
int classNo;//班级
int score[3];//3门课的成绩
int sum;//3门课的总成绩
struct Student *next;//指针 88u
};
int n,a;
struct Student * input();
struct Student *creatlist(char *s);
void save(struct Student *head);
void print(struct Student*head);
struct Student *del(struct Student *head,char *s);