已经在VC6.0上运行确认:
#include
#include
#include
#include
typedef struct STUDENT
{
char studentNumber[20];/*学生学号*/
char studentName[20];/*学生姓名*/
char className[20];/*班级名称*/
float mark1;/*第1门成绩*/
float mark2;/*第2门成绩*/
float mark3;/*第3门成绩*/
struct STUDENT *next;
}STUDENT;
STUDENT *headLink; /*链表表头指针*/
/*函数声明*/
void ReadInfoFormFile();
void Menu();
void CreateHeadLink();
STUDENT *MallocNode();
void GetInformation(STUDENT *t);
void OutputInformation();
void DesplayInfoBystudentName();
void DesplayInfoBystudentNumber();
void DesplayOneNode(STUDENT *t);
void InsertOneNode(STUDENT *t);
void DeleteNodeBystudentNumber();
void ChangeMarkByName();
void ChangeMarkByNumber();
void SaveLinkToFile();
void paixu();
void DesplayMarkSegment();
int choose;/*用于接受用户的选择*/
/*主函数*/
void main()
{
printf("\n\t\t\t欢迎进入学生成绩管理系统\n\n\n");
printf("\t\t\t\tO(∩_∩)O\n\n\n\n");
printf("\t\t\t^_^\t\t\t^_^\n\n");
printf("\n\t\t 注意:请按照要求输入相应信息,谢谢!\n\n\n\n\n");
printf("\t\t\t 按任意键进入…………");
getch();
CreateHeadLink();
ReadInfoFormFile();
Menu();
}
/*从文件中读学生信息到链表中*/
void ReadInfoFormFile(void)
{
FILE *fp;
STUDENT *p;
fp=fopen("student.txt","r");
if(!fp)
{
printf("\n");
return;
}
p=MallocNode();
while(fscanf(fp,"%s%s%s%f%f%f",p->studentNumber,p->studentName,p->className,&(p->mark1),&(p->mark2),&(p->mark3))>0)
{
InsertOneNode(p);
p=MallocNode();
}
fclose(fp);
}
/*显示菜单,根据用户的输入完成相应的功能*/
void Menu(void)
{
STUDENT *p;
printf("\t\t (^o^)欢迎使用学生成绩管理系统(^o^)\n\n");
printf("\t ※--------------------请选择相应功能---------------------※\n\n");
printf("\t 1: 显示所有学生的信息 |");
printf(" \t 2: 按姓名查询 |\n\n");
printf("\t 3: 按学号查询 |");
printf(" \t\t 4: 增加学生 |\n\n");
printf("\t 5: 删除学生 |");
printf(" \t\t 6: 按姓名修改学生成绩 |\n\n");
printf("\t 7: 按学号修改学生成绩 |");
printf(" \t 8: 保存所有学生信息 |\n\n");
printf("\t 9: 按成绩输出学生信息 |");
printf("\t 10: 显示不及格及优秀学生 |\n\n");
printf("\t 11: 返回主菜单 |");
printf("\t\t 12: 退出 |\n\n");
printf("\t ※----------------------O(∩_∩)O------------------------※\n\n");
printf("\t 请输入对应数字:");
scanf("%d",&choose);/*取得用户的选择*/
switch(choose)
{
case 1:
OutputInformation();/*显示所有学生的信息*/
break;
case 2:
DesplayInfoBystudentName();
break;
case 3:
DesplayInfoBystudentNumber();/*根据用户输入的学号显示该学生的信息*/
break;
case 4:
p=MallocNode();/*先申请一个新结点*/
GetInformation(p);/*要求用户输入信息到新结点中*/
InsertOneNode(p);/*将新结点加到链表中*/
break;
case 5:
DeleteNodeBystudentNumber();/*根据用户输入的学号删除该学生*/
break;
case 6:
ChangeMarkByName();/*根据用户输入的姓名修改学生成绩*/
break;
case 7:
ChangeMarkByNumber();/*根据用户输入的学号修改学生成绩*/
break;
case 8:
SaveLinkToFile();/*保存数据*/
break;
case 9:
paixu();break;
case 10:
DesplayMarkSegment();break;
case 11:
break;
case 12:
SaveLinkToFile();/*保存数据后再退出*/
free(headLink);
break;
default: break;
}
Menu();/*递归调用*/
}
/*建立链表表头*/
void CreateHeadLink(void)
{
STUDENT *p;
p=(STUDENT*)malloc(sizeof(STUDENT));
headLink=p;
p->next=NULL;
}
/*申请一个新结点,并将其初始化*/
STUDENT *MallocNode(void)
{
STUDENT *p;
int i;
p=(STUDENT*)malloc(sizeof(STUDENT));
if(p==NULL)
return NULL;
for(i=0;i<10;i++)
memset(p->studentNumber,NULL,20);
for(i=0;i<20;i++)
memset(p->studentName,NULL,20);
for(i=0;i<20;i++)
memset(p->className,NULL,20);
p->mark1=0.0;
p->mark2=0.0;
p->mark3=0.0;
p->next=NULL;
return p;
}
/*取得用户输入的学生信息*/
void GetInformation(STUDENT *t)
{
printf("请输入学生学号:");
scanf("%s",t->studentNumber);
printf("请输入学生姓名:");
scanf("%s",t->studentName);
printf("请输入该生所在班级:");
scanf("%s",t->className);
printf("请输入第1门成绩:");
scanf("%f",&(t->mark1));
printf("请输入第2门成绩:");
scanf("%f",&(t->mark2));
printf("请输入第3门成绩:");
scanf("%f",&(t->mark3));
}
/*在链表的结尾处增加一个结点*/
void InsertOneNode(STUDENT *t)
{
STUDENT *p;
p=headLink;
while(p->next)
{
p=p->next;
}
p->next=t;
}
/*根据用户输入的学生姓名显示该学生的信息*/
void DesplayInfoBystudentName(void)
{
STUDENT *p;
char studentName[20];
char flag=0;
p=headLink->next;
printf("请输入学生姓名:");
scanf("%s",studentName);
while(p)
{
if(strcmp(p->studentName,studentName)==0)
{
printf("\t学号\t姓名\t班级\t成绩1\t成绩2\t成绩3\t总成绩\t平均成绩\n");
DesplayOneNode(p);
flag=1;
break;
}
p=p->next;
}
if(!flag) {
printf("\t 对不起,不存在姓名为 %s 的学生\n",studentName);}
}
/*根据用户输入的学号显示该学生的信息*/
void DesplayInfoBystudentNumber(void)
{
STUDENT *p;
char studentNumber[20];
char flag=0;
p=headLink->next;
printf("请输入学生学号:");
scanf("%s",studentNumber);
while(p)
{
if(strcmp(p->studentNumber,studentNumber)==0)
{
printf("\t学号\t姓名\t班级\t成绩1\t成绩2\t成绩3\t总成绩\t平均成绩\n");
DesplayOneNode(p);
flag=1;
break;
}
p=p->next;
}
if(!flag) {
printf("\t 对不起,不存在学号为 %s 的学生\n",studentNumber);
}}
/*输出一个结点的信息*/
void DesplayOneNode(STUDENT *t)
{
printf("\t%s\t",t->studentNumber);
printf("%s\t",t->studentName);
printf("%s\t",t->className);
printf("%.2f\t",t->mark1);
printf("%.2f\t",t->mark2);
printf("%.2f\t",t->mark3);
printf("%.2f\t",t->mark1+t->mark2+t->mark3);
printf("%.2f\t\n",(t->mark1+t->mark2+t->mark3)/3);
}
/*根据用户输入的学号删除该学生*/
void DeleteNodeBystudentNumber(void)
{
char studentNumber[10];
STUDENT *p,*q;
char flag=0;
printf("请输入要删除的学生学号:");
scanf("%s",studentNumber);
p=headLink;
q=headLink->next;
while(q)
{
if(strcmp(q->studentNumber,studentNumber)==0)
{
p->next=q->next;
free(q);
flag=1;
break;
}
p=p->next;
q=q->next;
}
if(!flag)
{
printf("\t 不存在该学号的学生\n");
return;
}
printf("\t 成功删除\n");
}
/*显示所有学生的信息*/
void OutputInformation(void)
{
STUDENT *p;
p=headLink->next;
if(p==NULL)
{
printf("\t 现在没有学生信息,请先输入学生信息\n\n");
return;
}
printf("\t学号\t姓名\t班级\t成绩1\t成绩2\t成绩3\t总成绩\t平均成绩\n");
while(p)
{
DesplayOneNode(p);
p=p->next;
}
}
/*根据输入的姓名修改成绩*/
void ChangeMarkByName(void)
{
STUDENT *p;
char studentName[20];
char flag=0;
float mark1,mark2,mark3;
p=headLink->next;
printf("请输入学生姓名:");
scanf("%s",studentName);
while(p)
{
if(strcmp(p->studentName,studentName)==0)
{
printf("请输入新的第1门成绩:\n");
scanf("%f",&mark1);
printf("请输入新的第2门成绩:\n");
scanf("%f",&mark2);
printf("请输入新的第3门成绩:\n");
scanf("%f",&mark3);
p->mark1=mark1;
p->mark2=mark2;
p->mark3=mark3;
flag=1;
printf("修改成功\n");
break;
}
p=p->next;
}
if(!flag) {
printf("\t 对不起,不存在姓名为 %s 的学生\n",studentName);
} }
/*根据输入的姓名修改成绩*/
void ChangeMarkByNumber(void)
{
STUDENT *p;
char studentNumber[20];
char flag=0;
float mark1,mark2,mark3;
p=headLink->next;
printf("请输入学生学号:");
scanf("%s",studentNumber);
while(p)
{
if(strcmp(p->studentNumber,studentNumber)==0)
{
printf("请输入新的第1门成绩:\n");
scanf("%f",&mark1);
printf("请输入新的第2门成绩:\n");
scanf("%f",&mark2);
printf("请输入新的第3门成绩:\n");
scanf("%f",&mark3);
p->mark1=mark1;
p->mark2=mark2;
p->mark3=mark3;
flag=1;
printf("修改成功\n");
break;
}
p=p->next;
}
if(!flag){
printf("\t 对不起,不存在学号为 %s 的学生\n",studentNumber);
}}
/*保存链表数据到文件中*/
void SaveLinkToFile(void)
{
STUDENT *p;
FILE *fp;
p=headLink->next;
if(p==NULL)
{
printf("\t 现在没有学生信息,请先输入学生信息\n\n");
return;
}
fp=fopen("student.txt","w+");
if(!fp)
{
printf("文件不存在\n");
return;
}
while(p)
{
fprintf(fp,"%s %s %s %f %f %f\n",p->studentNumber,p->studentName,p->className,p->mark1,p->mark2,p->mark3);
p=p->next;
}
fclose(fp);
}
/*显示优秀和不及格学生成绩*/
void DesplayMarkSegment(void)
{
STUDENT *p;
int count=0;
p=headLink->next;
printf("\t60分以下(不及格)的学生成绩如下:\n");
printf("\t学号\t姓名\t班级\t成绩1\t成绩2\t成绩3\t总成绩\t平均成绩\n\n");
while(p)
{
if((6>((int)(p->mark1/10)))||(6>((int)(p->mark2/10)))||(6>((int)(p->mark3/10))))/*只要有一科不及格就认为该生不及格*/
{
count++;
DesplayOneNode(p);
}
p=p->next;
}
printf("\t不及格的学生一共有%d人\n",count);
p=headLink->next;
printf("\t成绩优秀的学生成绩如下:\n");
printf("\t学号\t姓名\t班级\t成绩1\t成绩2\t成绩3\t总成绩\t平均成绩\n\n");
count=0;
while(p)
{
if((8<=((int)(p->mark1/10)))&&(8<=((int)(p->mark2/10)))&&(8<=((int)(p->mark3/10))))
{
count++;
DesplayOneNode(p);
}
p=p->next;
}
printf("\t成绩优秀的学生一共有%d人\n",count);
}
/*按总成绩排序*/
void paixu(void)
{
STUDENT exchange,*r,*p,*q;
r=headLink->next;
if(r==NULL)
{
printf("\t 现在还没学生信息,请先输入学生信息\n");
return;
}
while(r)/*两层while循环实现排序*/
{
p=r;
q=r->next;
while(q)
{
if((q->mark1+q->mark2+q->mark3)>(p->mark1+p->mark2+p->mark3))
{
strcpy(exchange.studentNumber,q->studentNumber);/*先复制q结点信息到exchange*/
strcpy(exchange.studentName,q->studentName);
strcpy(exchange.className,q->className);
exchange.mark1=q->mark1;
exchange.mark2=q->mark2;
exchange.mark3=q->mark3;
strcpy(q->studentNumber,p->studentNumber);/*再复制p结点信息到q*/
strcpy(q->studentName,p->studentName);
strcpy(q->className,p->className);
q->mark1=p->mark1;
q->mark2=p->mark3;
q->mark3=p->mark3;
strcpy(p->studentNumber,exchange.studentNumber);/*最后复制exchange结点信息到p*/
strcpy(p->studentName,exchange.studentName);
strcpy(p->className,exchange.className);
p->mark1=exchange.mark1;
p->mark2=exchange.mark2;
p->mark3=exchange.mark3;
}
q=q->next;
}
r=r->next;
}
OutputInformation();
}
我这里有个学生通讯录管理系统,应该修改下就可以变成你想要的了。
========================================================================
#include
#include
#include
#define NULL 0
#define LEN sizeof(LNode)
int seat;
typedef struct LNode
{
int number;
double telenum;
char name[20];
struct LNode *next;
}LNode,*LinkList;
//用于通讯录结点
void printList(LinkList L)
{ // 打印头结点地址为L的通讯录
printf("\n ---------------------------------------\n");
printf(" 学号 姓名 电话号码\n");
printf(" ----------------------------------------\n");
LinkList p=L;
int n=1;
if(L==NULL||L->next==NULL) printf("该通讯录中没有元素\n");
else
while(p->next !=NULL)
{
printf(" %2d %-9d",n,p->next->number);
printf(" %-5s %.0f\n",p->next->name,p->next->telenum);
p=p->next;
n++;
}
printf(" ----------------------------------------\n");
return ;
}
LinkList prior(LinkList L,LinkList p)
{
if(L->next==NULL) return(L);
LinkList p_prior=L;
while(p_prior->next != p)
{
p_prior=p_prior->next;
}
return (p_prior);
} // 找到位于当前地址元素的前一元素的地址
void insertYouXu(LinkList L,LinkList Elem)
{ //插入一个元素,使原有序表仍为有序
LinkList p=L->next;
while(p!=NULL && Elem->number>=p->number)
{
if(p->number==Elem->number)
{
printf("重复输入!!\n");return;
}
p=p->next;
} //确定Elem插入的位置
if(p==NULL)
{
p=prior(L,p); Elem->next=NULL;p->next=Elem;
}
else //若为空表,插到头结点之后
{
p=prior(L,p); Elem->next=p->next; p->next=Elem;
}
}
LinkList creatIncreLink() //创建一个存放通讯录成员的非递减有序表,返回头结点地址
{
LinkList L=(LinkList)malloc(LEN); //头结点
L->next=NULL;
LinkList p;
int num=1;
int number;
double telenum;
char name[20];
printf("请输入学生学号、姓名和电话号码,建立通讯录,以'-1'为输入结束标志\n");
printf("请输入学号 %d:",num);
scanf("%d",&number);
printf("请输入姓名 %d: ",num);
char temp=getchar();
gets(name);
printf("请输入电话号码 %d:",num);
scanf("%lf",&telenum);
while (number>=0)
{
p=(LinkList)malloc(LEN); //新结点
p->number=number;
p->telenum=telenum;
strcpy(p->name,name);
insertYouXu(L,p); //有序的插入新结点
num++;
printf("请输入学号 %d:",num);
scanf("%d",&number);
printf("请输入姓名 %d: ",num);
temp=getchar();
gets(name);
printf("请输入电话号码 %d:",num);
scanf("%lf",&telenum);
}
return(L);
}
void deleteElem(LinkList L,int i) //从通讯录中删除第i个元素
{
LinkList p=L;
int j=0;
while (p->next&&j
p = p->next;j++;
}
if(!(p->next))
{printf("第%d个元素删除失败\n",i);return ;}
//判断i是否合法,i既不能大于元素的个数,也不能小于等于0
LinkList q = p->next;
p->next = q->next;
free(q);
//释放删除的结点
}
int searchNum(LinkList L,int n)
{ // 按学号查找通讯者
int flag=0;
LinkList p=L->next;
seat=1;
if(L->next==NULL) printf("该链表中没有元素,查找失败\n");
else
{
while(p !=NULL)
{
if(p->number<=n)
if(p->number==n)
{
flag=1;
printf("要查找的是第%d位通讯者:\n",seat);
printf(" 学号: %d 姓名: %s 电话号码.:%.0f\n",p->number,p->name,p->telenum);
}
p=p->next;seat++;//!!!!
}
}
return flag;
}
int searchName(LinkList L,char n[])
{ // 按姓名查找通讯者
int flag=0;
LinkList p=L->next;
seat=1;
if(L->next==NULL||L==NULL)
printf("该通讯录中没有元素,查找失败\n");
else
{
while(p !=NULL)
{
if(!strcmp(p->name,n))
{
flag=1;
printf("要查找的是第%d位通讯者:\n",seat);
printf(" Number: %d Name: %s TeleNo.:%.0f\n",p->number,p->name,p->telenum);
}
p=p->next;seat++;//!!!!!
}
}
return flag;
}
int delNum(LinkList L,int n)
{ // 按学号删除通讯者
int flag=0;
LinkList p=L->next;
seat=1;
if(L->next==NULL)
printf("该链表中没有元素,删除失败\n");
else
{
while(p !=NULL)
{
if(p->number<=n)
{
if(p->number==n)
{
flag=1;
printf("%d ",p->number);
p=p->next;
deleteElem(L,seat);
}
}
else {p=p->next;seat++;}
}
printf("被删除\n");
}
return flag;
}
int delName(LinkList L,char n[])
{ // 按姓名删除通讯者
int flag=0;
LinkList p=L->next;
seat=1;
if(L->next==NULL)
printf("该链表中没有元素,查找失败\n");
else
{
while(p !=NULL)
{
if(!strcmp(p->name,n))
{
flag=1;
printf("%s ",p->name);
p=p->next;
deleteElem(L,seat);
}
else {p=p->next;seat++;}
}
if(flag)printf("被删除\n");
}
return flag;
}
void main()
{
system("color 1f");
LinkList L=NULL;
printf("\n ***************** ^@^欢迎使用通讯录系统***********\n");
printf(" * 1 通讯录的建立 *\n");
printf(" * 2 插入通讯记录 *\n");
printf(" * 3 查询通讯记录 *\n");
printf(" * 4 删除通讯记录 *\n");
printf(" * 5 显示通讯录信息 *\n");
printf(" * 0 退出管理系统 *\n");
printf(" **************** ^@^欢迎使用通讯录系统************\n");
int flag=0;
int menu;
printf("请选择0-5:");
scanf("%d",&menu);
while(menu!=0)
{
switch(menu)
{
case 1:
{
L=creatIncreLink();
printf("建立通讯录:");
printList(L);
flag=1;
break;
}
case 2:
{
if(flag==1)
{int number,telenum;
char name[20];
printf("请输入通讯者的学号和姓名:\n");
printf("请输入学号: ");
scanf("%d",&number);
printf("请输入姓名: ");
char temp=getchar();
gets(name);
printf("请输入电话号码: ");
scanf("%d",&telenum);
LinkList p=(LinkList)malloc(LEN); //新结点
p->number=number;
strcpy(p->name,name);
p->telenum=telenum;
insertYouXu(L,p); //有序的插入新结点
printf("插入后:");
printList(L);
}
else printf("\nERROR: 通讯录还没有建立,请先建立通讯录\n");
break;
}
case 3:
{
int way,n;
char na[20];
int s;
if(L!=NULL)
{
if(flag)
{
printf("选择查找方式:\n");
printf(" 1.按学号 2.按姓名");
scanf("%d",&way);
if(way==1)
{
printf("\n请输入学号:");
scanf("%d",&n);
s=searchNum(L,n);
if(s==0) printf("无此通讯者,查找失败!\n");
}
else if(way==2)
{
printf("\n请输入姓名:");
char temp=getchar();
gets(na);
s=searchName(L,na);
if(s==0) printf("无此通讯者,查找失败!\n");
}
else printf("通讯录中无记录!\n");
}
break;
}
else printf("通讯录中无记录!\n");break;
}
case 4:
{
int way;
printf("选择删除方式:1.按序号 2. 按学号 3.按姓名 \n");
scanf("%d",&way);
if(way==1)
{
int n;
printf("请输入通讯录序号: ");
scanf("%d",&n);
printf("删除后:\n");
deleteElem(L,n);
printList(L);
}
else if(way==2)
{
int n,f;
printf("请输入学号: ");
scanf("%d",&n);
f=delNum(L,n);
if(f!=0)
{
printf("删除后:\n");
printList(L);
}
else printf("无该学号,删除失败!\n");
}
else if(way==3)
{
char na[20];
int f;
printf("\n请输入姓名:");
char temp=getchar();
gets(na);
f=delName(L,na);
if(f!=0)
{
printf("删除后:\n");
printList(L);
}
else printf("无该学号,删除失败!\n");
}
else printf("ERROR!!\n");
break;
}
case 5:
{
printf("当前通讯录内容如下:\n");
printList(L);
break;
}
case 0: exit(0);
default: printf("\n没有此功能,重新输入\n");
}
printf("选择功能:");
scanf("%d",&menu);
}
}
================================================================
太高级了,不懂