用单链表编写,包含输入、插入、修改、删除、查询、显示功能。
#include<iostream>
#include<string>
#include<cstdlib>
using namespace std;
struct Student
{
string sex;//性别
string name;//姓名
char number[20];//学号
string id;//身份证号码
string bir;//出生日期
string adr;//家庭住址
string tel;//电话号码
string spe;//专业
string coll;//学院
};
struct Node
{
Student data;
Node *next;
};
class LinkList
{
private:
Node *first;
public:
LinkList();//构造函数
~LinkList();//析构函数
int Length();//求链表的长度
void Clear();//得到只有头结点的空链表
void Creat();//建立链表
void Input(Student &s);//输入信息
bool Insert(Student &s,int i);//插入
bool Delete(Student s,int i);//删除
bool Modify(Student &s,Student s1);//修改
Node *Search(Student s);//查找
void Output();//输出信息
};
//构造函数
LinkList::LinkList()
{
first=new Node;
first->next=NULL;
}
//析构函数
LinkList::~LinkList()
{
Node *q=NULL;
while(first!=NULL)//释放链表中每一个结点的存储空间
{
q=first;//暂存被释放结点
first=first->next;
delete q;
}
}
//求链表的长度
int LinkList::Length()
{
Node *p;
p=first->next;
int i=0;
while(p)
{
p=p->next;
i++;
}
return i;
}
//将有长度的链表清空,得到只有带头结点的链表
void LinkList::Clear()
{
Node *p=first->next,*q;
while(p)
{
q=p->next;
delete p;
p=q;
}
first->next=NULL;//得到带头结点的空链表
}
//输入学生信息
void LinkList::Input(Student &s)
{
cout<<"姓 名:";
cin>>s.name;
cout<<"性 别:";
cin>>s.sex;
cout<<"出生日期:";
cin>>s.bir;
cout<<"身份证号码:";
cin>>s.id;
cout<<"家庭住址:";
cin>>s.adr;
cout<<"电话号码:";
cin>>s.tel;
cout<<"学 号:";
cin>>s.number;
cout<<"学 院:";
cin>>s.coll;
cout<<"专 业:";
cin>>s.spe;
}
//建立链表
void LinkList::Creat()
{
Node *a;
Student s;
if(Length()!=0)
Clear();
Input(s);
a=new Node;
a->data=s;
a->next=first->next;
first->next=a;
cout<<"\n链表建成!\n";
}
//在指定位置插入信息
bool LinkList::Insert(Student &s,int i)
{
int j=1;
Node *p,*q;
p=new Node;//建立一个待插入的结点
p->data=s;
q=first;
while(q->next!=NULL&&j<i)//查找第i个结点
{
q=q->next;
j++;
}
if(j=i)
{
p->next=q->next;
q->next=p;
return true;
}
else
return false;
}
//删除信息
bool LinkList::Delete(Student s,int i)
{
int j=1;
Node *p,*q;
q=first;
p=q->next;
if(p==NULL)
cout<<"\n此链表为空链表!无法删除!\n";
while(j<i&&p->next!=NULL)
{
q=p;
p=p->next;
j++;
}
if(p!=NULL)
{
s=p->data;
q->next=p->next;
delete p;
return true;
}
else
return false;
}
//显示全部信息
void LinkList::Output()
{
Node *a=first->next;
if(a!=NULL)
{
cout<<"姓 名:"<<a->data.name<<endl;
cout<<"性 别:"<<a->data.sex<<endl;
cout<<"出生日期:"<<a->data.bir<<endl;
cout<<"身份证号码:"<<a->data.id<<endl;
cout<<"家庭住址:"<<a->data.adr<<endl;
cout<<"电话号码:"<<a->data.tel<<endl;
cout<<"学 号:"<<a->data.number<<endl;
cout<<"学 院:"<<a->data.coll<<endl;
cout<<"专 业:"<<a->data.spe<<endl;
a=a->next;
}
else
cout<<"\n无信息!请先存储!\n";
}
//按学号查找
Node *LinkList::Search(Student s)
{
Node *p=first->next;
while(p!=NULL&&strcmp(p->data.number,s.number)!=0)
p=p->next;
if(p==NULL)
{
cout<<"\n无该学生信息!"<<endl;
return NULL;
}
return p;
}
//按学号修改
bool LinkList::Modify(Student &s,Student s1)
{
Node *p=first->next;
while(p)
{
if(p->data.number!=s.number)
{
p->data=s1;
return true;
}
p=p->next;
}
return false;
}
//自定义函数
void menu()
{
cout<<"\n ------------------------------"<<endl;
cout<<" | ^^^^^^^^^^^^^^^^ |"<<endl;
cout<<" | 学生信息管理系统 |"<<endl;
cout<<" | |"<<endl;
cout<<" | ^^^^^^^^^^^^^^^^ |"<<endl;
cout<<" ------------------------------"<<endl;
cout<<" | 1.输入学生信息 |"<<endl;
cout<<" | 2.插入学生信息 |"<<endl;
cout<<" | 3.修改学生信息 |"<<endl;
cout<<" | 4.删除学生信息 |"<<endl;
cout<<" | 5.查询学生信息 |"<<endl;
cout<<" | 6.显示学生信息 |"<<endl;
cout<<" | 0.退出本系统 |"<<endl;
cout<<" ------------------------------"<<endl;
cout<<endl;
cout<<" *提示:输入上述编号并回车即可执行操作!"<<endl;
}
int main(void)
{
LinkList L;
Student s,s1;
Node *p;
int n;
cout<<"********************************\n";
cout<<"* Welcome! *\n";
cout<<"* 欢迎使用本系统! *\n";
cout<<"********************************\n";
cout<<endl;
do
{
system("pause");
system("cls");
menu();
cout<<"\n请输入您的选择:";
cin>>n;
if(n<0||n>6)
cout<<"\n输入有误!请重新输入!"<<endl;
else
{
switch(n)
{
case 1:
cout<<"\n****************************"<<endl;
cout<<"* 输入学生信息 *"<<endl;
cout<<"****************************"<<endl;
L.Creat();
break;
case 2:
cout<<"\n****************************"<<endl;
cout<<"* 插入学生信息 *"<<endl;
cout<<"****************************"<<endl;
int i;
bool j;
cout<<"请输入插入位置:";
cin>>i;
cout<<endl;
if(i<1||i>L.Length()+1)
cout<<"插入位置不合法!"<<endl;
else
{
cout<<"请输入学生信息!"<<endl;
L.Input(s);
j=L.Insert(s,i);
if(false==j)
cout<<"\n插入信息失败!"<<endl;
else
cout<<"\n插入信息成功!"<<endl;
}
break;
case 3:
cout<<"\n****************************"<<endl;
cout<<"* 修改学生信息 *"<<endl;
cout<<"****************************"<<endl;
cout<<"请输入您要修改的学生学号:";
cin>>s.number;
cout<<endl;
p=L.Search(s);
if(p)
{
cout<<"请输入该学生的新信息:"<<endl;
L.Input(s1);
L.Modify(s,s1);
cout<<"\n修改成功!"<<endl;
}
break;
case 4:
cout<<"\n****************************"<<endl;
cout<<"* 删除学生信息 *"<<endl;
cout<<"****************************"<<endl;
int q;
cout<<"请输入删除的位置:";
cin>>q;
cout<<endl;
if(q<1||q>L.Length())
cout<<"\n删除位置不合法!"<<endl;
else
{
L.Delete(s,q);
cout<<"\n删除成功!"<<endl;
}
break;
case 5:
cout<<"\n****************************"<<endl;
cout<<"* 查询学生信息 *"<<endl;
cout<<"****************************"<<endl;
cout<<"请输入要查询的学生学号:"<<endl;
cin>>s.number;
p=L.Search(s);
if(p!=NULL)
{
cout<<"该学生的信息如下:"<<endl;
cout<<"姓 名:"<<p->data.name<<endl;
cout<<"性 别:"<<p->data.sex<<endl;
cout<<"出生日期:"<<p->data.bir<<endl;
cout<<"身份证号码:"<<p->data.id<<endl;
cout<<"家庭住址:"<<p->data.adr<<endl;
cout<<"电话号码:"<<p->data.tel<<endl;
cout<<"学 号:"<<p->data.number<<endl;
cout<<"学 院:"<<p->data.coll<<endl;
cout<<"专 业:"<<p->data.spe<<endl;
}
break;
case 6:
cout<<"\n***************************"<<endl;
cout<<"* 显示所有学生信息 *"<<endl;
cout<<"***************************"<<endl;
L.Output();
break;
case 0:
cout<<"\n****************************"<<endl;
cout<<"* 退出本系统 *"<<endl;
cout<<"****************************"<<endl;
cout<<" 再见! "<<endl;
cout<<endl;
break;
}
}
}while(n);
system("pause");
return 0;
}