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

📄 程序15.1:单链表.cpp

📁 学习C++的一些范例
💻 CPP
字号:
/******程序15.1:单链表.cpp******/
#include <iostream>
#include <string>
using namespace std;

class Information
{
private:
	string sName;		//姓名
	string sPhone;		//电话
	string sMobile;		//手机
	string sEmail;		//邮箱
public:
	Information(string sName)	//用来从键盘读数据信息
	{
		cout<<"\n****** 输入《"<<sName<<"》信息 ******\n";
		this->sName=sName;
		cout<<"   电话号码  : ";
		cin>>sPhone;
		cout<<"   手机号码  : ";
		cin>>sMobile;
		cout<<"   电子信箱  : ";
		cin>>sEmail;
		cout<<"****** 输入《"<<sName<<"》完毕 ******\n";
	}
	void Display()				//显示个人数据信息
	{
		cout<<"\n****** 显示《"<<sName<<"》信息 ******\n";
		cout << "   电话是  :" << sPhone << endl;
		cout << "   手机是  :" << sMobile << endl;
		cout << "   邮箱是  :" << sEmail << endl;
		cout<<"****** 显示《"<<sName<<"》完毕 ******\n";
	}
	bool CmpKey(string str)		//在链表中查找相关数据
	{
		if(str==sName) 
			return true;
		if(str==sPhone) 
			return true;
		if(str==sMobile) 
			return true;
		if(str==sEmail) 
			return true;
		return false;
	}
	void Modify()				//修改节点数据信息
	{
		do
		{
		cout << "\n******《修改通讯录信息》******\n";
		cout << "1. 姓名是  :" << sName << endl;
		cout << "2. 电话是  :" << sPhone << endl;
		cout << "3. 手机是  :" << sMobile << endl;
		cout << "4. 邮箱是  :" << sEmail << endl << endl;
		int iChoice;
		cout << "   选择要修改项目的编号(1—4) : " << endl;
		cout << "   按任意其它键退出修改, 输入 : " ;
		cin >> iChoice;
			switch(iChoice)
			{
			case 1:
				cout << "   输入修改后的姓名  : ";
				cin >> sName;
				break;
			case 2:
				cout << "   输入修改后的电话  : ";
				cin >> sPhone;
				break;
			case 3:
				cout << "   输入修改后的手机  : ";
				cin >> sMobile;
				break;
			case 5:
				cout << "   输入修改后的邮箱  : ";
				cin >> sEmail;
				break;
			default:
				break;
			}
			if(iChoice>=1&&iChoice<=5)
			{
			cout<<"   还要继续修改其它选项吗(y/n): ";
			char cChoice;
			cin >> cChoice;
			if(cChoice=='y'||cChoice=='Y')
				continue;
			else
				{
				cout << "******《修改通讯录完毕》******\n";
				break;		
				}
			}
		}while(1);
	}
	string GetName()		//用于访问私有成员变量sName
	{
		return sName;
	}
	string GetPhone()		//用于访问私有成员变量sPhone
	{
		return sPhone;
	}
	string GetMobile()		//用于访问私有成员变量sMobile
	{
		return sMobile;
	}
	string GetEmail()		//用于访问私有成员变量sEmail
	{
		return sEmail;
	}
};

class Node
{
public:
	string str;				//节点标识名称
	Information INFO;		//节点数据 
	Node *NEXT;				//指向下一节点的节点指针(NEXT) 
	Node(string str,Node *NEXT=NULL):INFO(str)
	{
		this->str=str;
		this->NEXT=NEXT;
	}
	void Modify(string str)
	{
		cout<<"   当前节点str为 : "<<str<<endl;		
		cout<<"   输入修改后的str : ";
		cin >> str;		
	}
};

class List					//定义一个List类
{
private:
	Node*	Start;			//表头指针,固定在表头
	Node*	Curr;			//当前遍历位置指针
	Node*	Prev;			//当前位置的前节点指针
	Node*	End;			//表尾指针,固定在表尾
	int		iPosition;		//当前节点在表中的位置序号
public:
	List()					//构造符函数
	{
		Start=Curr=Prev=End=NULL;
		iPosition=1;
	}
	~List()					//析造符函数
	{
		while(Start!=NULL)
		{
			Curr=Start;
			Start=Start->NEXT;
			delete Curr;
		}
	}
	void AddNode(string str);	//增加节点
	void Modify(string str);	//修改节点
	void Traverse();			//遍历链表(浏览所有节点信息)
	void QueryNode(string str);	//查询节点(按照关键字查找符合条件的节点)
	void DelNode(string str);	//删除当前节点
	void RowOrder();			//链表按字母顺序排序
};

void List::AddNode(string str)	//按字母顺序增加节点到相应的位置
{					
	Node *n=new Node(str);
	if(Start==NULL)				//条件成立,创建新链表的第一个节点
	{
		n->NEXT=NULL;			//新建节点为链表的第一个节点
		Start=n;					
		End=n;
		cout << "\n   创建链表的第一个节点完毕!!! " << endl;
		return;					//函数返回,不再向下执行
	}
	if(str<=Start->str)			//条件成立,将节点增加到表头
	{
		n->NEXT=Start;			//新建节点作为表头
		Start=n;
		cout << "\n   增加链表节点到表头完毕!!! " << endl;
		return;					//函数返回,不再向下执行
	}
	Prev=Start;					//Prev指针初始化到表头
	Curr=Prev->NEXT;			//Cur指针初始化到表头
	while(Curr!=NULL)			//使用循环查找插入节点位置
	{
		if(str>Prev->str && str<=Curr->str)
		{
			n->NEXT=Curr;		//新建节点NEXT=Curr
			Prev->NEXT=n;		//新建节点在Prev之后Curr之前
			cout << "\n   增加链表节点到表中完毕!!! " << endl;
			return;				//函数返回,不再向下执行
		}
		Prev=Curr;				//后移Prev指针
		Curr=Prev->NEXT;		//后移Cur指针
	}
	Prev->NEXT=n;
	End=n;						//新建节点为表尾
	cout << "\n   增加链表节点到表尾完毕!!! " << endl;
}

