把代码用代码段格式复制出来
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量
#define LISTINCREMENT 10 //线性表存储空间的分配量增量
typedef int Status;
typedef struct{
char name[15]; //名字
int No; //学号
int Room; //宿舍号
}Student;
Student student;
typedef struct{
int length; //长度
int listsize; //占用内存空间
Student *elem; //引用对象Student的数据成员elem
}Linklist;
int flag=0;
Status init(Linklist &L); //初始化线性表
Status create(Linklist &L); //创建线性表
//冒泡排序
Status MSortRoom(Linklist &L); //按宿舍号排序
Status MSortNo(Linklist &L); //按学号排序
Status MSortName(Linklist & L); //按姓名排序
//选择排序
Status XSortRoom(Linklist &L); //按宿舍号排序
Status XSortNo(Linklist &L); //按学号排序
Status XSortName(Linklist & L); //按姓名排序
//直接插入排序
Status CSortRoom(Linklist &L); //按宿舍号排序
Status CSortNo(Linklist &L); //按学号排序
Status CSortName(Linklist &L); //按姓名排序
Status SearchRoom(Linklist &L); //按宿舍号查找
Status SearchNo(Linklist &L); //按学号查找
Status SearchName(Linklist &L) ; //按名字查找
Status Judge1(char ch); //判断学生存在时是否继续
Status Judge2(char ch); //判断学生不存在是是否继续
Status Judge3(); //判断是否有学生记录
Status JudgeNO(int NO,Linklist L); //判断学号是否重复
void input(Linklist L); //输入学生信息
void PrintSort(Linklist &L); //输出排序后的信息
void PrintSearch(Linklist &L,int mid); //输出查找的信息 (按学号和姓名)
void PrintSearch1(Linklist &L,int mid); //输出查找的信息(按房号)
Status DeleteNO(Linklist &L); //按学号删除某同学的信息
Status DeleteName(Linklist &L); //按姓名删除某同学的信息
Status DeleteRoom(Linklist &L); //按宿舍号删除某同学的信息
Status insert(Linklist &L); //插入某同学的信息
void JudgeSave(Linklist &L,int i); //文件存储
void Save(Linklist &L);
void Load(Linklist &L); //文件加载
Status ReturnMenu(); //返回菜单页面
//----------------------------------------------------------------菜单操作-------------------------------------------------------
void menu()
{
printf("\t\t ======================== \n");
printf("\t\t | | \n");
printf("\t\t |--------| 宿舍管理查询 |-------|\n");
printf("\t\t | | | |\n");
printf("\t\t | ======================== |\n");
printf("\t\t | |\n");
printf("\t\t | 请选择你的操作 : |\n");
printf("\t\t | [1]创建学生信息 |\n");
printf("\t\t | [2]按姓名排序(插入排序) |\n");
printf("\t\t | [3]按学号排序(插入排序) |\n");
printf("\t\t | [4]按房号排序(插入排序) |\n");
printf("\t\t | [5]按姓名排序(选择排序) |\n");
printf("\t\t | [6]按学号排序(选择排序) |\n");
printf("\t\t | [7]按房号排序(选择排序) |\n");
printf("\t\t | [8]按姓名排序(冒泡排序) |\n");
printf("\t\t | [9]按学号排序(冒泡排序) |\n");
printf("\t\t | [10]按房号排序(冒泡排序) |\n");
printf("\t\t | [11]按姓名查找 |\n");
printf("\t\t | [12]按学号查找 |\n");
printf("\t\t | [13]按房号查找 |\n");
printf("\t\t | [14]插入学生信息 |\n");
printf("\t\t | [15]按学号删除学生信息 |\n");
printf("\t\t | [16]按姓名删除学生信息 |\n");
printf("\t\t | [17]按宿舍删除学生信息 |\n");
printf("\t\t | [18]显示学生记录 |\n");
printf("\t\t | [19]文件加载 |\n");
printf("\t\t | [20]文件保存 |\n");
printf("\t\t | [21]退出操作 |\n");
printf("\t\t |-======================================-|\n");
printf("\t\t | 欢迎查询 |\n");
printf("\t\t |-======================================-|\n");
printf("请选择你要进行的操作(1/2/3/4/5/6/7/8/9/10/11/12/13/14/15/16/17/18/19/20/21):\n");
}
int main(int argc,char **argv)
{
int n;
Linklist L;
init(L);
char ch;
printf("\t\t欢迎进入宿舍管理查询界面\n\n\n");
printf("请按任意键进行操作");
scanf("%c",&ch);
system("cls");
while(1)
{
menu();
scanf("%d",&n);
getchar();
system("cls");
switch(n)
{
case 1:
if(create(L)){
printf("创建成功!\n");
}
ReturnMenu();
break;
case 2:
CSortName(L);
if(L.length==0)
{
printf("\n已无学生记录\n");
}
else{
printf("按姓名排序:\n");
PrintSort(L);
}
ReturnMenu();
break;
case 3:
CSortNo(L);
if(L.length==0)
{
printf("\n已无学生记录\n");
}
else{
printf("按学号排序:\n");
PrintSort(L);
}
ReturnMenu();
break;
case 4:
CSortRoom(L);
if(L.length==0)
{
printf("\n已无学生记录\n");
}
else{
printf("按房号排序:\n");
PrintSort(L);
}
ReturnMenu();
break;
case 5:
XSortName(L);
printf("\n");
if(L.length==0){
printf("已无学生记录\n");
printf("\n");
ReturnMenu();
}
else{
printf("按姓名排序:\n");
PrintSort(L);
ReturnMenu();
}
break;
case 6:
XSortNo(L);
printf("\n");
if(L.length==0){
printf("已无学生记录\n");
printf("\n");
ReturnMenu();
}
else{
printf("按学号排序:\n");
PrintSort(L);
ReturnMenu();
}
break;
case 7:
XSortRoom(L);
printf("\n");
if(L.length==0){
printf("已无学生记录\n");
printf("\n");
ReturnMenu();
}
else{
printf("按房号排序:\n");
PrintSort(L);
ReturnMenu();
}
break;
case 8:
MSortName(L);
printf("\n");
if(L.length==0){
printf("已无学生记录\n");
ReturnMenu();
}
else{
printf("按姓名排序:\n");
PrintSort(L);
ReturnMenu();
}
break;
case 9:
MSortNo(L);
printf("\n");
if(L.length==0){
printf("已无学生记录\n");
ReturnMenu();
}
else{
printf("按学号排序:\n");
PrintSort(L);
ReturnMenu();
}
break;
case 10:
MSortRoom(L);
printf("\n");
if(L.length==0){
printf("已无学生记录\n");
ReturnMenu();
}
else{
printf("按房号排序:\n");
PrintSort(L);
ReturnMenu();
}
break;
case 11:
CSortName(L);
SearchName(L);
break;
case 12:
XSortNo(L);
SearchNo(L);
break;
case 13:
MSortRoom(L);
SearchRoom(L);
break;
case 14:
insert(L);
system("cls");
printf("显示插入后的学生信息:\n");
PrintSort(L);
ReturnMenu();
break;
case 15:
DeleteNO(L);
if(L.length==0){
printf("\n学生记录已被删除完\n\n");
}
else{
printf("删除后的学生信息:\n");
PrintSort(L);
}
ReturnMenu();
break;
case 16:
DeleteName(L);
if(L.length==0){
printf("\n学生记录已被删除完\n\n");
}
else{
printf("删除后的学生信息:\n");
PrintSort(L);
}
ReturnMenu();
break;
case 17:
DeleteRoom(L);
if(L.length==0){
printf("\n该房间没有学生\n\n");
}
else{
printf("删除后的学生信息:\n");
PrintSort(L);
}
ReturnMenu();
break;
case 18:
printf("\n学生信息为:\n");
PrintSort(L);
ReturnMenu();
break;
case 19:
Load(L);
ReturnMenu();
break;
case 20:
JudgeSave(L,flag);
ReturnMenu();
break;
case 21:
exit(0);
break;
default:
printf("无此操作\n");
ReturnMenu();
}
}
return 0;
}
//-----------------------------------------------------------------------返回主界面----------------------------------------------------------------
Status ReturnMenu()
{
char c;
fflush(stdin);
printf("\n按任意键进入主界面:");
scanf("%c",&c);
system("cls");
return OK;
}
//---------------------------------------------------------------线性表初始化---------------------------------------------------
Status init(Linklist &L)
{
L.elem=(Student*)malloc(LIST_INIT_SIZE*sizeof(Student));
if(!L.elem)
exit(OVERFLOW);
L.length=0;
L.listsize=LIST_INIT_SIZE;
return OK;
}
//-------------------------------------------------------------创建学生类信息表--------------------------------------------------
Status create(Linklist &L)
{
if(L.length>=L.listsize)
{
Student *newbase;
newbase=(Student*)realloc(L.elem,(LIST_INIT_SIZE+LISTINCREMENT)*sizeof(Student));
L.elem=newbase;
L.listsize+=LISTINCREMENT;
}
char ch='Y';
int i=0;
int room[1000]={0};
while(ch=='Y'){
printf("请输入第%d个学生信息\n",i+1);
input(L);
if(room[student.Room]+1>6){
printf("该宿舍已满员!请重新输入:\n");
input(L);
}
strcpy(L.elem[L.length].name,student.name);
L.elem[L.length].No=student.No;
L.elem[L.length].Room=student.Room;
L.length++;
i++;
room[student.Room]++;
ch=getchar();
printf("\n是否继续添加学生:是的话按Y,否则按任意键返回:");
scanf("%c",&ch);
flag=1;
}
if(ch!='Y')
system("cls");
return OK;
}
//--------------------------------------------------------------按照宿舍号排序(冒泡排序)--------------------------------------------------------
Status MSortRoom(Linklist & L)
{
int i,j;
Student temp;
for(i=0;i<L.length-1;i++)
for(j=i+1;j<L.length;j++)
if(L.elem[i].Room>L.elem[j].Room)
{
temp=L.elem[i];
L.elem[i]=L.elem[j];
L.elem[j]=temp;
}
return OK;
}
//-------------------------------------------------------------------按照宿舍号排序(选择排序)-------------------------------------------------------------
Status XSortRoom(Linklist & L)
{
int i,j,k;
Student temp;
for(i=0;i<L.length-1;i++){
k=i;
for(j=i+1;j<L.length;++j)
if(L.elem[k].Room>L.elem[j].Room)
k=j;
if(i!=k){
temp=L.elem[i];
L.elem[i]=L.elem[k];
L.elem[k]=temp;
}
}
return OK;
}
//--------------------------------------------------------------------------按照宿舍排序(插入排序)--------------------------------------------------------------
Status CSortRoom(Linklist &L)
{
int i,j;
Student temp;
for(i=1;i<L.length;++i){
if(L.elem[i].Room<L.elem[i-1].Room){
temp=L.elem[i];
for(j=i-1;temp.Room<L.elem[j].Room;--j)
L.elem[j+1]=L.elem[j];
L.elem[j+1]=temp;
}
}
return OK;
}
//--------------------------------------------------------------按照学号排序(冒泡排序)--------------------------------------------------------
Status MSortNo(Linklist & L)
{
int i,j;
Student temp;
for(i=0;i<L.length-1;i++)
for(j=i+1;j<L.length;j++)
if(L.elem[i].No>L.elem[j].No)
{
temp=L.elem[i];
L.elem[i]=L.elem[j];
L.elem[j]=temp;
}
return OK;
}
//-------------------------------------------------------------------按照学号排序(选择排序)-------------------------------------------------------------
Status XSortNo(Linklist & L)
{
int i,j,k;
Student temp;
for(i=0;i<L.length-1;i++){
k=i;
for(j=i+1;j<L.length;++j)
if(L.elem[k].No>L.elem[j].No)
k=j;
if(i!=k){
temp=L.elem[i];
L.elem[i]=L.elem[k];
L.elem[k]=temp;
}
}
return OK;
}
//--------------------------------------------------------------------------按照学号排序(插入排序)--------------------------------------------------------------
Status CSortNo(Linklist &L)
{
int i,j;
Student temp;
for(i=1;i<L.length;++i){
if(L.elem[i].No<L.elem[i-1].No){
temp=L.elem[i];
for(j=i-1;temp.No<L.elem[j].No;--j)
L.elem[j+1]=L.elem[j];
L.elem[j+1]=temp;
}
}
return OK;
}
//--------------------------------------------------------------按照姓名排序(冒泡排序)--------------------------------------------------------
Status MSortName(Linklist & L)
{
int i,j;
Student temp;
for(i=0;i<L.length-1;i++)
for(j=i+1;j<L.length;j++)
if(strcmp(L.elem[i].name,L.elem[j].name)>0)
{
temp=L.elem[i];
L.elem[i]=L.elem[j];
L.elem[j]=temp;
}
return OK;
}
//-------------------------------------------------------------------按照姓名排序(选择排序)-------------------------------------------------------------
Status XSortName(Linklist & L)
{
int i,j,k;
Student temp;
for(i=0;i<L.length-1;i++){
k=i;
for(j=i+1;j<L.length;++j)
if(strcmp(L.elem[k].name,L.elem[j].name)>0)
k=j;
if(i!=k){
temp=L.elem[i];
L.elem[i]=L.elem[k];
L.elem[k]=temp;
}
}
return OK;
}
//--------------------------------------------------------------------------按照姓名排序(插入排序)--------------------------------------------------------------
Status CSortName(Linklist &L)
{
int i,j;
Student temp;
for(i=1;i<L.length;++i){
if(strcmp(L.elem[i].name,L.elem[i-1].name)<0){
temp=L.elem[i];
for(j=i-1;strcmp(temp.name,L.elem[j].name)<0;--j)
L.elem[j+1]=L.elem[j];
L.elem[j+1]=temp;
}
}
return OK;
}
//-------------------------------------------------------------------------按房号查找(折半查找)----------------------------------------------------------
Status SearchRoom(Linklist &L)
{
if(L.length==0)
Judge3();
else
{
int low=0,high=L.length,m,temp;
int r;
printf("\n按房号查找 输入房号:");
scanf("%d",&r);
printf("\n查找成功 学生信息为\n");
printf("\t\t姓名 学号 房号\n");
while(low<=high)
{
m=(low+high)/2;
if(r==L.elem[m].Room)
{
temp=1;
PrintSearch1(L,m);
for(int k=m;k>low;k--){
if(L.elem[k].Room==L.elem[k-1].Room)
PrintSearch1(L,k-1);
}
for(int k=m;k<high;++k){
if(L.elem[k].Room==L.elem[k+1].Room){
PrintSearch1(L,k+1);
}
}
break;
}
else if(r>L.elem[m].Room)
low=m+1;
else
high=m-1;
}
if(temp==1)
{
if(Judge1(1))
SearchRoom(L);
else
{
system("cls");
}
}
else
{
if(Judge2(1))
SearchRoom(L);
else
{
system("cls");
}
}
}
return OK;
}
//-------------------------------------------------------------------------按学号查找(折半查找)--------------------------------------------------------
Status SearchNo(Linklist &L)
{
if(L.length==0)
{
Judge3();
}
else
{
int low=0,high=L.length,m,temp=0;
int n;
printf("\n按学号查找 输入学号:");
scanf("%d",&n);
while(low<=high)
{
m=(low+high)/2;
if(n==L.elem[m].No)
{
temp=1;
break;
}
else if(n>L.elem[m].No)
low=m+1;
else
high=m-1;
}
if(temp==1)
{
PrintSearch(L,m);
if(Judge1(1))
SearchNo(L);
else
{
system("cls");
}
}
else
{
if(Judge2(1))
SearchNo(L);
else
{
system("cls");
}
}
}
return OK;
}
//-------------------------------------------------------------------------按姓名查找(折半查找)----------------------------------------------------------
Status SearchName(Linklist &L)
{
if(L.length==0)
Judge3();
else
{
int low=0,high=L.length,m,temp=0;
printf("\n按姓名查找 输入姓名:");
char a[15];
scanf("%s",a);
while(low<=high)
{
m=(low+high)/2;
if(strcmp(a,L.elem[m].name)==0)
{
temp=1;
break;
}
else if(strcmp(a,L.elem[m].name)>0)
low=m+1;
else
high=m-1;
}
if(temp==1)
{
PrintSearch(L,m);
if(Judge1(1))
SearchName(L);
else
{
system("cls");
}
}
else
{
if(Judge2(1))
SearchName(L);
else
{
system("cls");
}
}
}
return OK;
}
//------------------------------------------------------------------------判断是否继续查找---------------------------------------------------------
Status Judge1(char ch)
{
scanf("%c",&ch);
printf("是否继续:是的话按Y,否则按任意键返回:");
scanf("%c",&ch);
if(ch=='Y')
{
system("cls");
return OK;
}
else
return ERROR;
}
//-----------------------------------------------------------------------判断不存在是否继续查找--------------------------------------------------------
Status Judge2(char ch)
{
scanf("%c",&ch);
printf("没有此学生,是否继续:是的话按Y,否则按任意键返回");
fflush(stdin);
scanf("%c",&ch);
if(ch=='Y')
{
system("cls");
return OK;
}
else
return ERROR;
}
//--------------------------------------------------------------------无学生记录返回主界面------------------------------------------------------------------
Status Judge3()
{
printf("已经没有学生记录\n");
ReturnMenu();
menu();
return OK;
}
//------------------------------------------------------------------------判断学生学号是否一样--------------------------------------------------------------
Status JudgeNO(int NO,Linklist L)
{
int j=0;
for(int i=0;i<L.length;i++){
if(NO==L.elem[i].No)
j++;
}
if(j==1){
printf("该学号已经存在,请重新输入!\n");
input(L);
}
return OK;
}
//------------------------------------------------------------------------输入学生信息----------------------------------------------------------------
void input(Linklist L)
{
printf("输入学生姓名:\n");
fflush(stdin);
gets(student.name);
printf("输入学生宿舍号:\n");
scanf("%d",&student.Room);
printf("输入学生学号:\n");
fflush(stdin);
scanf("%d",&student.No);
JudgeNO(student.No,L);
}
//-----------------------------------------------------------------------输出学生排序的信息-------------------------------------------------------------
void PrintSort(Linklist & L)
{
int i;
printf("\n");
printf("\t\t姓名 学号 房号\n");
for(i=0;i<L.length ;i++)
printf("\t\t%-20s %10d %10d\n",L.elem[i].name,L.elem[i].No,L.elem[i].Room);
}
//-----------------------------------------------------------------输出查找学生的信息(按学号或姓名)----------------------------------------------------
void PrintSearch(Linklist & L,int mid)
{
printf("查找成功 学生信息为\n");
printf("\t\t姓名 学号 房号\n");
printf("\t\t%-20s %10d %10d\n",L.elem[mid].name,L.elem[mid].No,L.elem[mid].Room);
}
//------------------------------------------------------------------------输出查找学生的信息(按房号)-------------------------------------------------------------
void PrintSearch1(Linklist & L,int mid)
{
printf("\t\t%-20s %10d %10d\n",L.elem[mid].name,L.elem[mid].No,L.elem[mid].Room);
}
//-------------------------------------------------------------------------插入学生信息-------------------------------------------------------------
Status insert(Linklist & L)
{
int i,j,k;
int room[1000]={0};
char ch;
printf("\n插入学生信息为:\n");
input(L);
if(room[student.Room]+1>6){
printf("该宿舍已满员,请重新输入:\n");
input(L);
}
if(L.length==0)
{
strcpy(L.elem[L.length].name,student.name);
L.elem[L.length].No=student.No;
L.elem[L.length].Room=student.Room;
flag=1;
}
for(i=0;i<L.length;i++)
{
strcpy(L.elem[L.length].name,student.name);
L.elem[L.length].No=student.No;
L.elem[L.length].Room=student.Room;
room[student.Room]++;
flag=1;
}
L.length++;
fflush(stdin);
printf("\n是否继续插入:是的话按Y,否则按任意键返回");
scanf("%c",&ch);
if(ch=='Y')
insert(L);
else
system("cls");
return OK;
}
//-------------------------------------------------------------------------按学号删除-------------------------------------------------------
Status DeleteNO(Linklist &L)
{
int i,j,k=-1;
char ch;
printf("\n\n请输入要删除学生的学号:");
scanf("%d",&student.No);
for(i=0;i<L.length;i++)
{
if(student.No==L.elem[i].No)
{
printf("该学生的信息为:\n");
printf("\t\t姓名 学号 房号\n");
printf("\t\t%-20s %10d %10d\n",L.elem[i].name,L.elem[i].No,L.elem[i].Room);
k=i;
for(j=k;j<L.length-1;j++)
L.elem[j]=L.elem[j+1];
break;
}
}
if(i>=L.length)
printf("该学生不存在\n");
if(k>=0)
L.length--;
fflush(stdin);
printf("\n是否继续删除?是的话按Y,否则按任意键返回:");
scanf("%c",&ch);
system("cls");
if(ch=='Y')
DeleteNO(L);
else
system("cls");
return OK;
}
//-------------------------------------------------------------------------按姓名删除-------------------------------------------------------
Status DeleteName(Linklist &L)
{
int i,j,k=-1;
char ch;
printf("\n\n请输入要删除学生的姓名:");
gets(student.name);
for(i=0;i<L.length;i++)
{
if(strcmp(student.name,L.elem[i].name)==0)
{
printf("该学生的信息为:\n");
printf("\t\t姓名 学号 房号\n");
printf("\t\t%-20s %10d %10d\n",L.elem[i].name,L.elem[i].No,L.elem[i].Room);
k=i;
for(j=k;j<L.length-1;j++)
L.elem[j]=L.elem[j+1];
break;
}
}
if(i>=L.length)
printf("该学生不存在\n");
if(k>=0)
L.length--;
fflush(stdin);
printf("\n是否继续删除?是的话按Y,否则按任意键返回:");
scanf("%c",&ch);
system("cls");
if(ch=='Y')
DeleteName(L);
else
system("cls");
return OK;
}
//-------------------------------------------------------------------------按宿舍号删除-------------------------------------------------------
Status DeleteRoom(Linklist &L)
{
int i,j,k=-1,n=L.length;
char ch;
printf("\n\n请输入要删除学生的宿舍号:");
scanf("%d",&student.Room);
printf("删除该宿舍学生的信息为:\n");
printf("\t\t姓名 学号 房号\n");
for(i=0;i<L.length;i++)
{
if(student.Room==L.elem[i].Room)
{
printf("\t\t%-20s %10d %10d\n",L.elem[i].name,L.elem[i].No,L.elem[i].Room);
k=i;
for(j=k;j<L.length-1;j++)
L.elem[j]=L.elem[j+1];
if(k>0)
n--;
}
if(i==L.length-1){
break;
}
}
if(i>=L.length)
printf("此房间没有学生\n");
L.length=n;
fflush(stdin);
printf("\n是否继续删除?是的话按Y,否则按任意键返回:");
scanf("%c",&ch);
system("cls");
if(ch=='Y')
DeleteRoom(L);
else
system("cls");
return OK;
}
//--------------------------------------------------------------------------文件加载--------------------------------------------------------------
void Load(Linklist &L){
FILE *fp;
if((fp=fopen("dorm.txt","r"))==NULL)
{
printf("打开文件失败!\n\n");
exit(0);
}
while(!feof(fp))
fread(&L.elem[L.length],sizeof(Student),1,fp);
fclose(fp);
printf("加载数据成功!\n\n");
}
//--------------------------------------------------------------------------保存文件 ----------------------------------------------------------------
void JudgeSave(Linklist &L,int i)
{
char ch;
if(i){
printf("是否保存(Y/N)?:");
ch=getchar();
getchar();
while(ch!='N'&&ch!='Y')
{
printf("请输入Y或者N:");
ch=getchar();
getchar();
}
if(ch=='Y')
Save(L);
}
}
void Save(Linklist &L){
int i;
int flag1=0;
FILE *fp;
if((fp=fopen("dorm.txt","w"))==NULL)
{
printf("打开文件失败!\n\n");
flag1=1;
exit(0);
}
for(i=0;i<L.length;i++){
fprintf(fp,"%s %d %d\n",L.elem[i].name,L.elem[i].No,L.elem[i].Room);
}
if(!flag1)
{
printf("数据存储成功!\n\n");
flag=0;
}
fclose(fp);
}
如果报错的行有结构体,在声明结构体变量是,需要在结构体类型前加struct 。
比如struct Status test;