问题描述:
对学生信息进行增删改存等操作。
代码:
/**********************************************
*文件名称:11.cpp
*内容摘要:实现学生信息的添加,删除,排序,修改,查询,存入文件。
*当前版本:V1.0
*作者:白晓娟
*完成日期:20161229
*************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include "windows.h"
#define N 100
typedef struct
{
char name[20];//学生姓名
char sex[10];//性别
int id[20];//学号
int birthday[15];//出生日期
}AList;
AList t[N];//要添加的新学生
AList e;
typedef struct LNode
{
AList data;
struct LNode *next;
} Address;
Address *h;//建立链表储存参数
int num1=0;//添加学生的个数
int num2=0;
void Menu(); //主界面
void Input();//输入学生信息函数
void Output();//显示所有学生信息
void Delete();//删除学生信息
void Change();//修改学生信息
void Sort();//按照姓名进行排序操作
void File();//存入文件
void Readfile();//读出文件
void SecondMenu(); //查询选择界面
void NameFound();//通过学生姓名查找
void IdFound();//通过学号进行查找
void InitList(Address *&L);//创建空链表
bool ListInsert(Address *&L,int i,AList e);//向单链表中插入信息
void DispList(Address *L);//显示链表内容
void CreateListR(Address *&L, AList a[],int n); //尾插法建表即建立学生信息库
bool ListEmpty(Address *L);//链表是否为空
void DispName(Address *L);//显示姓名
int ListLength(Address *L);//求线性表的长度即学生个数
bool ListDelete(Address *&L,int i,AList &e);//删除
int LocateElem(Address *L,AList e);//获取元素位置(姓名)
bool GetElem(Address *L,int i,AList &e);//获取元素位置
void InsertSort(Address *L,int n);//排序
void DestroyList(Address *&L);//销毁链表
int Name(Address *&L,int i,char newname[]);//修改学生姓名
int Sex(Address *&L,int i,char newsex[]);//修改性别
int Id(Address *&L,int i,int newid[]);//修改学号
int Birthday(Address *&L,int i,int newbirthday[]);//修改出生日期
/******************************************************************************************
*功能描述:main函数
******************************************************************************************/
int main()
{
InitList(h);
Menu();
DestroyList(h);
return 0;
}
/******************************************************************************************
*功能描述:输入学生信息
*输入参数:num1—需添加的联系人个数
name—学生姓名
sex—学生性别
id—学号
birthday—出生日期
******************************************************************************************/
void Input()
{
if (num1==0)
{
printf("请输入要添加的学生个数: ");
scanf("%d",&num1);
for (int i=0; i < num1; i++)
{
printf("请输入第%d个学生的详细信息\n", i+1);
printf("姓 名: ");
scanf("%s", t[i].name);
printf("性 别: ");
scanf("%s", t[i].sex);
printf("学 号: ");
scanf("%s", t[i].id);
printf("出生日期: ");
scanf("%s", t[i].birthday);
}
for (int j=0; j<num1; j++)
{
ListInsert(h,j+1,t[j]);
}
system("cls");
printf("**正在添加学生信息,请稍后......\n");
for(int i1=0;i1<15;i1++)
{
Sleep(100);
printf("**");
}
system("cls");
printf("添加完成!\n");
}
else
{
num2 = num1;
printf("请输入要添加的学生个数: ");
scanf("%d",&num1);
for (int i=num2; i < num2+num1; i++)
{
printf("请输入第%d个学生的详细信息\n", i+1);
printf("姓 名: ");
scanf("%s", t[i].name);
printf("性 别: ");
scanf("%s", t[i].sex);
printf("学 号: ");
scanf("%s", t[i].id);
printf("出生日期: ");
scanf("%s", t[i].birthday);
for (int j=num2; j<num2+num1;j++)
{
ListInsert(h,j+1,t[j]);
}
}
system("cls");
printf("**正在添加学生信息,请稍后......\n");
for(int i2=0;i2<15;i2++)
{
Sleep(100);
printf("**");
}
system("cls");
printf("添加完成!\n");
num1 = num2+num1;
}
Menu();
}
/******************************************************************************************
*功能描述:删除学生信息
*输入参数:m—想删除的联系人序号
******************************************************************************************/
void Delete()
{
int m;
printf("%s\n",(ListEmpty(h)?"输入错误!当前还未储存学生信息!\n":"\n"));
printf("当前共有%d个学生的信息:\n ",ListLength(h));
if(ListLength(h) == 0)
{
system("cls");
Menu();
}
else
{
printf("所有学生姓名如下: \n");
DispName(h);
}
printf("请输入你想删除的学生的序号(1——%d): ",ListLength(h));
scanf("%d",&m);
ListDelete(h,m,e);
printf("**正在删除学生信息,请稍后......\n");
for(int i2=0;i2<15;i2++)
{
Sleep(100);
printf("**");
}
system("cls");
printf("删除成功!\n");
Menu();
}
/******************************************************************************************
*功能描述:按照姓名进行排序操作
******************************************************************************************/
void Sort()
{
printf("%s\n",(ListEmpty(h)?"没有学生信息!\n":"\n"));
printf("共有%d个学生信息!\n ",ListLength(h));
InsertSort(h,ListLength(h));
Menu();
}
/******************************************************************************************
*功能描述:修改学生信息
*输入参数:newsex—修改后的性别
newname—修改后的姓名
newid—修改后的学号
newbirthday—修改后的出生日期
change—需要修改的相应代码
******************************************************************************************/
void Change()
{
char newsex[10];
char newname[20];
int newid[15];
int newbirthday[10];
int change;
AList f;
printf("%s\n",(ListEmpty(h)?"输入错误!当前还未储存学生信息!\n":"\n"));
printf("当前共有%d个学生的信息:\n ",ListLength(h));
if(ListLength(h) == 0)
{
system("cls");
Menu();
}
else
{
printf("所有学生姓名如下: \n");
DispName(h);
}
printf("请输入您需要修改的学生姓名: ");
scanf("%s",f.name);
printf("您要修改的学生的序号是%d\n",LocateElem(h,f));
printf(" ***********************请选择要修改的选项**************************\n");
printf(" *******************************************************************\n");
printf(" * 1.姓 名 2.性 别 \n");
printf(" *******************************************************************\n");
printf(" * 3.学 号 4.出生日期 *\n");
printf(" *******************************************************************\n");
printf("请输入要修改的选项代码: ");
scanf("%d",&change);
printf("\n");
if (change == 1)
{
printf("请输入新的姓名: ");
scanf("%s",newname);
Name(h,LocateElem(h,f),newname);
}
else if (change == 2)
{
printf("请输入新的性别: ");
scanf("%s",newsex);
Sex(h,LocateElem(h,f),newsex);
}
else if (change == 3)
{
printf("请输入新的学号: ");
scanf("%s",newid);
Id(h,LocateElem(h,f),newid);
}
else if (change == 4)
{
printf("请输入新的出生日期: ");
scanf("%s",newbirthday);
Birthday(h,LocateElem(h,f),newbirthday);
}
else
{
printf("请重新输入正确选项!\n");
}
system("cls");
printf("**正在修改,请稍后......\n");
for(int i=0;i<15;i++)
{
Sleep(100);
printf("**");
}
system("cls");
printf("修改成功!\n");
Menu();
}
/******************************************************************************************
*功能描述:显示学生信息
******************************************************************************************/
void Output()
{
printf("%s\n",(ListEmpty(h)?"输入错误!当前还未储存学生信息!\n":"\n"));
DispList(h);
Menu();
}
/******************************************************************************************
*功能描述:存入文件
******************************************************************************************/
void File()
{
int num4;
printf("请输入要保存的学生个数: ");
scanf("%d",&num4);
for (int i=0; i < num4; i++)
{
char ch ;
char cc='\n';
FILE *fp ; /* 定义文件指针 */
if ((fp=fopen("student.txt","a+")) == NULL)
{ /* 打开文件 */
printf("File open error!\n");
exit(0);
}
while ( (ch=getchar( ))!='\n')
fputc(ch, fp) ;
printf("请输入第%d个学生的详细信息\n", i+1);
printf("姓 名: ");
while ( (ch=getchar( ))!='\n')
fputc(ch, fp) ;
fputc(cc, fp) ;
printf("性 别: ");
while ( (ch=getchar( ))!='\n')
fputc(ch, fp) ;
fputc(cc, fp) ;
printf("学号: ");
while ( (ch=getchar( ))!='\n')
fputc(ch, fp) ;
fputc(cc, fp) ;
printf("出生日期: ");
while ( (ch=getchar( ))!='\n')
fputc(ch, fp) ;
fputc(cc, fp) ;
if (fclose(fp))
{ /* 关闭文件 */
printf ( "Can not close the file!\n" ); exit(0);
}
}
Menu();
}
/******************************************************************************************
*功能描述:读取文件
******************************************************************************************/
void Readfile()
{
char ch ;
FILE *fp ;//定义文件指针
if ((fp=fopen("student.txt","r")) == NULL)
{ // 按读方式打开文件
printf("File open error!\n");
exit(0);
}
int num5;
printf("请输入要读取的学生个数: ");
scanf("%d",&num5);
for (int i=0; i < num5; i++)
{
printf("姓名:\n");
ch= fgetc(fp);
while ( ch!='\n' )
{ // 读到的不是\n的话,继续读文件
putchar(ch) ;
ch=fgetc(fp);
}
printf("\n");
printf("性别:\n");
ch= fgetc(fp);
while ( ch!='\n' )
{ // 读到的不是\n的话,继续读文件
putchar(ch) ;
ch=fgetc(fp);
}
printf("\n");
printf("学号:\n");
ch= fgetc(fp);
while ( ch!='\n' )
{ // 读到的不是\n的话,继续读文件
putchar(ch) ;
ch=fgetc(fp);
}
printf("\n");
printf("出生日期:\n");
ch= fgetc(fp);
while ( ch!='\n' )
{ // 读到的不是\n的话,继续读文件
putchar(ch) ;
ch=fgetc(fp);
}
printf("\n");
}
if (fclose(fp))// 关闭文件
{
printf ( "Can not close the file!\n" ); exit(0);
}
Menu();
}
/*===================================================================================
*功能描述:创建空的链表
*输入参数:L—指针
*===================================================================================*/
void InitList(Address *&L)
{
L=(Address *)malloc(sizeof(Address));
L->next=NULL;
}
/*===================================================================================
*功能描述:销毁线性表,修改信息
*输入参数:L—指针
*===================================================================================*/
void DestroyList(Address *&L)
{
Address *p=L,*q=p->next;
while (q!=NULL)
{
free(p);
p=q;
q=p->next;
}
free(p);
}
/*===================================================================================
*功能描述:向单链表中插入信息
*输入参数:L—指针
*===================================================================================*/
bool ListInsert(Address *&L,int i,AList e)
{
int j=0;
Address *p=L,*s;
while (j<i-1 && p!=NULL)
{
j++;
p=p->next;
}
if (p==NULL) /*未找到第i-1个结点*/
return false;
else /*找到第i-1个结点*p*/
{
s=(Address *)malloc(sizeof(Address)); /*创建新结点*s*/
s->data=e;
s->next=p->next; /*将*s插入到*p之后*/
p->next=s;
s->next = NULL;
return true;
}
}
/*===================================================================================
*功能描述:输出线性表,当线性表不为空时,顺序显示各节点值域
*输入参数:L—指针
*===================================================================================*/
void DispList(Address *L)
{
Address *p=L->next;
while (p!=NULL)
{
printf("****************************************\n");
printf("*姓 名*:%s\n",p->data.name);
printf("*性 别*:%s\n",p->data.sex);
printf("*学 号*:%s\n",p->data.id);
printf("*出生日期*:%s\n",p->data.birthday);
printf("*************************************\n");
p=p->next;
}
printf("\n");
}
/*===================================================================================
*功能描述:尾插法建表即建立学生信息库
*输入参数:L—指针
a[]—数组
n—学生个数
*===================================================================================*/
void CreateListR(Address *&L, AList a[],int n)
{
Address * s, * r;
int i;
L = (Address *)malloc(sizeof(Address));
r = L;
for (i = 0; i < n; i++)
{
s = (Address *)malloc(sizeof(Address));
s->data=a[i];
r->next = s;
r = s;
}
r->next = NULL;
}
/*===================================================================================
*功能描述:判断线性表是否为空,即是是否储存了学生信息
*输入参数:L—指针
*===================================================================================*/
bool ListEmpty(Address *L)
{
return(L->next==NULL);
}
/*===================================================================================
*功能描述:显示所有学生的姓名
*输入参数:L—指针
*===================================================================================*/
void DispName(Address *L)
{
int i=1;
Address *p=L->next;
while (p!=NULL)
{
printf("<%d>.%s\n",i,p->data.name);
p=p->next;
i = i+1;
}
printf("\n");
}
/*===================================================================================
*功能描述:求线性表的长度即学生个数
*输入参数:L—指针
*===================================================================================*/
int ListLength(Address *L)
{
Address *p=L;int i=0;
while (p->next!=NULL)
{
i++;
p=p->next;
}
return(i);
}
/*===================================================================================
*功能描述:删除单链表中的数据元素,即删除学生及其所有的详细信息。
*输入参数:L—指针
i—学生个数
e—指针
*===================================================================================*/
bool ListDelete(Address *&L,int i,AList &e)
{
int j=0;
Address *p=L,*q;
while (j<i-1 && p!=NULL)
{
j++;
p=p->next;
}
if (p==NULL) /*未找到第i-1个结点*/
return false;
else /*找到第i-1个结点*p*/
{
q=p->next; /*q指向要删除的结点*/
if (q==NULL)
return 0;
e=q->data;
p->next=q->next; /*从单链表中删除*q结点*/
free(q); /*释放*q结点*/
num1--;
return true;
}
}
/*===================================================================================
*功能描述:按照姓名查找信息
*输入参数:name—输入姓名进行查找
*===================================================================================*/
void NameFound()
{
AList r;
AList f;
printf("按照姓名进行查找功能\n");
printf("请输入要查询的学生姓名: ");
scanf("%s",f.name);
system("cls");
printf("**正在查询,请稍后......\n");
for(int i=0;i<15;i++)
{
Sleep(100);
printf("**");
}
system("cls");
int a=LocateElem(h,f);
if (a!=0)
{
printf("你要查找的学生编号为%d\n",LocateElem(h,f));
printf("%s的详细信息如下:\n",f.name);
GetElem(h,LocateElem(h,f),r);
}
else
{
printf("该学生不存在!\n");}
SecondMenu();
}
/*===================================================================================
*功能描述:知道数据元素在单链表中的位置,学生位置
*输入参数:L—指针
e—指针
*===================================================================================*/
int LocateElem(Address *L,AList e)
{
Address *p=L->next;
int n=1;
while (p!=NULL && strcmp(p->data.name,e.name) != 0)
{
p=p->next;
n++;
}
if (p==NULL)
return(0);
else
return(n);
}
/*===================================================================================
*功能描述:查找某个位置的数据元素
*输入参数:L—指针
i—学生个数
e—指针
*===================================================================================*/
bool GetElem(Address *L,int i,AList &e)
{
int j=0;
Address *p=L;
while (j<i && p!=NULL)
{
j++;
p=p->next;
}
if (p==NULL)
return false;
else
{
e=p->data;
printf("******************************\n");
printf("*姓 名*: %s\n",e.name);
printf("*性 别*: %s\n",e.sex);
printf("*学 号*: %s\n",e.id);
printf("*出生日期*: %s\n",e.birthday);
printf("******************************\n");
return true;
}
}
/*===================================================================================
*功能描述:按照姓名进行排序
*输入参数:L—指针
n—序号
sort—数组
tmp—数组
*===================================================================================*/
void InsertSort(Address *L,int n)
{
AList sort[10];
char tmp[10];
int i1 = 0;
int j;
Address *p=L->next;
while (p!=NULL)
{
for (int j = 0; j < n; j++)
{
strcpy(sort[j].name,p->data.name);
p=p->next;
}
}
printf("\n");
for (i1 = 0; i1 < n-1; i1++)
{
for (j= n-1; j>i1; j--)
if (strcmp(sort[j].name,sort[j-1].name)<0)
{
strcpy(tmp,sort[j].name);
strcpy(sort[j].name,sort[j-1].name);
strcpy(sort[j-1].name,tmp);
}
}
printf("按姓名进行排序的结果如下: \n");
for (i1 = 0; i1 < n; i1++)
{
printf("<%d>.%s\n",i1,sort[i1].name);
}
}
/*===================================================================================
*功能描述:修改学生的姓名
*输入参数:L—指针
i—学生个数
*输出参数:newname—修改后的姓名
*===================================================================================*/
int Name(Address *&L,int i,char newname[])
{
int j=0;
Address *p=L,*q;
while (j<i-1 && p!=NULL)
{
j++;
p=p->next;
}
if (p==NULL) /*未找到第i-1个结点*/
return 0;
else /*找到第i-1个结点*p*/
{
q=p->next; /*q指向要删除的结点*/
if (q==NULL)
return 0;
strcpy(q->data.name,newname);
return 1;
}
}
/*===================================================================================
*功能描述:修改学生的性别
*输入参数:L—指针
i—学生个数
*输出参数:newsex—修改后的姓名
*===================================================================================*/
int Sex(Address *&L,int i,char newsex[])
{
int j=0;
Address *p=L,*q;
while (j<i-1 && p!=NULL)
{
j++;
p=p->next;
}
if (p==NULL) /*未找到第i-1个结点*/
return 0;
else /*找到第i-1个结点*p*/
{
q=p->next; /*q指向要删除的结点*/
if (q==NULL)
return 0;
strcpy(q->data.sex,newsex);
return 1;
}
}
/*===================================================================================
*功能描述:修改学生的学号
*输入参数:L—指针
i—学生个数
*输出参数:newid—修改后的学号
*===================================================================================*/
int Id(Address *&L,int i,int newid[10])
{
int j=0;
Address *p=L,*q;
while (j<i-1 && p!=NULL)
{
j++;
p=p->next;
}
if (p==NULL) /*未找到第i-1个结点*/
return 0;
else /*找到第i-1个结点*p*/
{
q=p->next; /*q指向要删除的结点*/
if (q==NULL)
return 0;
q->data.id[100]=newid[100];
return 1;
}
}
/*===================================================================================
*功能描述:修改学生的出生日期
*输入参数:L—指针
i—学生个数
*输出参数:newbirthday—修改后的出生日期
*===================================================================================*/
int Birthday(Address *&L,int i,int newbirthday[15])
{
int j=0;
Address *p=L,*q;
while (j<i-1 && p!=NULL)
{
j++;
p=p->next;
}
if (p==NULL) /*未找到第i-1个结点*/
return 0;
else /*找到第i-1个结点*p*/
{
q=p->next; /*q指向要删除的结点*/
if (q==NULL)
return 0;
q->data.birthday[15]=newbirthday[15];
return 1;
}
}
/******************************************************************************************
*功能描述:主界面
*输入参数:option1—菜单选择
*输出参数:
*返回值:
******************************************************************************************/
void Menu()
{
int option1;
printf("\t #####################################################################\n");
printf("\t # 学生信息管理系统 #\n");
printf("\t # #\n");
printf("\t # 1.添加 2. 删除 3.排序 #\n");
printf("\t # #\n");
printf("\t # 4.修改 5.显示 6.查询 #\n");
printf("\t # #\n");
printf("\t # 7.储存 8.读出 9.退出 #\n");
printf("\t #####################################################################\n");
printf(" 请输入您的选择(1、2、3、4、5、6,7): ");
scanf("%d",&option1);
system("cls");
if (option1 < 1 || option1 >9)
{
printf("输入错误,请重新输入!/n");
printf("\t #####################################################################\n");
printf("\t # 学生信息管理系统 #\n");
printf("\t # #\n");
printf("\t # 1.添加 2. 删除 3.排序 #\n");
printf("\t # #\n");
printf("\t # 4.修改 5.显示 6.查询 #\n");
printf("\t # #\n");
printf("\t # 7.储存 8.读出 9.退出 #\n");
printf("\t #####################################################################\n");
printf(" 请输入 选择(1、2、3、4、5、6): ");
scanf("%d", &option1);
}
switch (option1)
{
case 1: Input();
break;
case 2: Delete();
break;
case 3: Sort();
break;
case 4: Change();
break;
case 5: Output();
break;
case 6: SecondMenu();
break;
case 7: File();
break;
case 8:Readfile();
break;
case 9:
break;
}
}
/******************************************************************************************
*功能描述:选择界面
*输入参数:option2—菜单选择
******************************************************************************************/
void SecondMenu()
{
int option2;
printf("\t ┌─────────────────────────────────┐\n");
printf("\t │ │\n");
printf("\t │ 1.姓名查询 2.返回主菜单 │\n");
printf("\t │ │\n");
printf("\t └─────────────────────────────────┘\n");
printf("请选择要的查询方式(1、2): ");
scanf("%d", &option2);
system("cls");
if (option2 < 1 || option2 > 2)
{
printf("输入错误,请重新输入!/n");
printf("\t ┌─────────────────────────────────┐\n");
printf("\t │ │\n");
printf("\t │ 1.姓名查询 2.返回主菜单 │\n");
printf("\t │ │\n");
printf("\t └─────────────────────────────────┘\n");
printf("请选择要的查询方式(1、2): ");
scanf("%d", &option2);
}
switch (option2)
{
case 1: NameFound();
break;
case 2: Menu();
break;
}
}
部分运行结果: