用C++实现学生信息管理系统,用到线性表的数据结构,用单链表实现。
首先看看什么是单链表,有什么特点:
1.单链表每个节点存储其数据和指向下一个节点的指针,即数据域和指针域,两个逻辑上相邻的元素存储位置不一定相邻。节点定义如下:
typedef struct LNode{
ElemType data;
LNode *next;
}LNode;
其中ElemType是学生基本信息的结构体,其定义如下:
typedef struct StuInfo{
char stuID[10];
char name[15];
int age;
char city[15];
char tel[15];
}ElemType;
2.单链表可以由头指针唯一确定,遍历单链表只能从头开始。
3.每个元素都有唯一前驱和唯一后继,除头节点和尾节点。
4.内存动态分配,当需要插入数据时申请一个相应的空间即可,元素个数不受限制较为灵活。
5.基本操作:插入、删除、输出、修改、查找、排序等等。
由于是C++实现,基本操作全部封装在类的成员函数里面。
源码如下:
/*---------------------------------/
/Date:2016-09-14-------------------/
/Function:Using single-list to achieve the management of students/
/From:<<Data Struct Examples>>-----/
/Author:---------------------------/
/---------------------------------*/
#include <iostream>
#include <iomanip>
#include <string.h>
#include <stdlib.h>
using namespace std;
typedef struct StuInfo{
char stuID[10];
char name[15];
int age;
char city[15];
char tel[15];
}ElemType;
typedef struct LNode{
ElemType data;
LNode *next;
}LNode;
class CLinkList{
private:
LNode *head;
public:
CLinkList();
virtual ~CLinkList();
bool IsListEmpty();
void ClearList();
void CreatList();
int GetListLength();
LNode* LocateElem(ElemType e);
LNode* LocateElem(int pos);
void InputStuInfo(ElemType &e);
bool ListInsert(ElemType &e,int i);
bool UpdateList(const ElemType &e,ElemType e1);
LNode *GetElem(int pos);
void OutputList();
bool ListDelete(ElemType e,int pos);
};
//构造一个只有头节点的空链表
CLinkList::CLinkList(){
head=new LNode;
head->next=NULL;
}
//析构函数清空链表
CLinkList::~CLinkList(){
LNode *p=head->next,*q;
while(p){
q=p->next;
delete p;
p=q;
}
delete head;
}
int CLinkList::GetListLength(){
LNode *p;
p=head->next; //指针p指向头节点的后继节点
int i=0;
while(p){ //p不为空则计数器累加
i++;
p=p->next;
}
return i;
}
<span style="font-family: Arial, Helvetica, sans-serif;">void CLinkList::OutputList(){</span>
LNode *p=head->next;
if(p==NULL) cout<<"没有信息!"<<endl;
else
cout<<setw(15)<<"学号"<<setw(15)<<"姓名"<<setw(15)<<"年龄"<<setw(15)<<"生源地"<<setw(15)<<"联系电话"<<endl;
while(p){
cout<<setw(15)<<p->data.stuID<<setw(15)<<p->data.name<<setw(15)<<p->data.age<<setw(15)<<p->data.city<<setw(15)<<p->data.tel<<endl;
p=p->next;
}
}
bool CLinkList::IsListEmpty(){
if(GetListLength()==0) return true;
else
return false;
}
void CLinkList::ClearList(){
LNode *p=head->next,*q;
while(p){
q=p->next;
delete p;
p=q;
}
head->next=NULL; //得到带头节点的空链表
}
void CLinkList::CreatList(){
LNode *s;
ElemType e;
bool judge;
judge=IsListEmpty();
if(judge==false)
ClearList();
cout<<"输入学号为!时结束!"<<endl;
cout<<"输入学生学号:";
cin>>e.stuID;
while(strcmp(e.stuID,"!")){
cout<<"输入学生姓名:";
cin>>e.name;
cout<<"输入学生年龄:";
cin>>e.age;
cout<<"输入学生源地:";
cin>>e.city;
cout<<"输入联系电话:";
cin>>e.tel;
cout<<endl;
s=new LNode;
s->data=e;
s->next=head->next;
head->next=s;
cout<<"输入学生学号:";
cin>>e.stuID;
}
cout<<"链表建成"<<endl;
}
bool CLinkList::ListInsert(ElemType &e,int i){
int j=1;
LNode *s,*p;
s=new LNode; //建立一个待插入的节点s
s->data=e;
p=head;
while(j<i && p->next!=NULL){
p=p->next;
j++;
}
if(j==i){
s->next=p->next;
p->next=s;
return true;
}
else
return false;
}
bool CLinkList::ListDelete(ElemType e,int i){
int j=1;
LNode *p,*q;
q=head;
p=q->next;
if(p==NULL)
cout<<"\n此链表为空链表"<<endl;
while(j<i && p->next!=NULL){
q=p;
p=p->next;
j++;
}
if(p!=NULL){
e=p->data;
q->next=p->next;
delete p;
return true;
}
return false;
}
//按内容定位
LNode *CLinkList::LocateElem(ElemType e){
LNode *p;
p=head->next;
while(p!=NULL && strcmp(p->data.stuID,e.stuID)!=0){
p=p->next;
}
if(p==NULL){
cout<<"\n该链表中不存在该元素"<<endl;
return NULL;
}
return p;
}
//按序号定位
LNode *CLinkList::LocateElem(int i){
int j=1;
LNode *p;
p=head;
//判断输入是否合法
if(i<1||i>GetListLength()){
cout<<"单链表中不存在该元素"<<endl;
return NULL;
}
while(j<i && p->next!=NULL){
p=p->next;
j++;
}
if(j==i)
return p->next;
}
void CLinkList::InputStuInfo(ElemType &e){
cout<<"输入学生学号:";
cin>>e.stuID;
cout<<"输入学生姓名:";
cin>>e.name;
cout<<"输入学生年龄:";
cin>>e.age;
cout<<"输入学生源地:";
cin>>e.city;
cout<<"输入联系电话:";
cin>>e.tel;
cout<<endl;
}
bool CLinkList::UpdateList(const ElemType &e,ElemType e1){
LNode *p;
p=head->next;
while(p){
if(strcmp(p->data.stuID,e.stuID)==0){
p->data=e1;
return true;
}
p=p->next;
}
return false;
}
LNode *CLinkList::GetElem(int pos){
LNode *p;
p=LocateElem(pos);
if(p==NULL){
return NULL;
}
else
return p;
}
int Menu_Select();
void Menu_show();
void Menu_show(){
cout<<"---------------------------------"<<endl;
cout<<"---------学生信息管理系统---------"<<endl<<endl;
cout<<"--------1.生成学生信息表格--------"<<endl;
cout<<"--------2.插入学生基本信息--------"<<endl;
cout<<"--------3.修改学生基本信息--------"<<endl;
cout<<"--------4.删除学生基本信息--------"<<endl;
cout<<"--------5.查询学生基本信息--------"<<endl;
cout<<"--------6.输出学生基本信息--------"<<endl;
cout<<"--------7.退出学生信息系统--------"<<endl;
cout<<"---------------------------------"<<endl;
cout<<endl;
cout<<"*提示:输入编号并回车进行相应操作*"<<endl;
}
int Menu_Select(){
int selectNum;
for(;;){
cout<<"输入操作编号:";
cin>>selectNum;
if(selectNum<1||selectNum>7)
cout<<"输入有误,请重新输入!"<<endl;
else break;
}
return selectNum;
}
int main(void){
CLinkList list;
ElemType e,e1;
LNode *p;
Menu_show();
while(1){
switch(Menu_Select()){
case 1:
list.CreatList();
break;
case 2:
int i;
bool judge;
cout<<"插入的位置:";
cin>>i;
cout<<endl;
if(i<1||i>list.GetListLength()+1)
cout<<"插入的位置不合法!"<<endl;
else{
cout<<"请输入学生信息以及插入位置!"<<endl;
list.InputStuInfo(e);
judge=list.ListInsert(e,i);
if(false==judge)
cout<<"插入位置出错!"<<endl;
else
cout<<"插入信息成功!"<<endl;
}
break;
case 3:
cout<<"请输入要修改的学生学号:";
cin>>e.stuID;
cout<<endl;
p=list.LocateElem(e);
if(p){
cout<<"输入该学生的新信息:"<<endl;
list.InputStuInfo(e1);
list.UpdateList(e,e1);
cout<<"修改信息成功!"<<endl;
}
break;
case 4:
int pos;
cout<<"删除的位置:";
cin>>pos;
cout<<endl;
if(pos<1||pos>list.GetListLength())
cout<<"删除位置不合法!"<<endl;
else{
list.ListDelete(e,pos);
cout<<"删除学生信息成功!"<<endl;
}
break;
case 5:
cout<<"输入要查询学生的学号:"<<endl;
cin>>e.stuID;
p=list.LocateElem(e);
if(p!=NULL)
cout<<p->data.stuID<<setw(15)<<p->data.name<<setw(15)<<p->data.age<<setw(15)<<p->data.city<<setw(15)<<p->data.tel<<endl;
case 6:
cout<<"输出结果为:"<<endl;
list.OutputList();
break;
case 7:
cout<<"再见!"<<endl;
exit(0);
}
}
}