📄 stu_manager.cpp
字号:
//stu_manager.cpp
#include "stu_manager.h"
#include <iostream.h>
#include <string.h>
List::List()
{
head = NULL;
}
nodetype * List::creatlist (int n) //创建链表,n为列表数
{
nodetype * h=NULL, *s, *t;
int i=1;
for(int j=0; j<n; j++)
{
if(i==1) //创建第一个节点
{
h=new nodetype;
h->next=NULL;
t=h;
}
else //创建其余节点
{
s=new nodetype;
s->next=NULL;
t->next=s;
t=s; //t 始终指向生成的单链表的最后一个节点
}
i++;
}
head=h;
return h;
}
int List::listlen() //返回链表长度,以1,2,3,4……记
{nodetype * p=head;
int i;
for(i=1;p->next!=NULL;i++)p=p->next;
return i;
}
nodetype * List::findnode (int i) //通过查找序号返回节点的指针
{
nodetype * p=head;
int j=1; //j用来计数,从第1个开始
if( i>listlen()||i<=0 ) // i的值不在查询范围内
return NULL;
else
{
while( j<i && p->next!=NULL ) //查找第 i 个节点并由 p 指向该节点
{
j++;
p=p->next;
}
if(j<=i)return p; //确定跳出循环的原因是找到了i,而非是循环到了链表末被迫结束
else {cout<<"无此号!";return NULL;}
}
}
nodetype* List::findname1(char c[]) //通过查找姓名返回节点的指针
{
nodetype* p=head;
int j=1;
strcat(c, "\n"); //从外部读入的字符串末尾都带了一个换行符
while( p!=NULL && !(check(c, p->pe.name))) //查找第 i 个节点并由 p 指向该节点
{
j++;
p=p->next;
}
return p;
}
int List::findname2(char c[]) //通过查找姓名返回节点的序号
{
nodetype* p=head;
int j=1;
strcat(c, "\n"); //从外部读入的字符串末尾都带了一个换行符
while( p!=NULL && !(check(c, p->pe.name))) //查找第 i 个节点并由 p 指向该节点
{
j++;
p=p->next;
}
return j;
}
nodetype * List::insnode(int i)
{
nodetype *h=head, *p, *s;
s=new nodetype; //创建节点 s
s->next=NULL;
if(i==0) //i=0 时 s 作为第一个节点
{
s->next = h;
h=s; }
else
{
p=findnode(i); //查找第 i 个节点,并由 s 指向该节点,是向后插(即插在原来i与i+1之间)
if(p!=NULL)
{
s->next=p->next;
p->next=s;
}
else cout<<"输入的 i 错误"<<endl;
}
head=h;
return s;
}
void List::delnode(int i) //删除第 i 个节点
{
nodetype *h=head, *p=head, *s;
if(i==1) //删除第一个节点
{
h=h->next;
cout<<endl<<p->pe.name<<"....."<<"已被成功删除!"<<endl;
delete p;
}
else
{
p=findnode(i-1); //查找第 i-1 个节点,并由 p 指向这个节点
if(p!=NULL/*要找的到节点*/ && p->next!=NULL/*这个i-1的节点不能是最后一个*/)
{
s=p->next; // s 指向要删除的节点
p->next=s->next;
cout<<endl<<s->pe.name<<"....."<<"已被成功删除!"<<endl;
delete s;
}
else
cout<<"输入的 i 值不正确"<<endl;
}
head=h;
}
bool List::check(char *a, char *b) //对比两个字符串是否相等
{
int i;
int j=strlen(b);
for(i=0; i<j; i++)
{
if(*a==*b)
{
a++;
b++;
}
else
return 0;////不相等
}
return 1;////相等
}
nodetype* List::load()///////从外面stu_info.txt中载入数据
{
FILE *fp;
nodetype *p;
char c[200];////用来暂时存放从文件中读来的数据
int num;
if((fp=fopen("stu_info.txt", "a+"))==NULL)
{
cout<<"打开文件失败"<<endl;
return 0;
}
readstr(fp, c);
sscanf(c, "The Length Of Link: %d", &num); //从文件首句中获取链表长度,使用到格式化字符串输入
p=creatlist(num);
for(int i=0; i<num; i++)
{
readstr(fp, c);////从fp所指的文件中读取一字符串给c
strcpy(p->address, c);////把c再复制给address
readstr(fp, c);
strcpy(p->birthday, c);
readstr(fp, c);
strcpy(p->sc.num, c);
readstr(fp, c);
strcpy(p->sc.chinese, c);
readstr(fp, c);
strcpy(p->sc.english, c);
readstr(fp, c);
strcpy(p->sc.math, c);
readstr(fp, c);
strcpy(p->sc.physics, c);
readstr(fp, c);
strcpy(p->pe.name, c);
readstr(fp, c);
strcpy(p->pe.sex, c);
readstr(fp, c);
strcpy(p->pe.GJ, c);
readstr(fp, c);
strcpy(p->pe.MZ, c);
readstr(fp, c);
strcpy(p->pe.XL, c);
readstr(fp, c);
strcpy(p->te.SJ, c);
readstr(fp, c);
strcpy(p->te.JD, c);
readstr(fp, c);
strcpy(p->te.XD, c);
p=p->next;
}
fclose(fp);
return p;
}
void List::readstr(FILE *f,char *string)
{
do
{
fgets(string, 255, f); // 从f所指的文件中读出255-1个字符,然后加上"\0"送入字符数组string中
} while ((string[0] == '/') || (string[0] == '\n'));
return;
}
void List::help()
{
cout<<endl<<endl;
cout<<"*********************************************************"<<endl;
cout<<"1: 编辑个人信息"<<endl;
cout<<"2: 编辑学科成绩"<<endl;
cout<<"3: 编辑联系方式"<<endl;
cout<<"4: 显示个人信息"<<endl;
cout<<"5: 显示学科成绩"<<endl;
cout<<"6: 显示联系方式"<<endl;
cout<<"7: 显示该学生所有信息"<<endl;
cout<<"8: 帮助菜单"<<endl;
cout<<"9: 返回上一级菜单"<<endl;
cout<<"*********************************************************"<<endl;
}
void List::editperson(nodetype* p)
{
char c[100];
cout<<"请输入姓名: "<<endl;
cin>>c;
strcat(c, "\n");
strcpy(p->pe.name, c);
cout<<"请输入性别:"<<endl;
cin>>c;
strcat(c, "\n");
strcpy(p->pe.sex, c);
cout<<"请输入生日: (格式举例:19990101)"<<endl;
cin>>c;
strcat(c, "\n");
strcpy(p->birthday, c);
cout<<"请输入民族:"<<endl;
cin>>c;
strcat(c, "\n");
strcpy(p->pe.MZ, c);
cout<<"请输入国籍:"<<endl;
cin>>c;
strcat(c, "\n");
strcpy(p->pe.GJ, c);
cout<<"请输入学历:"<<endl;
cin>>c;
strcat(c, "\n");
strcpy(p->pe.XL, c);
cout<<"请输入家庭住址:(格式举例:浙江杭州)"<<endl;
cin>>c;
strcat(c, "\n");
strcpy(p->address, c);
cout<<"编辑个人信息完成!"<<endl;
dispperson(p);
}
void List::editscore(nodetype* p)
{
char a[50];
cout<<"请输入学号: "<<endl;
cin>>a;
strcat(a, "\n");
strcpy(p->sc.num, a);
cout<<"请输入语文成绩: "<<endl;
cin>>a;
strcat(a, "\n");
strcpy(p->sc.chinese, a);
cout<<"请输入英语成绩: "<<endl;
cin>>a;
strcat(a, "\n");
strcpy(p->sc.english, a);
cout<<"请输入数学成绩: "<<endl;
cin>>a;
strcat(a, "\n");
strcpy(p->sc.math, a);
cout<<"请输入物理成绩: "<<endl;
cin>>a;
strcat(a, "\n");
strcpy(p->sc.physics, a);
cout<<"编辑学科成绩完成!"<<endl;
dispscore(p);
}
void List::edittelephone(nodetype* p)
{
char c[50];
cout<<"请输入手机号码: "<<endl;
cin>>c;
strcat(c, "\n");
strcpy(p->te.SJ, c);
cout<<"请输入家庭电话号码: "<<endl;
cin>>c;
strcat(c, "\n");
strcpy(p->te.JD, c);
cout<<"请输入学校电话号码: "<<endl;
cin>>c;
strcat(c, "\n");
strcpy(p->te.XD, c);
cout<<"编辑联系方式完成!"<<endl;
disptelephone(p);
}
void List::dispnode(nodetype* p) //显示一个学生的所有信息
{
if(p!=NULL)
{
dispperson(p);
dispscore(p);
disptelephone(p);
}
}
void List::dispname() //显示所有学生姓名
{
nodetype* p=head;
cout<<"现有的学生: "<<endl;
if(p==NULL)
cout<<"没有任何学生数据"<<endl;
while(p!=NULL)
{
cout<<"姓名: "<<p->pe.name;
p=p->next;
}
}
void List::dispperson(nodetype* p)
{
cout<<"姓名: "<<p->pe.name;
cout<<"性别: "<<p->pe.sex;
cout<<"民族: "<<p->pe.MZ;
cout<<"国籍: "<<p->pe.GJ;
cout<<"学历: "<<p->pe.XL;
cout<<"出生日期: "<<p->birthday;
cout<<"家庭住址: "<<p->address;
}
void List::dispscore(nodetype* p)
{
cout<<"学号: "<<p->sc.num;
cout<<"大学语文成绩: "<<p->sc.chinese;
cout<<"英语成绩: "<<p->sc.english;
cout<<"数学成绩: "<<p->sc.math;
cout<<"物理成绩: "<<p->sc.physics;
}
void List::disptelephone(nodetype* p)
{
cout<<"手机号码是: "<<p->te.SJ;
cout<<"家庭电话是: "<<p->te.JD;
cout<<"学校电话是: "<<p->te.XD;
}
List::~List()
{
nodetype *p1=head, *p2;
if(p1!=NULL)
{
p2=p1->next;
if(p2==NULL)
delete p1;
else
{
while(p2!=NULL)
{
delete p1;
p1=p2;
p2=p2->next;
}
delete p1;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -