⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clist.h

📁 keyongyu 王怀忠那件事儿 积分都是发迹哦
💻 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 + -