📄 clist.h
字号:
#include <iostream>
#include <iomanip>
using namespace std;
struct STUDENT_tag
{
char NUMBER[20];
char Name[20];
float Score[3];
short ScoreCount;
struct STUDENT_tag *Next;
};
typedef struct STUDENT_tag STUDENT;
//实现一个链表类,能够实现对上述结构体组成的链表的插入、删
//除、排序等功能封。并在次基础上派生出栈和队列类。
class CUList
{
private:
STUDENT *head;
int m_number;
public:
CUList()
{
head=new STUDENT;
head->Next=NULL;
m_number=0;
};//构造函数
CUList(const CUList & aList)
{
head=new STUDENT;head->Next=NULL;
STUDENT *P=aList.head,*q=this->head;
while (P->Next!=NULL)
{
STUDENT *newp=new STUDENT;
strcpy(newp->Name,P->Next->Name);
strcpy(newp->NUMBER,P->Next->NUMBER);
newp->ScoreCount=P->Next->ScoreCount;
for(int i=0; i<(P->Next->ScoreCount); i++)
{
newp->Score[i]=P->Next->Score[i];
}
newp->Next=q->Next;
q->Next=newp;
q=q->Next;
P=P->Next;
}
q->Next=NULL;
m_number=aList.m_number;
};//拷贝构造函数
bool Sort(int pos,bool dec)
{
STUDENT *p,*node;
if(dec==true)//升序排列
if(pos>=0 && pos<3)//按照成绩排序
{
node=head;
while (node->Next!=NULL)
{
p=node->Next;
while (p->Next!=NULL)
{
STUDENT *q;
if (node->Next->Score[pos]>p->Next->Score[pos])
{
q=p->Next;
if(q==NULL)
p->Next=NULL;
else
p->Next=q->Next;
q->Next=node->Next;
node->Next=q;
}
if ((p=p->Next)==NULL)break;
}
node=node->Next;
}
return true;
}
else
{
node=head;
while (node->Next!=NULL)
{
p=node->Next;
while (p->Next!=NULL)
{
STUDENT *q;
if (pos==3 && strcmp(node->Next->NUMBER,p->Next->NUMBER)>0)//按照学号排序
{
q=p->Next;
if(q==NULL)
p->Next=NULL;
else
p->Next=q->Next;
q->Next=node->Next;
node->Next=q;
}
else if(pos==4 && strcmp(node->Next->Name,p->Next->Name)>0)//按照姓名排序
{
q=p->Next;
if(q==NULL)
p->Next=NULL;
else
p->Next=q->Next;
q->Next=node->Next;
node->Next=q;
}if ((p=p->Next)==NULL)break;
}
node=node->Next;
}
return true;
}
else//当dec=false时降序排列
if(pos>=0&&pos<3)
{
node=head;
while (node->Next!=NULL)
{
p=node->Next;
while (p->Next!=NULL)
{
STUDENT *q;
if (node->Next->Score[pos]<p->Next->Score[pos])
{
q=p->Next;
if(q==NULL)
p->Next=NULL;
else
p->Next=q->Next;
q->Next=node->Next;
node->Next=q;
}if ((p=p->Next)==NULL)break;
}
node=node->Next;
}
return true;
}
else
{
node=head;
while (node->Next!=NULL)
{
p=node->Next;
while (p->Next!=NULL)
{
STUDENT *q;
if (pos==3 && strcmp(node->Next->NUMBER,p->Next->NUMBER)<0)
{
q=p->Next;
if(q==NULL)
p->Next=NULL;
else
p->Next=q->Next;
q->Next=node->Next;
node->Next=q;
}
else if(pos==4 && strcmp(node->Next->Name,p->Next->Name)<0)
{
q=p->Next;
if(q==NULL)
p->Next=NULL;
else
p->Next=q->Next;
q->Next=node->Next;
node->Next=q;
}if ((p=p->Next)==NULL)break;
}
node=node->Next;
}
return true;
}
};//按某项成绩、名称、学号排序、dec 表示升序还是降序
bool Delete(char * NUMBER)
{
STUDENT* node;
STUDENT* p;
node=head;
while (node->Next!=NULL && strcmp(node->Next->NUMBER,NUMBER)!=0)
{
node=node->Next;
}
if (node->Next == NULL)
return false;
else
{
p=node->Next;
node->Next=p->Next;
delete p;
m_number--;
return true;
}
};//根据学号从连表中删除某条记录
bool Add(STUDENT & aStudent)
{
STUDENT* newp = new STUDENT;
strcpy(newp->Name,aStudent.Name);
strcpy(newp->NUMBER,aStudent.NUMBER);
newp->Score[0]=aStudent.Score[0];
newp->Score[1]=aStudent.Score[1];
newp->Score[2]=aStudent.Score[2];
newp->ScoreCount=aStudent.ScoreCount;
newp->Next=head->Next;
head->Next=newp;
m_number++;
return true;
};//增加一条学生记录---要保证原有的排列顺序
STUDENT Find(STUDENT & aStudent)
{
STUDENT* node ;
STUDENT sd;
node=head->Next;
while(!strcmp(node->NUMBER,aStudent.NUMBER) &&node!=NULL)
{
node=node->Next;
if(node==NULL)break;
}
if (node==NULL)
return *node ;
else
sd=*node;
return sd;
};//寻找某个学生
void Clear()
{
STUDENT *P;
while (head->Next!=NULL)
{
P=head->Next;
head->Next=P->Next;
delete P;
}
delete head;
};//清空所有记录
int GetCount()
{
return m_number;
};//获得记录数
void print()//输出链表中各学生的信息
{
STUDENT *p;
p=head;
while(p->Next!=NULL)
{
cout<<p->Next->NUMBER<<"\t"<<p->Next->Name<<"\t"<<p->Next->Score[0]<<"\t"<<
p->Next->Score[1]<<"\t"<<p->Next->Score[2];
p=p->Next;
cout<<endl;
}
};
// =、 + 、== 运算符的重载
CUList operator = (CUList alist)//=重载
{
return alist;
};
bool operator == (CUList alist)//==重载
{
STUDENT *P=alist.head,*Q=head;
if(alist.m_number!=this->m_number)
return false;
else
while(P->Next!=NULL)
{
while(strcmp(Q->Next->Name,P->Next->Name)!=0
||strcmp(Q->Next->NUMBER,P->Next->NUMBER)!=0
||Q->Next->ScoreCount!=P->Next->ScoreCount)
{
return false;
}
for(int i=0; i<(Q->Next->ScoreCount); i++)
{
if(Q->Next->Score[i]!=P->Next->Score[i])
return false;
}
P=P->Next;Q=Q->Next;
}
return true;
};
CUList operator + (CUList alist)
{
STUDENT *P=alist.head->Next;
while(P!=NULL)
{
STUDENT* newp = new STUDENT;
strcpy(newp->Name,P->Name);
strcpy(newp->NUMBER,P->NUMBER);
newp->Score[0]=P->Score[0];
newp->Score[1]=P->Score[1];
newp->Score[2]=P->Score[2];
newp->ScoreCount=P->ScoreCount;
newp->Next=head->Next;
head->Next=newp;
P=P->Next;
m_number++;
}
return *this;
}
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -