求求大神帮忙看看这个程序咋写

求求大神帮忙看看这个程序咋写

问题描述:

 

参考下代码:

#include<iostream>
#include<string>
#include<stdlib.h>
#include<iomanip>//用setw()函数,控制台页面按照指定字符对齐 
using namespace std;
int choice=1;
void menu();
class Node{
private:
	string name;//学生姓名 
	int age;//学生年龄 
	int num;//学生学号 
	string cla_ss;//学生班级 
	string teacher;//学生教师 
	int score;//学生排名 
public:
	Node *prev;//前指针 
	Node *next;//后指针
	Node(string name1="小明",int age1=18,int num1=0,string cla_ss1="计算机5班",string teacher1="王老师",int score1=1){//构造函数初始化 
		name=name1;
		age=age1;
		num=num1;
		cla_ss=cla_ss1;
		teacher=teacher1;
		score=score1;
	}
	~Node(){
           //此处进行了析构 
	}
	void changeall(){
		string name1;
		cout<<"请输入学生姓名"<<endl;
		cin>>name1;
		name=name1;
		int age1;
		cout<<"请输入学生年龄"<<endl;
		cin>>age1;
		age=age1;
		int num1;
		cout<<"请输入学生学号"<<endl;
		cin>>num1;
		num=num1;
		string cla_ss1;
		cout<<"请输入学生班级"<<endl;
		cin>>cla_ss1;
		cla_ss=cla_ss1;
		string teacher1;
		cout<<"请输入学生老师"<<endl;
		cin>>teacher1;
		teacher=teacher1;
		int score1;
		cout<<"请输入学生排名"<<endl;
		cin>>score1;
		score=score1;
	}
	string getname(){return name;}
	int getage(){return age;}
	int getnum(){return num;}
    string getclass(){return cla_ss;}
    string getteacher(){return teacher;}
    int getscore(){return score;}
	void showall(){
		cout<<setw(15)<<name<<setw(15)<<age<<setw(15)<<num<<setw(15)<<cla_ss<<setw(15)<<teacher<<setw(15)<<score<<endl;
	}
    void changeit(){
    	int a;
    	cout<<"请问要修改哪项信息?"<<endl;
    	cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
        cout<<"|                                                            |"<<endl;
        cout<<"|    1.姓名   2.年龄   3.学号   4.班级   5.教师   6.排名     |"<<endl;
        cout<<"|                                                            |"<<endl;
        cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
    	cin>>a;
    	switch(a){
    		case 1:			
				{string name1;
		        cout<<"请输入学生姓名:"<<endl;
		        cin>>name1;
	          	name=name1;
	          	cout<<"修改成功!!!"<<endl;
	          	break;}
	        case 2:
	          	{int age1;
	            cout<<"请输入学生年龄:"<<endl;
		        cin>>age1;
		        age=age1;
		        cout<<"修改成功!!!"<<endl;
		        break;}
		    case 3:
	          	{int num1;
		        cout<<"请输入学生学号:"<<endl;
		        cin>>num1;
		        num=num1;
		        cout<<"修改成功!!!"<<endl;
		        break;}
		    case 4:
	          	{string cla_ss1;
	        	cout<<"请输入学生班级:"<<endl;
		        cin>>cla_ss1;
		        cla_ss=cla_ss1;
		        cout<<"修改成功!!!"<<endl;
		        break;}
		    case 5:
		        {string teacher1;
		        cout<<"请输入学生老师:"<<endl;
		        cin>>teacher1;
		        teacher=teacher1;
		        cout<<"修改成功!!!"<<endl;
		        break;}
		    case 6:
		        {int score1;
		        cout<<"请输入学生排名:"<<endl;
		        cin>>score1;
		        score=score1;
		        cout<<"修改成功!!!"<<endl;
		        break;}
		        system("pause");
                system("cls");
		}
	}



class List{//整个链表的管理工作   整个链表的初始化和回收 
private:
	Node *p;
	Node *q,*head,*tail;	
public:
	List(){//构建空链表 
	   p=new Node;
	   p->prev=NULL;
	   p->next=NULL;
	   q=p;
	   head=p;
	   tail=p;
    }
	~List(){
		Node *temp;
		while(head)
		{
			temp=head;
			head=head->next;
			delete temp;
		}//链表删除 
    }
	Node* GetHead(){
		return head;
	}
	Node* GetTail(){
		return tail;
	}
};



class Set:public List{//集合操作的实现 
    private:
    	List list0;
    	Node *a,*b;
	public:
		Set(){
			a=list0.GetHead();
			b=list0.GetTail();
			
		}
//移除元素 
void RemoveHead(){//移除第一元素 
	     Node *temp;
	     temp=a;
	     a=a->next;
		 delete temp;	  
        }
void RemoveTail(){//移除最后一个元素 
	     Node *temp,*temp1;
	     temp=b;
		 temp1=temp->prev;
		 temp1->next=NULL;
	     delete temp;	  
}
void RemoveAll(){//移除所有元素 
	  Node *temp;
	  while(a->next){
	  	temp=a;
	  	a=a->next;
	  	delete temp;
	  }
	  temp=a;
	  a=new Node;
	  b=a;
	  delete temp;
	  List list0;
	  cout<<"所有元素已移除"<<endl;
}
//添加元素的操作 
void operator +(Node *head){//运算符重载函数   并 
	  Node *head1=head;
	  b->next=head1;
	  head1->prev=b;
	  Node *temp1,*temp2,*p,*q;
	  temp1=a;
	  temp2=head1;
	  while(temp1)
	  {
	  	while(temp2)
	  	{
	  		if(temp1==temp2)
	  		{
	  			Node *del;
	  			del=temp2;
	  			p=temp2->prev;
	  			q=temp2->next;
	  			p->next=q;
	  			q->prev=p;
	  			temp2=temp2->next;
	  			delete del;
			  }
			  else
			  temp2=temp2->next;
		  }
		  temp1=temp1->next;
	  }
	  cout<<"集合取并集完成!!!"<<endl;
}	
void operator -(Node *head){//运算符重载函数   差 
	  Node *temp1,*temp2,*p,*q;
	  Node *head1=head;
	  temp1=a;
	  temp2=head1;
	  while(temp2)
	  {
	  	while(temp1)
	  	{
	  		if(temp1->prev==NULL)
	  		{
	  			if(temp1==temp2)
	  			{
	  				Node *temp=temp1;
	  				temp1=temp1->next;
	  				temp1->prev=NULL;
	  				a=temp1;
	  				delete temp;
				  }
				  else
				  temp1=temp1->next;
			  }
			  else
			  {
			  	if(temp1==temp2)
			  	{
			  		Node *temp,*before,*after;
			  		temp=temp1;
			  		before=temp1->prev;
			  		after=temp1->next;
			  		before->next=after;
			  		after->prev=before;
			  		delete temp1;
			  		temp1=after;
				  }
				  else
				  temp1=temp1->next;
			  }
		  }
		  temp2=temp2->next;
	  	
	  }
}
void And(Node *head){//集合操作函数            交 
   	  Node *temp1,*temp2,*p,*q,*item;
   	  Node *head1=head;
   	  temp1=a;
   	  temp2=head1;
   	  while(temp1)
   	  {
   	  	while(temp2)
   	  	{
   	  		if(temp1->prev==NULL)//temp1前一个是空的 
   	  		{
   	  			if(temp2==temp1)
   	  			{
				temp1=temp1->next;
   	  			break;	 
				}
   	  		    else 
   	  			{
   	  				if(temp2->next)
   	  				temp2=temp2->next;
   	  				else
   	  				{
						Node *temp3=temp1;
   	  				    temp1=temp1->next;
   	  				    a=temp1;
   	  				    delete temp3;
					}
				}
			temp2=head1;
			 }
			 else//temp1前一个不是空的 
			 {
			 	if(temp2==temp1)
                {
                  temp1=temp1->next;
				  break;
				}
                else
                {
                	if(temp2->next)
   	  				temp2=temp2->next;
   	  				else
   	  				{
						Node *temp3=temp1;
						Node *p,*q;
						p=temp1->prev;
						q=temp1->next;
   	  				    temp1=temp1->next;
   	  				    p->next=q;
   	  				    q->prev=p; 
   	  				    delete temp3;				    
					}
				}
			 }
			 
		 }
	}
}

void AddHead(){//在表头添加元素或者链表   函数重载 
	     int n;
	     cout<<"请问要添加多少学生?"<<endl;
	     cin>>n;
         system("cls");
	     if(n==1)
	     {
	     	a->changeall();
            system("cls");
		 }
		 if(n>1)
		 {
		 	Node *temp1,*temp;
		 	a->changeall();
		 	system("pause");
            system("cls");
		 	temp=new Node;
		 	temp->changeall();
		 	a->next=temp;
		 	temp->prev=a;
		 	temp1=temp;
		 	b=temp;
		 	b->next=NULL;
		 	system("pause");
            system("cls");
            for(int i=2;i<n;i++)
            {
            	temp=new Node;
            	temp->changeall();
            	temp1->next=temp;
            	temp->prev=temp1;
            	temp1=temp;
            	system("pause");
            	system("cls");
			}
			b=temp;
			b->next=NULL;	        
		 }
		 if(n<=0)
		 {
		 	cout<<"输入的参数错误!!!"<<endl;
		 }
}
void AddTail(){//在表尾添加元素或者链表   函数重载 
	      int n;
	     cout<<"请问要添加多少学生?"<<endl;
	     cin>>n;
	     system("cls");
	    if(n==1)
	     {
	     	Node *temp,*temp1;
	     	temp1=new Node;
	     	temp=b;
			temp->next=temp1;
			temp1->prev=temp;
	     	temp1->next=NULL;
	     	temp1->changeall();
	     	system("pause");
            system("cls");
	     }
	    if(n>1)
	    {
		 	Node *item,*temp,*head1;
		 	item=new Node;
	        temp=item;
	        head1=item;
	        item->changeall();
	        system("pause");
            system("cls");
	        item=new Node;
	        temp->next=item;
	        temp->prev=NULL;
	        item->prev=temp;
	        temp=item;
	        item->changeall();
	        system("pause");
            system("cls");
	        for(int i=2;i<n;i++)
	        {
	   	        item=new Node;
	   	    	temp->next=item;
	   	        item->prev=temp;
	   	        temp=item;//item是尾指针 
	   	        item->changeall();
	   	        system("pause");
                system("cls");
	        }
	        
	       b->next=head1;//并操作。剔除重复信息 
		   head1->prev=b;
		}
		if(n<=0)
		{
			cout<<"参数错误!!!"<<endl;
		}
}	

//遍历操作 	   
Node *GetNext(Node *p){//返回下一个元素的位置
	  Node *temp;
	  temp=p->next;
	  return temp;
}   
Node *GetPrev(Node *p){//返回前一个元素的位置
	  Node *temp;
	  temp=p->prev;
	  return temp;
}
void RemoveAt(Node *temp1){//移除指定下标值的元素
    Node *temp;
    Node *p,*q;
    temp=temp1;
    if(temp->prev!=NULL&&temp->next!=NULL) 
	{
	p=temp->prev;
    q=temp->next;
    p->next=q;
    q->prev=p;
    delete temp;}
    if(temp->prev!=NULL&&temp->next==NULL)
    {
    	p=b;
    	b=b->prev;
    	delete p;
	}
	if(temp->next!=NULL&&temp->prev==NULL)
	{
		p=a;
		a=a->next;
		delete p;
	}
	if(temp->prev==NULL&&temp->next==NULL)
	{
		delete temp;
		List list;
		list0=list;
		a=list0.GetHead();
		b=list0.GetTail();
	}
}

//查询操作
Node *Find(){//返回指定值的元素的位置 
    int k;
    Node *temp;
    temp=a;
	cout<<"请问要按什么查找?"<<endl; 
	cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
    cout<<"|                                |"<<endl;
    cout<<"|    1.姓名  2.学号  3.排名      |"<<endl;
    cout<<"|                                |"<<endl;
    cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
    cin>>k;
    switch(k){
    		case 1:
    			{
				string name1;
		        cout<<"请输入学生姓名:"<<endl;
		        cin>>name1;
	          	while(temp)
	            {
		          if(temp->getname()==name1)
		          {
				    return temp;
				    break;
				  }
		          else
		          temp=temp->next;
	            }
	            return NULL;
	            cout<<"并没有此项信息!!!"<<endl;
				}
				break;
		    case 2:
	          	{
				int num1;
		        cout<<"请输入学生学号:"<<endl;
		        cin>>num1;
		        while(temp)
	            {
		          if(temp->getnum()==num1)
		          {
				    return temp;
				    break;
				  }
		          else
		          temp=temp->next;
	            }
	            return NULL;
	            cout<<"并没有此项信息!!!"<<endl;
				}
				break;
		    case 3:
		        {
				int score1;
		        cout<<"请输入学生排名:"<<endl;
		        cin>>score1;
		        while(temp)
	            {
		          if(temp->getscore()==score1)
		          {
				    return temp;
				    break;
				  }
		          else
		          temp=temp->next;
	            }
	            return NULL;
	            cout<<"并没有此项信息!!!"<<endl;
				}
				break;
		    default:
		    	cout<<"参数错误!!!"<<endl;
		    	break;
		    }
}

//状态测试 
int GetCount(){//返回链表长度 
	int n=0;
	Node *temp=a;
	while(temp)
	{
		n++;
		temp=temp->next;
	}
	return n;
}
int IsEmpty(){//判断链表是否为空
	if(a->next==NULL&&a->getname()=="小明"&&a->getscore()==1&&a->getage()==18&&a->getclass()=="计算机5班"&&a->getteacher()=="王老师")
	return 1;//链表为空 
	else
	return 0;
}//链表不为空 
//元素的具体操作
void seek(){
 	int judge;
 	judge=IsEmpty();
	int i=1;
 	do{	 
 	  if(judge==1)
      {
	    cout<<"链表为空,请先添加信息!!!"<<endl;
        insert();
        break;
	  }
 	  else
  	  {
 		Node *temple;
 		temple=Find();
        system("cls");
        if(temple!=NULL)
 		{
		 cout<<"学生信息如下:"<<endl;
 		cout<<setw(15)<<"姓名"<<setw(15)<<"年龄"<<setw(15)<<"学号"<<setw(15)<<"班级"<<setw(15)<<"教师"<<setw(15)<<"排名"<<endl;
 		cout<<"---------------------------------------------------------------------------------------------------------------"<<endl;
 		temple->showall();
 		cout<<"---------------------------------------------------------------------------------------------------------------"<<endl;}
 		system("pause");
 		system("cls");
		cout<<"1.继续查找  2.返回主菜单"<<endl;
	    cin>>i;
        system("cls");
	  } 
	  
 	 }while(i==1);
 }
void modify(){
 	int judge;
 	judge=IsEmpty();
 	int i=1;
 	do{	
 	  if(judge==1)
      cout<<"链表为空,请先添加信息!!!"<<endl;
      else
      {
    	cout<<"首先查找该学生"<<endl;
    	Node *temple;
 	    temple=Find();
 	    if(temple!=NULL)
 		temple->changeit();
	  }
	  system("cls");
	  cout<<"--------------------------"<<endl;
	  cout<<"|1.继续修改  2.返回主菜单|"<<endl;
	  cout<<"--------------------------"<<endl;
	  cin>>i;
     }while(i==1);
 }
void insert(){
 	int judge;
 	judge=IsEmpty();
	int i=1;
 	do{	 
 	  if(judge==1)
      {
	   cout<<"目前有0条信息"<<endl;
       AddHead();
       break;
	  }
	  else
	  {
	  	cout<<"目前共有"<<GetCount()<<"位学生的信息"<<endl;
        AddTail();
        cout<<"--------------------------"<<endl;
		cout<<"|1.继续添加  2.返回主菜单|"<<endl;
		cout<<"--------------------------"<<endl;
	    cin>>i;
	  }	  
      }while(i==1);
  }
void del(){
 	int judge;
 	judge=IsEmpty();
	int i=1;
	do{
		if(judge==1)
       {
	    cout<<"目前有0条信息,请首先添加学生生信息"<<endl;
        insert();
	  }
	  else
	  {
	  	cout<<"1.删除所有信息  2.删除部分信息"<<endl;
	  	int sign;
	  	cin>>sign;
	  	system("cls");
	  	if(sign==1)
	  	{
	  		RemoveAll();
		  }
		if(sign==2)
		{
			Node *temp;
			cout<<"首先查找信息"<<endl;
			temp=Find();
			system("cls");
			RemoveAt(temp);
		}
	  	
	  }
	    cout<<"-------------------------------"<<endl;
		cout<<"|1.继续删除信息   2.返回主菜单|"<<endl;
		cout<<"-------------------------------"<<endl;
		cin>>i;
	}while(i==1);
}
void display(){
	Node *temp=a;
	if(IsEmpty()!=1)
	{
	  if(temp->next){
	  cout<<"---------------------------------------------------------------------------------------------------------------"<<endl;
	  cout<<setw(15)<<"姓名"<<setw(15)<<"年龄"<<setw(15)<<"学号"<<setw(15)<<"班级"<<setw(15)<<"教师"<<setw(15)<<"排名"<<endl;
 	  cout<<"---------------------------------------------------------------------------------------------------------------"<<endl;
	  while(temp->next){
		temp->showall();
		cout<<"---------------------------------------------------------------------------------------------------------------"<<endl;
		temp=temp->next;
	   }
	   temp->showall();
	   cout<<"---------------------------------------------------------------------------------------------------------------"<<endl;
	   cout<<"以上为所有学生信息"<<endl;
	}
	else{	
	  cout<<"---------------------------------------------------------------------------------------------------------------"<<endl;
	  cout<<setw(15)<<"姓名"<<setw(15)<<"年龄"<<setw(15)<<"学号"<<setw(15)<<"班级"<<setw(15)<<"教师"<<setw(15)<<"排名"<<endl;
 	  cout<<"---------------------------------------------------------------------------------------------------------------"<<endl;
	  temp->showall();
	  cout<<"---------------------------------------------------------------------------------------------------------------"<<endl;
	  cout<<"以上为所有学生信息"<<endl;}
	}
	else
	cout<<"目前没有学生信息,请添加学生信息"<<endl;
	system("pause");
	system("cls");
}
void tongji(){
	int n;
	cout<<"--------------------------------------------------------"<<endl;
	cout<<"|1.统计学生总数  2.统计特定教师学生数目  3.统计以上所有|"<<endl;
	cout<<"--------------------------------------------------------"<<endl;
	cin>>n;
	if(n==1)
	{
	    int num1=0;
		Node *temp1=a;
		while(temp1->next!=NULL)
		{
			
			num1++;
			temp1=temp1->next;
		}
		cout<<"学生总数为:"<<num1<<endl;
		system("pause");
        system("cls");
	}
	if(n==2)
	{
		int num2=0;
		string tname;
		cout<<"请输入教师姓名"<<endl;
		cin>>tname;
		Node *temp2=a;		
		while(temp2->next!=NULL){
			if(temp2->getteacher()==tname)
			{
				num2++;
				temp2=temp2->next;
			}
			else
			temp2=temp2->next;
		}
		cout<<"该教师有学生"<<num2<<"名"<<endl;
		system("pause");
        system("cls");
	}
   if(n==3)
   {
   	    int num1=0;
		Node *temp1=a;
		while(temp1->next!=NULL)
		{
			
			num1++;
			temp1=temp1->next;
		}
		cout<<"学生总数为:"<<num1<<endl;
		int num2=0;
		string tname;
		cout<<"请输入教师姓名"<<endl;
		cin>>tname;
		Node *temp2=a;		
		while(temp2->next!=NULL){
			if(temp2->getteacher()==tname)
			{
				num2++;
				temp2=temp2->next;
			}
			else 
			temp2=temp2->next;
		}
		cout<<"该教师有学生"<<num2<<"名"<<endl;
   }
   system("pause");
   system("cls");
}

};
Set ABC;
int main()
{ do{

    menu();	
	}while(choice!=0);
 }
 
void menu()
{ 
    system("cls");
	cout<<"*****************************************************************\n";
	cout<<"*\t\t\t学生信息管理系统\t\t\t*\n";
	cout<<"*****************************************************************\n";
	cout<<"*\t\t\t系统功能选择菜单\t\t\t*\n";
	cout<<"*---------------------------------------------------------------*\n";
	cout<<"*  0.退出菜单                                                   *\n";
	cout<<"*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*\n";
	cout<<"*  1.查询信息          2.修改信息                               *\n";
	cout<<"*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*\n";
	cout<<"*  3.增加信息          4.删除信息                               *\n";
	cout<<"*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*\n";
	cout<<"*  5.显示信息          6.统计信息                               *\n";
	cout<<"*---------------------------------------------------------------*\n";
	cout<<"*  请选择菜单编号  :                                           *\n";	
	cout<<"*****************************************************************\n";
	cin>>choice;
	system("cls");
	switch(choice)
	{
		case 0:
			break;
		case 1:
			::ABC.seek();
			break;
		case 2:
			::ABC.modify();
			break;
		case 3:
			::ABC.insert();
			break;
		case 4:
			::ABC.del();
			break;
		case 5:
			::ABC.display();
			break;
		case 6:
			::ABC.tongji();
			break;
		default:
			{
			cout<<"选择错误,请重新选择"<<endl;
			system("pause");
			system("cls");
			}
			break;
	}
}

参考一下这篇文章:https://www.cnblogs.com/lttdxuexizhilu/p/11614634.html

如有帮助,望采纳。

 

您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps: 问答会员年卡【8折】购 ,限时加赠IT实体书,即可 享受50次 有问必答服务,了解详情>>>https://t.csdnimg.cn/RW5m