?? 程序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 + -