1.设计目的 ⚫ 掌握线性链表的建立。 ⚫ 掌握线性链表的基本操作。 ⚫ 掌握查找的基本算法。
#include<iostream.h>
#include<string.h>
#include <fstream.h>
const int Maxsize=100;
struct StuNode{
char name;
int num;
int sum;
StuNode *nextstu;
};
class student
{
public:
student();
~student();
charname[8]; //姓名
intscore; //总分
intnumber; //学号
void Insert(char iname,int inum,intisum); //插入
StuNode *Search(int inum); //查找
void Update(int inum,int isum); //修改
void Delete(int inum); //删除
void Copy(StuNode *ptemp, StuNode *p); //拷贝
void Show(); //显示
void Sort(char ch); //排序
private:
StuNode *StuListHead;
};
student::student() //构造函数
{
StuListHead=new StuNode;
StuListHead->nextstu=NULL;
}
student::~student() //析构函数
{
StuNode *p;
while (StuListHead)
{
p = StuListHead;
StuListHead = StuListHead->nextstu;
delete p;
}
StuListHead= NULL;
}
void student::Insert(char iname,intinum,int isum ) //插入
{
StuNode *s,*p;
s=new StuNode;
s->num=inum;
s->sum=isum;
s->name=iname;
p=StuListHead;
s->nextstu = p->nextstu;
p->nextstu = s;
}
StuNode *student::Search(int inum)
{
StuNode*p;
p=StuListHead->nextstu;
while(p->nextstu&&p->num!=inum)
{
p=p->nextstu;
}
if(p->num==inum)
{
return p;
}
else
{
cout <<"未找到该学生信息!"<<endl;
return NULL;}
}
void student::Update(int inum,int isum)
{
StuNode *Item=Search(inum);
if (Item!=NULL)
{
Item->num=inum;
Item->sum=isum;
}
}
void student::Show()
{
StuNode *p;
cout <<"姓名"<<" "<<"学号"<<" "<<"总分"<<endl;
for(p=StuListHead->nextstu; p != NULL; p=p->nextstu)
{
cout<<" "<<p->name<<" "<<p->num<<" "<<p->sum<<endl;
}
}
void student::Delete(int inum)
{ StuNode *p, *ptemp;
p=StuListHead;
ptemp=p;
while(p->nextstu&&p->num!=inum)
{
ptemp=p;
p=p->nextstu;
}
if(p->num==inum)
{
ptemp->nextstu=p->nextstu;
delete p;
}
else
{
cout <<"未找到该学生信息!"<< endl;
}
}
void student::Sort(char ch) //根据总分排序
{
if (ch == '>')
{
for (StuNode *p = StuListHead->nextstu; p != NULL; p = p->nextstu)
{
for (StuNode *q = StuListHead->nextstu; q != NULL; q = q->nextstu)
{
if (p->sum > q->sum)
{
StuNode *ptemp = newStuNode;
Copy(ptemp, p);
Copy(p, q);
Copy(q, ptemp);
}
}
}
}
else if (ch == '<')
{
for (StuNode *p = StuListHead->nextstu; p != NULL; p = p->nextstu)
{
for (StuNode *q = StuListHead->nextstu; q != NULL; q = q->nextstu)
{
if (p->sum < q->sum)
{
StuNode *ptemp = newStuNode;
Copy(ptemp, p);
Copy(p, q);
Copy(q, ptemp);
}
}
}
}
else if (ch == 'o')
{
for (StuNode *p = StuListHead->nextstu; p != NULL; p = p->nextstu)
{
for (StuNode *q = StuListHead->nextstu; q != NULL; q = q->nextstu)
{
if (p->num < q->num)
{
StuNode *ptemp = new StuNode;
Copy(ptemp, p);
Copy(p, q);
Copy(q, ptemp);
}
}
}
}
else
{
cout << "排序条件出错!"<< endl;
}
}
void student::Copy(StuNode *ptemp, StuNode*p) //拷贝学生信息(将p的信息拷贝到ptemp中)
{
if (p==NULL)
{
cout<<"拷贝目标为空!"<<endl;
}
else
{
ptemp->num= p->num;
ptemp->sum= p->sum;
//ptemp->nextstu = p->nextstu;
}
}
int main()
{
int x = 100, pnum,psum;
char pname;
StuNode *pfind;
student stu;
do
{
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 << "7------------退出系统" << endl;
cout << "请选择:";
cin >> x;
switch (x)
{
case 1:
cout << "分别输入学生的姓名,学号,成绩"<<endl;
cin>> pname >> pnum >> psum;
stu.Insert(pname,pnum,psum);
cout<< "更新信息"<< endl;
stu.Show();
break;
case 2:
cout << "请输入要删除学生学号:";
cin >> pnum;
stu.Delete(pnum);
cout << "更新学生信息表..." <<endl;
stu.Show();
break;
case 3:
cout << "请输入要查找学生学号:";
cin >> pnum;
pfind = stu.Search(pnum);
cout << "查找学生学号:"<<pfind->num<<" 姓名"<<pfind->name<<" 总分"<<pfind->sum << endl;
break;
case 4:
cout<<"请输入要修改学生学号:";
cin>> pnum;
cout<< "请重新输入学生分数:";
cin>>psum;
stu.Update(pnum,psum);
cout<<"修改成功!"<<endl;
cout<<"更新学生信息表..."<<endl;
stu.Show();
break;
case 5:
cout << "升序排序(1)降序排序(0)学号排序(2):";
cin >> pnum;
if (pnum == 1)
{
stu.Sort('<');
}
else if (pnum == 0)
{
stu.Sort('>');
}
else if (pnum == 2)
{
stu.Sort('o');
}
else
{
cout << "请输入正确选择!" << endl;
}
case 6:
stu.Show();
break;
case 7:break;
}
}
while(x!=7);
return 0;
}