头文件代码:
#include
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
#define STUDENT 2
typedef struct student //建立学生类
{
char num[20]; //学号
char name[20]; //姓名
int math; //数分
int English; //英语
int Data; //数据结构
struct student *next; //指针
}student;
student *head=NULL; //头指针
int length; //链表的长度
void create() //建立链表,学生信息建立函数
{
student *p1,*p2;
length=0;
int numb; //存储用户输入的学生个数
int number=0; //存储已输入的学生个数
p1=(student *)malloc(sizeof(student));//建立头结点
p1->num;
if(headNULL)
head=p1; //头结点地址赋于头指针
printf("\t\t请先输入学生的个数:");//保存要输入的学生个数,用于后面循环输入信息
scanf("%d",&numb);
Sleep(666);
system(“Cls”); //清屏
printf(“输入学号、姓名、数分、英语、数据结构:\n”);
while(number<numb) //循环输入学生信息
{
p2=(student *)malloc(sizeof(student));//建立结点
scanf("%s %s %d %d %d",p2->num,p2->name,&p2->math,&p2->English,&p2->Data); //输入学生信息
if(p2->num0)
{
printf(“信息输入成功!\n”);
break;
}
length++; //链表的长度
p1->next=p2;
p2->next=NULL; //结点相继后移
p1=p1->next;
number++; //记录已输入的学生个数
}
printf(“信息输入成功!\n”); //返回成功
system(“pause”);
system(“Cls”);
return;
}
void display() //显示函数,显示用户输入的学生信息
{
student *p=head->next;
printf(“所有的学生信息如下:\n”);
printf("\t\t__________________________________________________\n");
printf("\t\t 学号 姓名 数分 英语 数据结构 \n");
while(p!=NULL)
{
printf("\t\t%-13s%-11s%-9d%-9d%d\n",p->num,p->name,p->math,p->English,p->Data);
p=p->next;
}
printf("\t\t__________________________________________________\n");
system("pause");
system("Cls");
return; }
void search1() //按学号查找
{
char xh[20]; //保存用户输入的学号,用于后续比较查找
student *p=head->next;
printf(“请输入学号”);
scanf("%s",xh);
while(p!=NULL)
{
if(strcmp(p->num,xh)0) //查找成功,显示查找信息
{
printf("\t\t__________________________________________________\n");
printf("\t\t 学号 姓名 数分 英语 数据结构 \n");
printf("\t\t%-13s%-11s%-9d%-9d%d\n",p->num,p->name,p->math,p->English,p->Data);
printf("\t\t__________________________________________________\n");
return;
}
p=p->next;
}
if(pNULL) //链表遍历完成,返回查找信息
printf(“查无此人\n”);
system(“pause”);
system(“Cls”);
}
void search2() //按学号查找
{
char mz[20]; //保存用户输入的名字,用于后续比较查找
student *p=head->next;
printf(“请输入名字”);
scanf("%s",mz);
while(p!=NULL)
{
if(strcmp(p->name,mz)0) //查找成功,显示查找信息
{
printf("\t\t__________________________________________________\n");
printf("\t\t 学号 姓名 数分 英语 数据结构 \n");
printf("\t\t%-13s%-11s%-9d%-9d%d\n",p->num,p->name,p->math,p->English,p->Data);
printf("\t\t__________________________________________________\n");
return;
}
p=p->next;
}
if(pNULL) //链表遍历完成,返回查找信息
printf(“查无此人\n”);
system(“pause”);
system(“Cls”);
}
void insert() //尾插法插入学生信息
{
int i;
student *p,*q;
p=head;
printf(“请输入你要插入的学生的学号、姓名、数分、英语、数据结构:\n”);
q=(student *)malloc(sizeof(student)); //建立新的结点
scanf("%s %s %d %d %d",q->num,q->name,&q->math,&q->English,&q->Data);
while(p!=NULL)
{
if(strcmp(p->num,q->num)==0) //判断链表中是否已有该学号
{
printf(“该学号已经存在,无法插入!\n”);
system(“pause”);
system(“Cls”);
return;
} //若链表中已有该学号,则返回
p=p->next;}
p=head;
for(i=0;i<length;i++) //循环尾插法插入
p=p->next;
q->next=p->next;
p->next=q;
length++; //插入后链表长度增加
printf(“插入成功!\n”); //返回成功
system(“pause”);
system(“Cls”);
return;
}
void Delete() //按输入的学号删除信息
{
char b[20]; //用于保存用户输入的要删除学生的学号,用于比较
student *p,*q;
q=head,p=head->next;
printf(“请输入要删除的学生的学号:\n”);
scanf("%s",b);
while(p!=NULL)
{
if(strcmp(p->num,b)0) //判断相同则删除
{
q->next=p->next; //删除指定结点
free§; //结点释放
length–;
printf(“删除成功!\n”);
return; //删除成功后返回
}
p=p->next; //指针后移
q=q->next;
}
if(pNULL) //遍历完成,未找到信息
{
printf(“找不到要删除的学号!\n”);
//return;
}
system(“pause”);
system(“Cls”);
}
void menu() //显示函数----屏幕
{
printf("\t\t\t________________________________\n");
printf("\t\t\t 学生信息管理系统 \n");
printf("\t\t\t 1、 信息输入\n");
printf("\t\t\t 2、 显示信息\n");
printf("\t\t\t 3、 查找学生信息\n");
printf("\t\t\t 4、 删除指定学生的信息\n");
printf("\t\t\t 5、 插入学生信息\n");
printf("\t\t\t 6、 排序 \n");
printf("\t\t\t 7、 修改\n");
printf("\t\t\t 8、 保存\n");
printf("\t\t\t 0、 退出系统\n");
printf("\t\t\t______________________________\n");
return; }
void paixuxh(student *head) //利用结点交换的方法对学号进行排序
{
student *p,*prep,*temp,*tail; //定义所需结点
tail=NULL;
while( head->next != tail )
{
prep = head;
p = head->next;
while( p->next != tail )
{
if(strcmp(p->num,p->next->num)>0) //利用字符串比较函数对学号比较大小
{
temp = p->next; //临时保存p的后继结点的值
prep->next = p->next;
p->next = p->next->next;
prep->next->next = p;
p = temp; //完成交换
}
// 节点后移
p = p->next;
prep = prep->next;
}
tail = p;
} // 第一个while
printf("\t\t排序成功\n");
}
void paixusf(student &L) //将学生单链表按数分成绩递减排序strcmp(
{
student p,pre,q;
p=L->next->next; //p指向L的第2个数据结点
L->next->next=NULL; //构造只含一个数据结点的有序表
while (p!=NULL)
{ q=p->next; //q保存p结点后继结点的指针
pre=L; //从有序表开头进行比较,pre指向插入p的前驱结点
while (pre->next!=NULL && pre->next->math>p->math)
pre=pre->next; //在有序表中找插入p的前驱结点pre
p->next=pre->next; //将pre之后插入p
pre->next=p;
p=q; //扫描原单链表余下的结点
}
}
void paixuyy(student *&L) //将学生单链表按英语成绩递减排序
{
student *p,*pre,*q;
p=L->next->next;
L->next->next=NULL;
while (p!=NULL)
{ q=p->next;
pre=L;
while (pre->next!=NULL && pre->next->English>p->English)
pre=pre->next;
p->next=pre->next;
pre->next=p;
p=q;
}
}
void paixusj(student *&L) //将学生单链表按数据结构成绩递减排序
{
student *p,*pre,*q;
p=L->next->next;
L->next->next=NULL;
while (p!=NULL)
{ q=p->next;
pre=L;
while (pre->next!=NULL && pre->next->Data>p->Data)
pre=pre->next;
p->next=pre->next;
pre->next=p;
p=q;
}
}
void Print(student *head ) //输出函数
{
printf("\t\t 学号 姓名 数分 英语 数据结构 \n");
while( head != NULL )
{
printf("\t\t%-13s%-11s%-9d%-9d%d\n",head->num,head->name,head->math,head->English,head->Data);
head = head->next;
}
system(“pause”);
system(“Cls”);
}
void Saveandfree() //将所有记录写入文件
{
FILE *fp; //定义文件指针
student *p=head->next;
char filename[20]; //定义文件名
printf("\t\t\t保存数据\n"); //输入文件名
printf("\t\t\t输入文件名:");
scanf("\t\t\t%s",filename);
if((fp=fopen(filename,“w”))==NULL) //打开文件
{
printf("\t\t\t打开文件失败\n");
system(“pause”);
return;
}
fprintf(fp,"\t\t 学号 姓名 数分 英语 数据结构 \n");
while(p!=NULL) //循环写入文件
{
fprintf(fp,"\t\t%-13s%-11s%-9d%-9d%d\n",p->num,p->name,p->math,p->English,p->Data);
p=p->next;
}
fclose(fp); //关闭文件
printf(“成功!\n”); //返回成功信息
system(“pause”);
system(“Cls”);
}
void xiugei(student *head) //学生信息修改函数
{
char xg[20]; //保存修改者的学号
char num1[20]; //保存修改时输入的学号
char name1[20]; //保存修改时输入的名字
int math1; //保存修改时输入的数分
int English1; //保存修改时输入的英语
int Data1,t=1; //保存修改时输入的数据结构,t用于辅助判断
student *p=head->next;
printf(“输入需要修改的学生的学号:”);
scanf("%s",xg);
while(p!=NULL)
{
if(strcmp(p->num,xg)0) //查找成功,并显示被修改者的信息
{
printf(“这是你要修改的学生的信息\n”);
printf("\t\t 学号 姓名 数分 英语 数据结构 \n");
printf("\t\t%-13s%-11s%-9d%-9d%d\n",p->num,p->name,p->math,p->English,p->Data);
printf(“请输入你要修改的学生的学号、姓名、数分、英语、数据结构:\n”);
scanf("%s %s %d %d %d",num1,name1,&math1,&English1,&Data1);
strcpy(p->num,num1); //字符串复制函数修改学号,名字
strcpy(p->name,name1);
p->math=math1;p->English=English1;p->Data=Data1;//修改成绩
printf(“修改成功\n”);
t=0; //修改成功,赋值为0
}
p=p->next; //指针移动
}
if(t1) //查找失败,无修改者信息
{
printf(“找不到要修改的学号!\n”);
}
system("pause");
system("Cls");}
主函数代码:
#include"2.h"
int main(void) {
int a,c; //辅助选择
menu(); //调用显示函数
int choice;
while(1)
{
printf("\t\t请选择相应的功能:");
scanf("%d",&a);
switch(a)
{
case 0:
return 0; //退出系统
case 1: //学生信息输入
create(); //输入函数
menu();
break;
case 2: //信息显示
system(“cls”);
if(head) //判断链表是否空
{
display(); //显示函数
menu();}
else //空链表,提示建表
{
printf(“链表为空,请先建立链表!\n”);
Sleep(500);
system(“cls”);
menu();
}
break;
case 3: //查找信息
system(“cls”);
if(head)
{
printf(“请选择是按学号查找还是按姓名查找,若是学号就按1,姓名按2\n”);
scanf("%d",&choice);
if(choice==1) //按学号查找
{
search1(); //学号查找函数}
else //按姓名查找
{
search2(); //姓名查找函数
}
system(“pause”);
system(“cls”);
menu();
}
else
{
printf(“链表为空,请先建立链表!\n”);
Sleep(500);
system(“cls”);
menu();}
break;
case 4: //删除学生信息
system(“cls”);
if(head)
{
Delete(); //删除函数
system(“pause”);
system(“cls”);
menu();}
else
{
printf(“链表为空,请先建立链表!\n”);
Sleep(500);
system(“cls”);
menu();
}
break;
case 5 : //插入学生信息(尾插法)
system(“cls”);
if(head)
{
insert(); //插入函数
system(“cls”);
menu();
}
else
{
printf(“链表为空,请先建立链表!\n”);
Sleep(500);
system(“cls”);
menu();
}
break;
case 6 : //学生信息排序
system(“cls”);
if(head)
{
printf(“请选择是按学号排序还是按高数,英语,数据结构排序\n若是学号就按1,数分按2,英语按3,数据结构按4\n”);
scanf("%d",&c);
system(“cls”);
switch©
{
case 1: //按学号排序
paixuxh(head); //学号排序函数
printf(“经过排序后的信息为:\n”);
Print(head->next);//输出函数
menu();
break;
case 2: //按数分排序
paixusf(head); //数分排序函数
printf(“经过排序后的信息为:\n”);
Print(head->next);
menu();
break;
case 3: //按英语排序
paixuyy(head); //英语排序函数
printf(“经过排序后的信息为:\n”);
Print(head->next);
menu();
break;
case 4: //按数据结构排序
paixusj(head); //数据结构排序函数
printf(“经过排序后的信息为:\n”);
Print(head->next);
menu();
break;
default: //输入其它时,循环重新输入
break;
}
}
else
{
printf(“链表为空,请先建立链表!\n”);
Sleep(666);
system(“cls”);
menu();
}
break;
case 7 : //修改信息
system(“cls”);
if(head)
{
xiugei(head); //修改函数
menu();
}
else
{
printf(“链表为空,请先建立链表!\n”);
Sleep(500);
system(“cls”);
menu();
}
break;
case 8 : //保存成绩至文件
if(head)
{
Saveandfree(); //保存函数
menu();
}
else
{
printf(“链表为空,请先建立链表!\n”);
Sleep(500);
system(“cls”);
menu();
}
default: //输入其它情况,循环重新输入
break;
}}
system(“pause”);
return 0;
while(1);}
亲测有效