#include<malloc.h>
#include<iostream>
#include<string.h>
#define OK 1;
#define ERROR -1;
#define ZERO 0;
using namespace std;
typedef struct student
{
char num[11];
char name[20];
float score;
};
typedef struct NODE
{
student elem;
NODE *next;
};
typedef struct LINK_LIST
{
NODE *head;
};
//单链表的建立
int InitList(LINK_LIST *L)
{
L->head=(NODE*)malloc(sizeof(NODE));
if(L->head) {L->head->next=NULL;
return OK;}
else return ERROR;
}
//销毁链表
void DestoryList(LINK_LIST *L)
{
NODE *p;
while(L->head)
{
p=L->head;L->head=L->head->next;
free(p);
}
}
//清空链表
void ClearList(LINK_LIST *L)
{
NODE *p;
while(L->head->next)
{
p=L->head->next;
L->head->next=p->next;
free(p);
}
}
//求链表的长度
int ListLength(LINK_LIST L)
{
NODE*p;
int len=0;
for(p=L.head;p->next!=0;p=p->next)
{
len++;
}
return(len);
}
//通过e返回链表L中第i个元素的内容
void GetElem(LINK_LIST *L,int i,student *e)
{ NODE*p;int j;
if(i<1||i>ListLength(*L))
exit(-1);
p=L->head;
for(j=0;j<i;j++)
{
p=p->next;}
*e=p->elem;
}
//在链表中检索值为e的数据元素 按姓名查找
NODE *locatnum(LINK_LIST L,student e)
{
NODE *p;
for(p=L.head->next;p&&strcmp(p->elem.name,e.name)!=0;p=p->next)
return(p);
}
//在链表中检索值为e的数据元素// //按学号查找
NODE *LocatName(LINK_LIST L,student e)
{
NODE*p;
for(p=L.head->next;p&&strcmp(p->elem.num,e.num)!=0;p=p->next)
return(p);
}
//在链表L中第i个数据元素之前插入数据元素e
int ListInsert(LINK_LIST *L,int i,student e)
{
NODE *p,*s;
if(i<1||i>ListLength(*L)+1) return ERROR;
p=L->head;
for(int j=0;j<i-1;j++)
p=p->next;
s=(NODE *)malloc(sizeof(NODE));
if(s=NULL)return ERROR;
s->elem=e;
s->next=p->next;
p->next=s;
return OK;
}
//将链表L中第i个数据元素删除,并将其内容保存在e中。
int ListDelete(LINK_LIST *L,int i,student *e)
{
NODE *p, *s;
if (i<1||i>ListLength(*L)) return ERROR; //检查i值的合理性
p=L->head;
for(int j=0;j<i-1;j++) //寻找第i-1个结点
p=p->next;
s=p->next; //用s指向将要删除的结点
p->next=s->next; //删除s指针所指向的结点
*e=s->elem;
free(s);
return OK;
}
/************导入学生信息****************/
int dao_ru(LINK_LIST *L)
{NODE *r;
FILE *fp=NULL;
NODE *p=L->head->next;
if(!(fp=fopen("C:\\学生信息.txt","r"))){cout<<"不存在该文件\n";return ERROR;}
if(ferror(fp))return ERROR;
if(fgetc(fp)==EOF){cout<<"文件为空\n";return ERROR;}
while(!feof(fp))
{
p=new NODE;
fscanf(fp,"%s",p->elem.num);
fscanf(fp,"%s",p->elem.name);
fscanf(fp,"%d",&p->elem.score);
p->next=NULL;
r->next=p;
r=p;
}
fclose(fp);
return OK;
}
/***********输入学生的数据**************/
int shu_ru(LINK_LIST *NL)
{
student e;int sum;
cout<<"请输入学生的数量:";
cin>>sum;
for(int i=1;i<=sum;i++)
{
cout<<"依次输入学号,姓名,成绩:";
cin>>e.num>>e.name>>e.score;
ListInsert(&*NL,i+ListLength(*NL),e);
}
if(ListLength(*NL)==sum)return OK;
}
/**************显示学生的信息*****************/
void xianshi(LINK_LIST NL)
{
student e;int i;
cout<<"学生信息如下:\n";
for(i=1;i<=ListLength(NL);i++)
{GetElem(&NL,i,&e);cout<<"-----------------------\n"<<e.num<<" "<<e.name<<" "<<e.score<<"\n----------------------\n"<<endl;}
}
/*************查找学生的信息****************/
void cha_zhao(LINK_LIST L)
{
student s;NODE *p;
cout<<"请输入将要查找学生的姓名:";
scanf("%s",s.name);
p=locatnum(L,s);
if(p)cout<<s.name<<"的学号和成绩如下:\n"<<p->elem.num<<" "<<p->elem.score<<endl<<endl;
else cout<<"文件不存在该学生\n";
}
/*************查询学生的信息*************/
void cha_xun(LINK_LIST L)
{
int i;
student e;
cout<<"请输入要查询的学生的序号:";
cin>>i;
GetElem(&L,i,&e);
if(e.num)cout<<"序号为"<<i<<"的学生信息如下\n"<<e.name<<" "<<e.num<<" "<<e.score<<endl<<endl;
else cout<<"文件不存在该学生\n";
}
/**************插入学生的信息*************/
int cha_ru(LINK_LIST *L)
{
student s;int len;
cout<<"请依次输入学生的学号,姓名,成绩:";
cin>>s.num>>s.name>>s.score;
len=ListLength(*L);
ListInsert(&*L,len+1,s);
return OK;
}
/**************删除学生的信息**************/
int shang_chu(LINK_LIST *L)
{
student e;
int place;
cout<<"请输入将要删除的学生的序号:";
cin>>place;
ListDelete(&*L,place,&e);
return OK;
}
/***************统计学生的信息**************/
void tong_ji(LINK_LIST L)
{
if(L.head)cout<<"总共有"<<ListLength(L)<<"个学生\n\n";
else cout<<"不存在学生信息\n\n";
}
/***************保存并退出*************/
int chun_pan(LINK_LIST L)
{
FILE *fp;
NODE *p;
p=L.head->next;
if(!(fp=fopen("C:\\学生信息.txt","w")))cout<<"打开文件错误\n";
for(;p;p=p->next){
fprintf(fp," %s",p->elem.num);
fprintf(fp," %s",p->elem.name);
fprintf(fp," %d",p->elem.score);
}
fclose(fp);
return OK;
}
int qing_kong(LINK_LIST *NL)
{
ClearList(NL);
return OK;
}
int main()
{
LINK_LIST NL;
int a,c=1;
InitList(&NL);
cout<<" 学生管理系统 \n";
cout<<"*****************************************************************************\n";
cout<<"* (1)根据指定学生个数,逐个输入学生数据 *\n";
cout<<"* (2)逐个显示学生表中所有学生的相关信息 *\n";
cout<<"* (3)根据姓名进行查找,返回此学生的学号和成绩 *\n";
cout<<"* (4)根据指定的位置可返回相应的学生信息(学号,姓名,成绩) *\n";
cout<<"* (5)给定一个学生信息,插入到表中指定的位置 *\n";
cout<<"* (6)删除指定位置的学生记录 *\n";
cout<<"* (7)统计表中学生个数 *\n";
cout<<"* (8)导入学生信息 *\n";
cout<<"* (0)保存学生信息并退出 *\n";
cout<<"* (9)清空学生信息 *\n";
cout<<"*****************************************************************************\n";
cout<<" 按数字键选择对应的功能[0~9]\n";
cin>>a;
while(a)
{
if(a<0||a>9){cout<<"输入错误!请重新输入:";cin>>a;}
switch(a)
{
case 1:cout<<" "<<"(1)输入学生数据\n";if(shu_ru(&NL))cout<<"数据输入成功\n";else cout<<"数据输入失败\n";break;
case 2:cout<<" "<<"(2)显示学生信息\n";xianshi(NL);break;
case 3:cout<<" "<<"(3)姓名查找\n";cha_zhao(NL);break;
case 4:cout<<" "<<"(4)指定学生信息";cha_xun(NL);break;
case 5:cout<<" "<<"(5)插入学生信息";if(cha_ru(&NL))cout<<"数据插入成功\n";else cout<<"数据插入失败\n";break;
}
}
return 0;
}
只有本站会员才能查看附件,请 登录