?? 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 + -