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

📄 func.cpp

📁 实现一个链表类
💻 CPP
字号:
#include"ulist.h"
using namespace std;
CUList::CUList()      //创建头结点,不存储数据为了方便链表操作
{
	newp=new STUDENT;
	newp->Next=NULL;
	head=newp;
}

CUList::CUList(const CUList & aList)      //用已存在的链表初始化新建的链表
{
	newp=new STUDENT;
	newp->Next=NULL;
	head=newp;

	STUDENT *p=aList.head;
	while(p->Next!=NULL)     //工作指针到最后移向链表的最后一个节点时,循环终止
	{
		if((newp=new STUDENT)==NULL)
		{
			cout<<"new STUDENT fail!"<<endl;
			exit(0);
		}
		strcpy(newp->NUMBER,p->Next->NUMBER);
		strcpy(newp->Name,p->Next->Name);

		for(int i=0;i<3;i++)
		{
			newp->Score[i]=p->Next->Score[i];
		}
		Add(newp);      //将新建的节点添加进链表
		p=p->Next;      //工作指针移向下一个节点
	}
}

CUList CUList::operator+(CUList &a)
{
	STUDENT *p=head;
	STUDENT *q=a.head;
	while(q->Next!=NULL)
	{
		q=q->Next;
	}
	q->Next=p->Next;
	delete p;
	return a;
}

bool CUList::operator ==(CUList &a)
{
	int num=a.GetCount();
	if(num!=GetCount())
		return false;
	else
	{
		STUDENT *p=head;
		STUDENT *q=a.head;
		for(int i=0;i<num;++i)
		{
			if(!equal(p->Next,q->Next))
				return false;
			p=p->Next;
			q=q->Next;
		}
		return true;
	}
}

CUList CUList::operator =(CUList &a)
{


	STUDENT *p=a.head;
	while(p->Next!=NULL)     //工作指针到最后移向链表的最后一个节点时,循环终止
	{
		if((newp=new STUDENT)==NULL)
		{
			cout<<"new STUDENT fail!"<<endl;
			exit(0);
		}
		strcpy(newp->NUMBER,p->Next->NUMBER);
		strcpy(newp->Name,p->Next->Name);

		for(int i=0;i<3;i++)
		{
			newp->Score[i]=p->Next->Score[i];
		}
		Add(newp);      //将新建的节点添加进链表
		p=p->Next;      //工作指针移向下一个节点
	}
	return *this;
}


bool CUList::equal(STUDENT *a,STUDENT *b)
{
	if(strcmp(a->NUMBER,b->NUMBER)==0&&strcmp(a->Name,b->Name)==0&&a->Score[0]==b->Score[0]&&a->Score[1]==b->Score[1]&&a->Score[2]==b->Score[2])
		return true;
	else
		return false;
}
bool CUList::equal(STUDENT *a,STUDENT &b)
 {
   if(strcmp(a->NUMBER,b.NUMBER)==0&&strcmp(a->Name,b.Name)==0&&a->Score[0]==b.Score[0]&&a->Score[1]==b.Score[1]&&a->Score[2]==b.Score[2])
	   return true;
   else
	   return false;
 }

bool CUList::Sort(int pos,bool dec)
{
	//position=pos;
	//paixu=dec;
	STUDENT *p=head->Next;
	if(dec)
	{
		if(pos==1)
		{
			while(p->Next!=NULL)
			{
				STUDENT *q=p->Next;
				while(q!=NULL)
				{
					if(strcmp(q->NUMBER,p->NUMBER)>0)
						change(q,p);
						q=q->Next;
				}
				p=p->Next;
			}
		}
		else
		{
			while(p->Next!=NULL)
			{
				STUDENT *q=p->Next;
				while(q!=NULL)
				{
					if(q->Score[pos-2]>p->Score[pos-2])
						change(q,p);
						q=q->Next;
				}
				p=p->Next;
			}
		}
	}

	else  if(pos==1)
		{
			while(p->Next!=NULL)
			{
				STUDENT *q=p->Next;
				while(q!=NULL)
				{
					if(strcmp(q->NUMBER,p->NUMBER)<0)
						change(q,p);
						q=q->Next;
				}
				p=p->Next;
			}
		}
		else
		{
			while(p->Next!=NULL)
			{
				STUDENT *q=p->Next;
				while(q!=NULL)
				{
					if(q->Score[pos-2]<p->Score[pos-2])
						change(q,p);
						q=q->Next;
				}
				p=p->Next;
			}
		}
	
	return true;
}

void CUList::change(STUDENT *a,STUDENT *b)
{
	char NUM[20];
	char Nam[20];
	float Sco[3];

	strcpy(NUM,a->NUMBER);
	strcpy(a->NUMBER,b->NUMBER);
	strcpy(b->NUMBER,NUM);

	strcpy(Nam,a->Name);
	strcpy(a->Name,b->Name);
	strcpy(b->Name,Nam);

	for(int j=0;j<3;++j)
	{
		Sco[j]=a->Score[j];
		a->Score[j]=b->Score[j];
		b->Score[j]=Sco[j];
	}
}

bool CUList::Delete(char * NUMBER)      //根据学号从连表中删除某条记录 
{
	STUDENT *q;
	STUDENT *p=head;
	while(p->Next!=NULL)
	{
		if(!strcmp(p->Next->NUMBER,NUMBER))
		{
			q=p->Next;
			p->Next=q->Next;
			delete q;
		}
		p=p->Next;

	}
	return false;
}

bool CUList::Add(STUDENT & aStudent)
{
/*   STUDENT *p=Search(aStudent);
   STUDENT * q=&aStudent;
  InsertSTUDENT(p,q);
  return true;*/
	 newp=new STUDENT;
	strcpy(newp->NUMBER,aStudent.NUMBER);
	strcpy(newp->Name,aStudent.Name);
		 for(int i=0;i<3;++i)
		 {
			 newp->Score[i]=aStudent.Score[i];
		 }
		 newp->Next=NULL;
		 Add(newp);
		 return true;
}


STUDENT CUList::Find(STUDENT & aStudent)
{
	STUDENT *p=head;
//	STUDENT *a=&aStudent;
	while(p->Next!=NULL)
	{
		if(equal(p->Next,aStudent))
			return *p;
		p=p->Next;
	}
}


void CUList::Clear()
{
	STUDENT *p=head;
	while(p->Next!=NULL)
	{
		p=p->Next;
		delete head;
		head=p;
	}
	delete p;
}


int CUList::GetCount()
{
	int i=0;
	STUDENT *p=head->Next;
	while(p->Next!=NULL)
	{
		i++;
		p=p->Next;
	}
	return i;
}


void CUList::print()
{
	STUDENT *p=head;
	while(p->Next!=NULL)
	{
		cout<<p->Next->NUMBER<<'\t'<<p->Next->Name;
		for(int i=0;i<3;i++)
		{
			cout<<'\t'<<p->Next->Score[i];
		}
		cout<<endl;
		p=p->Next;
	}
}


void CUList::InsertSTUDENT(STUDENT *p,STUDENT *q)   // 在p之后插入节点newp
{
	q->Next=p->Next;
	p->Next=q;
}
 void CUList::Add(STUDENT *q)
 {
	 STUDENT *p=Search(q->NUMBER);
	 InsertSTUDENT(p,q);
 }

 STUDENT *CUList::Search(char *NUMBER)//寻找
	{
		STUDENT *p=head;
		while(p->Next!=NULL)
		{
			if((*p->Next->NUMBER)<*NUMBER)
				return p;
			p=p->Next;
		}
		return p;

	}	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -