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

📄 studentlist.cpp

📁 里面包括: 哈夫曼编码
💻 CPP
字号:
//数据结构第一次实验单链表  054100919 汤杰
#include "iostream.h"
#include "string.h"

class student
{
public:
	int number;
	char *name;
	student *next;
	student(int a,char *b,student *c=0)
	{
		number=a;
		name=new char[strlen(b)+1];
		strcpy(name,b);
		next=c;
	}
	~student()
	{
		delete []name;
	}
};


class stulist
{
private:
	student *head,*tail;
public:
	stulist()
	{
		head=tail=0;
	}
	~stulist();
	int isempty()                       //空时返回1;不空返回0
	{
		return head==0;
		//if (head==0) return(1);
		//else return(0);
	}
	void clear()
	{
		for(student *p;!isempty();)
		{
			p=head->next;
			delete head;
			head=p;
		}
		head=tail=0;
	}

	void addtohead();
	void addtotail();
	void addtotail(int num,char *name);
	void delstu(int);
	bool isinstulist(int);
	void nizhi();
	void listcreat();
	void display();
	void orderlist();
	void addtoorder();
	void deloustu();
	friend void addlist(stulist &p1,stulist &p2);
	void delounum();
	
};
void choose(stulist &claslist,stulist &addlist);


stulist::~stulist()
{
	for(student *p;!isempty();)
	{
		
		p=head->next;
		delete head;
		head=p;
	}
}

void stulist::addtohead()
{
	int num;
	char na[20];
	while(1)
		{
			cout<<"请输入学号: ";
			cin>>num;
		    if(isinstulist(num)) 
				cout<<"学号已经存在"<<endl;
			else break;
		}
	cout<<"请输入姓名:  ";
	cin>>na;
	head=new student(num,na,head);
	if (tail==0) tail=head;
}
void stulist::addtotail()
{
	int num;
	char na[20];
	while(1)
		{
			cout<<"请输入学号: ";
			cin>>num;
		    if(isinstulist(num)) 
				cout<<"学号已经存在"<<endl;
			else break;
		}
	cout<<"请输入姓名:  ";
	cin>>na;
	if(tail!=0) 
	{
		tail->next=new student(num,na);
		tail=tail->next;
	}
	else head=tail=new student(num,na);
}



void stulist::addtotail(int num,char *na)
{
	if(tail!=0) 
	{
		tail->next=new student(num,na);
		tail=tail->next;
	}
	else head=tail=new student(num,na);
}

void stulist::delstu(int a)
{
	if(head!=0)
		if(head==tail&&a==head->number)
		{
			delete head;
			head=tail=0;                  //表中只有一个而且要删的就是这个
		}
		else if(a==head->number)
		{
			student *p=head;        //在第一个的时候
			head=head->next;
			delete p;
		}
		else
		{
			student *pre,*p;
			for(pre=head,p=pre->next;p!=0&&!(p->number==a);pre=pre->next,p=p->next);
			if(p!=0)                      //保证是因p->number==a而停止,即找到那个数
			{
				pre->next=p->next;
				if(p==tail) tail=pre;
				delete p;
			}
			else cout<<"这个学号不存在"<<endl;
		}
}
bool stulist::isinstulist(int a)
{
	student *p;
	for (p=head;p!=0&&!(p->number==a);p=p->next);
	return p!=0;
}


void stulist::nizhi()
{
	student *p,*p1,*p2,*p3;
	p=head;
	if(head)
		if (head==tail)
	{
		cout<<"只有一个元素,无需逆置!"<<endl;
		
	}
	else if (head->next==tail)
	{
		tail=head;
		p1=p;
		p2=p->next;

		p2->next=p1;
		p1->next=0;
		head=p2;
		
	}
	else
	{
		p1=p;
		p2=p1->next;
		p3=p2->next;
		tail=head;
		while(1)
		{
			
			p2->next=p1;
			if(p1==head) p1->next=0;

			if(p3==NULL) break;

			p1=p2;
			p2=p3;
			p3=p3->next;
		}
		head=p2;
	}
	else cout<<"空列表,无法逆置!"<<endl;
}
void stulist::listcreat()
{
	int num;
	char name[20];
	student *p,*p1;

	cout<<"请输入学号(以0结束): ";
	cin>>num;
	while(num)
	{
		cout<<"请输入姓名:  ";
	    cin>>name;
		p=new student(num,name);
		if(head==0){p1=p;head=tail=p;}
		else 
		{
			p1->next=p;
			tail=p;
			p1=p;
			
		}
		while(1)
		{
			cout<<"请输入学号: ";
			cin>>num;
		    if(isinstulist(num)) 
				cout<<"学号已经存在"<<endl;
			else break;
		}
	
	}
}
void stulist::display()
{
	student *p=head;
	void display();
	while(p)
	{
		cout<<p->number<<"\t"<<p->name<<endl;
		p=p->next;
	}
}

void stulist::orderlist()
{
	int a;
	char *na;
	student *stop=tail;
	student *p,*p1,*p2;
	for(p=head;p!=tail;p=p->next)//仅仅为计次
	{
		p1=head;
		p2=p1->next;
		while(p2!=stop)
		{
			if(p1!=head)
				p2=p2->next;
			
			if(p1->number>p2->number)
			{
				a=p1->number;
				p1->number=p2->number;
				p2->number=a;

				na=p1->name;
				p1->name=p2->name;
				p2->name=na;
			}
			p1=p2;
		}
		stop=p1;
	}
}

void stulist::deloustu()
{
	int f=0;
	student *p=head;
	student *p1;
	while(p)
	{
		if(f==1) 
		{
			p1=p->next;
			delstu(p->number);
			f=0;
			p=p1;
		}
		else
		{
			f=1;
			p=p->next;
		}
	}
}
void stulist::delounum()
{
	int f=0;
	student *p=head;
	student *p1;
	while(p)
	{
		f=p->number;
		if((f%2)==0) 
		{
			p1=p->next;
			delstu(p->number);
			p=p1;
		}
		else
			p=p->next;
	}
}

void stulist::addtoorder()
{
addtotail();
orderlist();
}

void addlist(stulist &p1,stulist &p2)
{
	//p2.clear();
	p2.listcreat();
	cout<<"新链表为"<<endl;
	p2.display();

	student *p;
	p=p2.head;
	while(p)
	{
		if(p1.isinstulist(p->number))
			p=p->next;
		else
		{
			p1.addtotail(p->number,p->name);
			p=p->next;
		}
	}
}






void main()
{
   stulist claslist;
   stulist claslist2;
   claslist.listcreat();
   claslist.display();
   
	int select;
	
	while(1)
	{
	cout<<"输入 1  把单向链表中元素逆置"<<endl;
	cout<<"输入 2  在单向链表中删除所有的偶结点。"<<endl;
	cout<<"输入 3  在单向链表中删除所有的学号为偶数的结点。"<<endl;
	cout<<"输入 4  在头部插入一个学号"<<endl;
	cout<<"输入 5  在尾部插入一个学号"<<endl;
	cout<<"输入 6  按顺序插入一个学号"<<endl;
	cout<<"输入 7  按学号进行排序"<<endl;
	cout<<"输入 8  创建一个新链表并合并到原来的链表中"<<endl;
	cout<<"输入 0  结束"<<endl;
		cin>>select;
	switch(select)
	{
		case 0://结束
		{
			break;
		}
	case 1://元素逆置
		{
			claslist.nizhi();
			break;
		}
	case 2://删除所有的偶数元素结点
		{
			claslist.deloustu();
			break;
		}
	case 3://删除所有的学号为偶数的结点
		{
			claslist.delounum();
			break;
		}
	case 4://头部插入一个学号
		{
			claslist.addtohead();
			break;
		}
	case 5://尾部插入一个学号
		{
			claslist.addtotail();
			break;
		}
	case 6://顺序插入一个学号
		{
			claslist.addtoorder();
			break;
		}
	case 7://学号进行排序
		{
			claslist.orderlist();
			break;
		}
	case 8://创建一个新链表并合并到原来的链表中
		{
			claslist2.clear();//保证claslist2为空,否则只能运行一次
			addlist(claslist,claslist2);
			cout<<"合并后的链表为"<<endl;
			break;
		}
	
	}
	cout<<endl;
	claslist.display();
	cout<<endl;
	if(select==0) break;
	}
   
}


⌨️ 快捷键说明

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