📄 程序15.1:单链表.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 + -