<pre class="cpp" name="code">本次实验设计了一个学生管理系统,程序运用结构体 链表,学生的信息分为了四大项,分别是学生的学号、姓名、年龄、成绩,这四项一起作为链表节点的数据部分,程序功能如下: (1)输入成绩 (2)输出成绩 (3)删除成绩 (4)学生总数的显示 (5)查找成绩 (6)插入成绩 (7)根据学生的成绩进行排序 (8)统计不及格的人数并显示出来
xueshengchengji.h
#define N 50 typedef struct LNode//数据节点定义 { char num[N];//学号 char name[N];//姓名 int age;//年龄 float Score;//成绩 LNode *next; }LNode; class LinkList//链表类 { private://将节点封装为私有变量 LNode *head; int length; public: LinkList();//构造函数 bool IsCreate();//判断是否建立链表 void ListSize();//求链表长度 void CreatList(); //建立链表 void InsertList();//插入 void DeleteList();//删除 void Find(); //查找 void Display(); //显示数据 void BubbleSortList();//链表的冒泡排序法 void Count();//统计成绩不及格的人数 };
xueshengchengji.cpp
#include "xueshengchengji.h" #include <iostream> #include <string.h> #include <stdlib.h> #include <conio.h> using namespace std; LinkList::LinkList()//链表的初始化 { head=(LNode *)malloc(sizeof(LNode)); head->next=NULL; length=0; } //判断用户是否建立了链表,如果是,则返回值为1,反之为0 bool LinkList::IsCreate() { if(length==0) return 0; return 1; } //数据长度 void LinkList::ListSize() { if(!IsCreate()) { cout<<"您还没有建表,请先建表!"<<endl; cout<<"请按任意键继续. . ."<<endl; getch(); } else { cout<<"共存储了"<<length<<"个学生的数据信息."<<endl; cout<<"********************************************************************************"<<endl; cout<<"请按任意键继续. . ."<<endl; getch(); } } /*运行建立链表的程序时,先预先判断是否建立了链表, 如果建立了链表,则返回主菜单;如果没有建表,则建立链表*/ void LinkList::CreatList() { if(IsCreate()) { cout<<"已经建立链表!"<<endl<<"请按任意键继续. . . "<<endl; getch(); } else { int n; cout<<"请输入要输入成绩的学生个数: "; cin>>n; LNode *p=head;//头插法建立链表 length=n; for(int i=n;i>0;i--) { LNode *p=(LNode *)malloc(sizeof(LNode)); cout<<"请输入学号: ";cin>>p->num; cout<<"请输入姓名: ";cin>>p->name; cout<<"请输入年龄: ";cin>>p->age; cout<<"请输入成绩: ";cin>>p->Score; p->next=head->next;//指向头节点的指针指向指针指向的下一个节点 head->next=p; } cout<<"********************************************************************************"<<endl; cout<<"请按任意键继续. . ."<<endl; getch(); } } //查找成绩 void LinkList::Find() { if(!IsCreate()) { cout<<"您还没有建表,请先建表!"<<endl; cout<<"请按任意键继续. . ."<<endl; getch(); } else /*利用while循环从头结点开始,循环查找各个节点,直到找到为止, 若查找循环结束后仍然未找到,则提示输出“无法查找到所要查找的学生信息!”*/ { char num[N]; cout<<"请输入学号: "; cin>>num; LNode *p=head->next; while(p&&strcmp(p->num,num)!=0) { p=p->next; } if(!p)cout<<"无法查找到所要查找的学生成绩!"<<endl; else{ cout<<"姓名: "<<p->name<<endl; cout<<"年龄: "<<p->age<<endl; cout<<"成绩: "<<p->Score<<endl; } cout<<"********************************************************************************"<<endl; cout<<"请按任意键继续. . ."<<endl; getch(); } } //删除成绩 void LinkList::DeleteList() { if(!IsCreate()) { cout<<"您还没有建表,请先建表!"<<endl; cout<<"请按任意键继续. . ."<<endl; getch(); } else//利用while循环从头结点开始,循环查找各个节点 { char num[N]; cout<<"请输入所要删除的学生的学号:"; cin>>num; LNode *p=head; while(p->next&&strcmp(p->next->num,num)!=0) { p->next=p->next->next; } if(!(p->next)) cout<<"找不到所要删除的内容,操作失败!"; else//找到后将当前节点的前一个节点的next指针指向当前节点的下一个节点,并且释放当前节点 { length--; LNode *q=p->next; p->next=p->next->next; free(q); } cout<<"********************************************************************************"<<endl; cout<<"请按任意键继续. . ."<<endl; getch(); } } //显示学生成绩 void LinkList::Display() { if(!IsCreate()) { cout<<"您还没有建表,请先建表!"<<endl; cout<<"请按任意键继续. . ."<<endl; getch(); } else//利用链表的循环查找方式从头结点的下一个节点依次输出数据 { cout<<"所有学生的成绩如下:"<<endl; cout<<"共有"<<length<<"个学生的成绩"<<endl; LNode *p=head->next; while(p) { cout<<"学号: "<<p->num<<endl; cout<<"姓名: "<<p->name<<endl; cout<<"年龄: "<<p->age<<endl; cout<<"成绩: "<<p->Score<<endl<<endl; p=p->next; } cout<<"********************************************************************************"<<endl; cout<<"请按任意键继续. . ."<<endl; getch(); } } //插入成绩 void LinkList::InsertList() { if(!IsCreate()) { cout<<"您还没有建表,请先建表!"<<endl; cout<<"请按任意键继续. . ."<<endl; getch(); } else { int n,i=1; cout<<"请输入要插入的位置: "; cin>>n; if(n<1||n>length+1)cout<<"插入的位置不正确,操作失败!"<<endl; else//利用while循环从头结点开始,循环查找各个节点 { LNode *q,*p=head; q=(LNode *)malloc(sizeof(LNode)); while(i<n) { p=p->next; i++; } cout<<"请输入学号: ";cin>>q->num; cout<<"请输入姓名: ";cin>>q->name; cout<<"请输入年龄: ";cin>>q->age; cout<<"请输入成绩: ";cin>>q->Score; /*先将要插入的节点的next指针指向找到的节点的下一个节点, 再将找到的节点的next指针指向要插入的节点*/ q->next=p->next; p->next=q; length++; cout<<"********************************************************************************"<<endl; cout<<"请按任意键继续. . ."<<endl; getch(); } } } //成绩排序 void LinkList::BubbleSortList() //链表冒泡排序 { if(!IsCreate()) { cout<<"您还没有建表,请先建表!"<<endl; cout<<"请按任意键继续. . ."<<endl; getch(); } else//定义两个节点,比较后如果要交换,则把节点的顺序部分交换,而节点的位置并没有改变 { LNode *_temp=head->next; LNode *_node=head->next; char temp1[N],temp2[N]; int temp3; float temp4; for(;_temp->next;_temp=_temp->next) { for(_node=head->next;_node->next;_node=_node->next) { if(_node->Score<_node->next->Score) { strcpy(temp1,_node->num); strcpy(_node->num,_node->next->num); strcpy(_node->next->num,temp1); strcpy(temp2,_node->name); strcpy(_node->name,_node->next->name); strcpy(_node->next->name,temp2); temp3=_node->age; _node->age=_node->next->age; _node->next->age=temp3; temp4=_node->Score; _node->Score=_node->next->Score; _node->next->Score=temp4; } } } } } //统计不及格人数模块 void LinkList::Count() { if(!IsCreate()) { cout<<"您还没有建表,请先建表!"<<endl; cout<<"请按任意键继续. . ."<<endl; getch(); } else { LNode *p=head->next; int count=0;//设置一个计数变量count并赋初值为0 while(p)//若当前节点的Score的值小于60,则count加1,直到整个链表查找完后,count的值就是不及格的人数 { if(p->Score<60) count++; p=p->next; } cout<<"这"<<length<<"名学生中有"<<count<<"名学生成绩不及格."<<endl; cout<<"********************************************************************************"<<endl; cout<<"请按任意键继续. . ."<<endl; getch(); } }
main.cpp
#include "xueshengchengji.h" #include <iostream> #include <string.h> #include <stdlib.h> #include <conio.h> using namespace std; int main() { LinkList L; int order,flag=1,confirm=1; char a[50]; cout<<" *********************欢迎进入学生信息管理系统**********************"<<endl; while(confirm) { while(flag) { cout<<" * 请输入命令: *"<<endl; cout<<" * 1.输入学生成绩 *** 2.输出学生成绩 *"<<endl; cout<<" * 3.插入学生成绩 *** 4.删除学生成绩 *"<<endl; cout<<" * 5.查询学生成绩 *** 6.显示学生成绩 *"<<endl; cout<<" * 7.按照成绩排序 *** 8.显示不及格的人数 *"<<endl; cout<<" 9.退出系统 "<<endl; cout<<"输入命令(数字标号):"; cin>>order; switch(order) { case 1: L.CreatList();break; case 2: L.Display();;break; case 3: L.InsertList();break; case 4: L.DeleteList();;break; case 5: L.Find();break; case 6: L.ListSize();break; case 7: L.BubbleSortList();break; case 8: L.Count();break; case 9: flag=0;break; } cout<<endl; } question: cout<<"您确定要退出吗?(Y/N): "; cin>>a; if(!strcmp(a,"Y")||!strcmp(a,"y")) { cout<<"欢迎下次再使用本系统,谢谢!"<<endl; confirm=0; } else if(!strcmp(a,"N")||!strcmp(a,"n"))flag=1; else { cout<<"您输入的命令不正确,请重新输入!"<<endl; goto question; } } system("pause"); return 0; }
(1)输入成绩运行结果如下:
(2)输出成绩运行结果如下:
(3)删除成绩运行结果如下:
(4)显示学生总数运行结果如下:
(5)查找成绩运行结果如下:
(6)插入成绩运行结果如下:
(8)显示不及格的人数运行结果如下: