目录
软件基本功能:
1.录入新生个人信息
2.后续新增新生的信息
3.根据新生的姓名删除其全部信息
4.展示已经录入和新增的新生信息
5.根据学生的姓名搜索信息
6.按照新生的英语入学成绩用冒泡排序进行从高到低的排序
7.根据学生的专业、性别或年龄进行信息的统计
8.将已输入链表内的数据按一定的格式保存到指定的文件内
9.退出
主菜单
软件基本功能: 定义结构体
typedef struct StuNode { char Name[20]; char sex[10]; int birthday; char zhuanye[20]; char add[100]; int score; struct StuNode *next; } Student, *StuPtr;
结构体的数据域存放了学生的姓名,性别,专业,出生日期,家庭地址,英语入学成绩,指针域存放的next为指针类型的成员,它指向struct类型的数据 。
根据面向对象的思想和方法创建一个学生单链表类class StuListlink { public: StuListlink() {}; void Luru(); void Liulan(); void Shanchu(); void Chaxun(); void Paixu(); void Tongji(); void Baocun(); void tuichu(); private: StuPtr head; StuPtr tail; int count; };
定义了单链表的头指针和尾指针,公有类里为程序需要实现的功能函数,包括单链表类的构造函数,创建一个带头结点的单链表函数,利用头插法插入到链表结点,从头结点遍历链表找到需要删除的结点,输出单链表的结点,遍历链表找到对应的节点输出,利用冒泡排序对链表地节点排序,保存链表内的数据域到文件内。
1.录入新生个人信息void StuListlink::Luru() { system("cls"); StuPtr p,pre; StuPtr PNode; int n; cout<<"第一次录入请输入1"<>n; switch (n) { case 1: cout<<"输入学生总数:"; cin>>count; if(count<0) { cout<<"ERROR MESSAGE!"< Name[0]=''; head->sex[0]=''; head->zhuanye[0]=''; head->birthday=0; head->add[0]=''; head->score=''; head->next=NULL; tail=head; for(int i=0; i >p->Name; cout<<"性别:"; cin>>p->sex; while(strcmp(p->sex,"男")!=0&&strcmp(p->sex,"女")!=0) { cout<<"输入的学生性别不符合规定,请重新输入!!"< >p->sex; } cout<<"专业:"; cin>>p->zhuanye; cout<<"生日(示例:20000000):"; cin>>p->birthday; cout<<"家庭地址:"; cin>>p->add; cout<<"英语分数:"; cin>>p->score; while(p->score<0) { cout<<"输入的分数不符合规定,请重新输入!!"< >p->score; } p->next=NULL; tail->next=p; tail=p; } cout<<"录入成功,一共"< 新增学生信息的函数中首先定义一个p指针,然后用switch函数选择是否为第一次录入学生信息,若为首次录入输入”1“,否则后续新增学生信息都输入”2“。首次录入输入需要录入的学生总数,如果数量少于0个,会提示错误信息,然后给head头指针开辟内存空间,将头指针的数据域全为空值,头结点指针域指向空数据,并且表头也是表尾,然后用for循环,循环的次数为输入的学生总数,然后为p指针开辟新的内存空间,依次输入新生的信息并存入到链表的数据域内,输入学生性别时利用strcmp比较只能为男或女,英语分数的格式只能为正数,然后将p接到表尾,结点p成为新的表尾。后续增加时开辟了PNode的内存空间,用头插法插入新添加的结点。
2.后续新增新生的信息case 2: StuPtr p,pre; StuPtr PNode; PNode=new Student; cout<<"姓名:"; cin>>PNode->Name; cout<<"性别:"; cin>>PNode->sex; while(strcmp(PNode->sex,"男")!=0&&strcmp(PNode->sex,"女")!=0) { cout<<"输入的学生性别不符合规定,请重新输入!!"<>PNode->sex; } cout<<"专业:"; cin>>PNode->zhuanye; cout<<"生日(示例:20010101):"; cin>>PNode->birthday; cout<<"家庭地址:"; cin>>PNode->add; cout<<"英语分数:"; cin>>PNode->score; while(PNode->score<0) { cout<<"输入的分数不符合规定,请重新输入!!"< >PNode->score; } p=head->next; pre=head; PNode->next=pre->next; pre->next=PNode; cout<<"新增成功!"< 3.根据新生的姓名删除其全部信息 void StuListlink::Shanchu() { system("cls"); char n[20]; StuPtr p,pre; cout<<"请输入想要删除学生的姓名:"; cin>>n; pre=head; p=head->next; while(p!=NULL) { if(strcmp(p->Name,n)==0) { pre->next=p->next; delete p; p=NULL; cout<<"删除成功!"; return; } pre=p; p=p->next; } cout<<"未找到该学生,删除失败!"; }输入学生姓名删除该学生的全部信息,定义p为当前遍历到的结点,pre为其前趋结点,利用while循环遍历学生链表到末尾,如果找到指定的学生姓名,就将其前趋结点的指针域指向待删结点的后续结点,并释放待删结点,给其赋值为NULL,删除该结点,若未找到该姓名的学生,则输出相关提示信息。
4.展示已经录入和新增的新生信息void StuListlink::Liulan() { system("cls"); StuPtr p; int n=1; p=head->next; if(p==NULL) { cout<<"学生不存在!"<Name<<"t"<<"性别:"< sex<<"t"<<"专业:"< zhuanye<<"t"<<"生日:"< birthday<<"t"<<"家庭住址:"< add<<"t"<<"英语成绩:"< score< next; n++; } cout<<"共用学生"< 浏览学生信息,定义一个int类型的n,并赋值为0,利用指针变量p从头到尾依次指向链表中每个结点,当指针指向结点时就输出该结点数据域中的内容,每循环一次,n都会自加一,直到遇到链表结束标志NULL为止,最后输出共有几个学生。如果是空链表,就只输出”学生不存在!“并且退回到主函数内。
5.根据学生的姓名搜索信息void StuListlink::Chaxun() { system("cls"); StuPtr p; char n[20]; bool flag=false; cout<<"输入查询的姓名:"<>n; p=head; while(p->next!=NULL) { if(strcmp(p->next->Name,n)==0) { cout<<"姓名:"; cout< next->Name; cout<<"性别:"; cout< next->sex; cout<<"专业:"; cout< next->zhuanye; cout< next->birthday; cout<<"生日:"; cout<<"家庭地址:"; cout< next->add; cout<<"英语成绩:"; cout< next->score< next; continue; } if(!flag) { cout<<"无此姓名!"< 按照学生的姓名进行查询:将bool类型的flag赋值为false,输入需要查询的学生姓名,利用while循环遍历链表,比较学生的姓名,然后输出该生的全部信息,若出现重名,则会将该姓名的全部学生信息输出,若找到该生,flag赋值为true,则输出相关提示信息。
6.按照新生的英语入学成绩用冒泡排序进行从高到低的排序void StuListlink::Paixu() { system("cls"); StuPtr p,pre,q; StuPtr end=NULL; while(head->next!=end) { pre=head; p=head->next; q=p->next; while(p->next!=end) { if(p->score>q->score) { pre->next=q; p->next=q->next; q->next=p; } else { p=p->next; } q=p->next; pre=pre->next; } end=p; cout<<"姓名:"; cout<Name; cout<<"性别:"; cout< sex; cout<<"专业:"; cout< zhuanye; cout<<"生日:"; cout< birthday; cout<<"家庭地址:"; cout< add; cout<<"英语成绩:"; cout< score< 按照学生的英语入学成绩进行排序,定义三个结构体类型的指针,pre定义为头结点,p为头结点的后趋节点,q为p的后趋节点,然后用while循环进行从大到小的冒泡排序,直到遍历到结尾,并且输出排序后的新链表。
7.根据学生的专业、性别或年龄进行信息的统计void StuListlink::Tongji() { system("cls"); StuPtr p,pre; p=head; char i[20]; int n; int k=0; int nl; cout<<"统计方式:"<>n; switch (n) { case 1: cout<<"请输入学生专业:"; cin>>i; while(p->next!=NULL) { if(strcmp(p->next->zhuanye,i)==0) { cout<<"姓名:"; cout< next->Name; cout<<"性别:"; cout< next->sex; cout<<"专业:"; cout< next->zhuanye; cout<<"生日:"; cout< next->birthday; cout<<"家庭地址:"; cout< next->add; cout<<"英语成绩:"; cout< next->score< next; continue; if(p->next==NULL) { cout<<"该专业学生不存在!"; return; } } break; case 2: cout<<"请输入学生性别:"; cin>>i; while(p->next!=NULL) { if(strcmp(p->next->sex,i)==0) { cout<<"姓名:"; cout< next->Name; cout<<"性别:"; cout< next->sex; cout<<"专业:"; cout< next->zhuanye; cout<<"生日:"; cout< next->birthday; cout<<"家庭地址:"; cout< next->add; cout<<"英语成绩:"; cout< next->score< next; continue; if(p->next==NULL) { cout<<"该性别的学生不存在!"; return; } } break; case 3: cout<<"请输入学生年龄:"; cin>>nl; while(p->next!=NULL) { if(2021-p->next->birthday/10000==nl) { cout<<"姓名:"; cout< next->Name; cout<<"性别:"; cout< next->sex; cout<<"专业:"; cout< next->zhuanye; cout<<"生日:"; cout< next->birthday; cout<<"家庭地址:"; cout< next->add; cout<<"英语成绩:"; cout< next->score< next; continue; if(p->next==NULL) { cout<<"该年龄的学生不存在!"; return; } } break; } cout<<"该方式的学生共有"< 按一定方式统计相关学生信息,定义p为头结点,利用switch选择统计方式。输入1为按学生专业统计,输入2为按性别统计,输入3为按年龄统计。三个方式利用的方法相同,皆利用while循环遍历学生链表,找到选择的方式地相关结点,用continue将符合方式的新生信息全部输出,若p为空链表,则输出相关提示信息。
输入1按专业统计,输入专业,该专业的学生全部打印,并显示共有多少名学生
输入2按性别统计,输入性别该性别的学生全部打印,并显示共有多少名学生
输入3按年龄统计,输入年龄,该年龄的学生全部打印,并显示共有多少名学生
8.将已输入链表内的数据按一定的格式保存到指定的文件内void StuListlink::Baocun() { system("cls"); ofstream outfile("D:\新生信息管理系统.txt"); StuPtr p; p=head->next; while(p!=NULL) { outfile<<"姓名:"<Name<<"t"<<"性别:"< sex<<"t"<<"专业:"< zhuanye<<"t"<<"生日:"< birthday<<"t"<<"家庭住址:"< add<<"t"<<"英语成绩:"< score< next; } outfile.close(); cout<<"学生信息保存成功!"< 保存学生信息到文件内,打开文件《新生信息管理系统.txt》,定义p的指针,p的指针域指向头结点的next结点,当p不为空时,向文件内写入链表数据域内的数据,直到p为空指针,循环结束,关闭文件。
保存的文件
9.退出 主菜单int main() { StuListlink stuListlink; system("color b4"); int a; system("cls"); while(1) { cout<>a; switch(a) { case 1: stuListlink.Luru(); system("pause"); system("cls"); break; case 2: stuListlink.Shanchu(); system("pause"); system("cls"); break; case 3: stuListlink.Liulan(); system("pause"); system("cls"); break; case 4: stuListlink.Chaxun(); system("pause"); system("cls"); break; case 5: stuListlink.Tongji(); system("pause"); system("cls"); break; case 6: stuListlink.Paixu(); system("pause"); system("cls"); break; case 7: stuListlink.Baocun(); system("pause"); system("cls"); break; case 8: exit(0); } } } 欢迎分享,转载请注明来源:内存溢出
评论列表(0条)