void List::Modify(string str)
{
	for(Curr=Start;Curr!=NULL;Curr=Curr->NEXT)
	{
	   if(str==Curr->str)
	   {
		   Curr->Modify(str);	//修改节点str	 	   
	   }
	   if(Curr->INFO.CmpKey(str))
	   {
		   Curr->INFO.Modify();	//修改节点数据	   
	   }
	}
	if(Curr=NULL)
		cout << "\n   查询完毕,没有查询到相关信息!!! " << endl;
}

void List::Traverse()			//遍历链表(浏览所有节点信息)
{
	if(Start==NULL)
	{
		cout << "\n   链表不存在!!! " << endl;
	}
	else
	{
		iPosition=1;
		cout<<"\n   显示链表信息: " << endl;
		for(Curr=Start;Curr!=NULL;Curr=Curr->NEXT)
		{							//循环显示所有节点信息
			cout<<iPosition++<<". ";	//显示节点序号
			cout<<Curr->str<<endl;	//显示节点标识
		}
		cout << "\n   链表遍历完毕!!! " << endl;
	}
}

void List::QueryNode(string str)	//查询节点(按照关键字查找符合条件的节点)
{
	for(Curr=Start;Curr!=NULL;Curr=Curr->NEXT)
	{
	   if(str==Curr->str||Curr->INFO.CmpKey(str))
	   {
			cout<<"\n   查询到一个相关节点,显示如下: "<<endl;
			Curr->INFO.Display();		//显示节点信息全部
			cout<<"\n   继续查询下一个相关节点吗(y/n): ";	
			char ch;
			cin>>ch;
			if(ch=='y'||ch=='Y')
				continue;
			else
				cout << "\n   查询完毕!!! " << endl;
				return;
	   }
	}
	if(Curr==NULL)
		cout << "\n   查询完毕,没有查询到相关信息!!! " << endl;
}

void List::DelNode(string str)			//删除当前节点
{
	for(Prev=Curr=Start;Curr!=NULL;Prev=Curr,Curr=Prev->NEXT)
	{
		if(str==Curr->str||Curr->INFO.CmpKey(str))
		{
			Curr->INFO.Display();		//显示节点全部信息
			cout << "\n   确实要删除当前节点吗?(y/n) : ";
			char ch;
			cin >> ch;
			if(ch=='y'||ch=='Y')
			{
				Prev->NEXT=Curr->NEXT;	//删除当前节点
				if(Curr==Start)
				{
				   Start=Start->NEXT;
				}
				delete Curr;
				cout << "\n   删除链表当前节点完毕!!! " << endl;
				return;
			}
		}
	}
	cout << "\n   浏览完毕,未发现相关节点!!! " << endl;
}

void List::RowOrder()		//链表按字母顺序排序
{
	if(Start==NULL)
	{
		cout << "\n   链表不存在!!! " << endl;
	}
	else
	{
		Prev=Start;
		Curr=Start->NEXT;
		while(Curr!=NULL) 
		{
			if(Prev->str > Curr->str)
			{
				Node *Temp;
				Temp=Prev;
				Prev=Curr;
				Curr=Temp;
				Prev=Start;
				Curr=Start->NEXT;
				continue;
			}
			Prev=Curr;
			Curr=Curr->NEXT;			
		}
		cout << "\n   链表按字母顺序排序完毕!!! " << endl;
	}
}

int main()
{
	List listObj;
	string strObj;			//声明节点标识变量
	cout << "************************《通 讯 录 程 序》************************"<< endl;
	char cCmd;
	do
	{
	cout << "\n 增加(A)  修改(M)  遍历(T)  查询(Q)  删除(D)  排序(R)  退出(X): ";
	cin >> cCmd;
	switch(cCmd)
	{
		case 'a':
		case 'A':
		{
			cout<<"\n   输入姓名 : ";
			cin>>strObj;
			listObj.AddNode(strObj);
			break;
		}
		case 'm':
		case 'M':
		{
			cout<<"\n   输入修改节点关键字(姓名/电话/手机/邮箱) : ";
			cin>>strObj;
			listObj.Modify(strObj);
			break;
		}
		case 't':
		case 'T':
		{
			listObj.Traverse();
			break;
		}
		case 'q':
		case 'Q':
		{
			cout<<"\n   输入查询节点关键字(姓名/电话/手机/邮箱) : ";
			cin>>strObj;
			listObj.QueryNode(strObj);
			break;
		}
		case 'd':
		case 'D':
		{
			cout<<"\n   输入删除节点关键字(姓名/电话/手机/邮箱) : ";
			cin>>strObj;
			listObj.DelNode(strObj);
			break;
		}
		case 'r':
		case 'R':
		{
			listObj.RowOrder();
			break;
		}
		case 'x':
		case 'X':
		{
			cout<<"\n  ***********《操作完毕,感谢您使用宋振会软件工作室产品》*********** \n"<<endl;	
			break;	
		}
		default:
			cout << "\n   输入错误,重新选择菜单 : ";
	}
	}while(cCmd!='x' && cCmd!='X' );
	return 0;
}

⌨️ 快捷键说明

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