?? 程序15.2:學員通訊錄程序.cpp
字號:
/******程序12.1:學員通訊錄程序.cpp******/
#include <iostream>
#include <iomanip>
#include <string>
#include <fstream>
using namespace std;
class Student
{
private:
string sName; //姓名
string sAddree; //姓名
string sPhone; //電話
string sMobile; //手機
string sEmail; //郵箱
public:
Student(string sName) //用來從鍵盤讀數據信息
{
cout<<"\n****** 輸入《"<<sName<<"》信息 ******\n";
this->sName=sName;
cout<<" 通信地址 : ";
cin>>sAddree;
cout<<" 電話號碼 : ";
cin>>sPhone;
cout<<" 手機號碼 : ";
cin>>sMobile;
cout<<" 電子信箱 : ";
cin>>sEmail;
cout<<"****** 輸入《"<<sName<<"》完畢 ******\n";
}
Student(string sName,string sAddree,string sPhone,
string sMobile,string sEmail)//用來從文件讀數據信息
{
this->sName=sName;
this->sAddree=sAddree;
this->sPhone=sPhone;
this->sMobile=sMobile;
this->sEmail=sEmail;
}
void Display() //顯示個人數據信息
{
cout<<"\n****** 顯示《"<<sName<<"》信息 ******\n";
cout << " 地址是 :" << sAddree << endl;
cout << " 電話是 :" << sPhone << endl;
cout << " 手機是 :" << sMobile << endl;
cout << " 郵箱是 :" << sEmail << endl;
cout<<"****** 顯示《"<<sName<<"》完畢 ******\n";
}
bool CmpKey(string str) //在鏈表中查找相關數據
{
if(sName == str)
return true;
if(sPhone == str)
return true;
if(sMobile == str)
return true;
if(sEmail == str)
return true;
return false;
}
void Modify() //修改節點數據信息
{
do
{
cout << "\n******《修改通訊錄信息》******\n";
cout << "1. 姓名是 :" << sName << endl;
cout << "2. 地址是 :" << sAddree<< endl;
cout << "3. 電話是 :" << sPhone << endl;
cout << "4. 手機是 :" << sMobile << endl;
cout << "5. 郵箱是 :" << sEmail << endl << endl;
int iChoice;
cout << " 選擇要修改項目的編號(1—5) : " << endl;
cout << " 按任意其它鍵退出修改, 輸入 : " ;
cin >> iChoice;
switch(iChoice)
{
case 1:
cout << " 輸入修改后的姓名 : ";
cin >> sName;
break;
case 2:
cout << " 輸入修改后的地址 : ";
cin >> sAddree;
break;
case 3:
cout << " 輸入修改后的電話 : ";
cin >> sPhone;
break;
case 4:
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:
Student stud; //節點數據信息(INFO)
string sName; //節點標示名稱
Node *NEXT; //指向下一節點的節點指針(NEXT)
Node(string sName,Node *NEXT=NULL):stud(sName)
{
this->sName=sName;
this->NEXT=NEXT;
}
Node(string sName,string sAddree,string sPhone,string sMobile,
string sEmail):stud(sName,sAddree,sPhone,sMobile,sEmail)
{
//空語句體,用來從文件讀數據信息
}
};
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(); //增加節點
void AddNodeSta(); //增加節點到表頭
void AddNodeEnd(); //增加節點到表尾
void AddNode(string sName,string sAddree,string sPhone,
string sMobile,string sEmail);//從文件中讀取節點
void Traverse(); //遍歷鏈表(瀏覽所有節點信息)
void Modify(); //修改節點
void QueryNode(); //查詢節點(按照關鍵字查找符合條件的節點)
void DelNode(); //刪除當前節點
void DelNodeSta(); //刪除表頭節點
void DelNodeEnd(); //刪除表尾節點
void RowOrder(); //鏈表按字母順序排序
void Save(ofstream &ofile); //保存節點信息到文件
};
void List::AddNode() //增加節點,按拼音順序增加到相應的位置
{
string str; //聲明節點標示變量
cout<<"\n 輸入姓名 : ";
cin >> str;
if(Start==NULL) //條件成立,創建新鏈表的第一個節點
{
Start=new Node(str,NULL);
//新建節點, sName=str, Start->NEXT=NULL
End=Start;
cout << "\n 創建鏈表的第一個節點完畢!!! " << endl;
return; //函數返回,不再向下執行
}
if(str<=Start->sName) //條件成立,將節點增加到表頭
{
Start=new Node(str,Start); //新建節點作為表頭
//新建節點, sName=str, Start->NEXT=Start
cout << "\n 增加鏈表節點到表頭完畢!!! " << endl;
return; //函數返回,不再向下執行
}
Prev=Start; //Prev指針初始化到表頭
Curr=Prev->NEXT; //Cur指針初始化到表頭
while(Curr!=NULL) //使用循環查找插入節點位置
{
if(str>Prev->sName && str<=Curr->sName)
{
Node *N=new Node(str,Curr);
//新建節點, sName=str, N->NEXT=Curr
Prev->NEXT=N; //新建節點在Prev之后Curr之前
cout << "\n 增加鏈表節點到表中完畢!!! " << endl;
return; //函數返回,不再向下執行
}
Prev=Curr; //后移Prev指針
Curr=Prev->NEXT; //后移Cur指針
}
End=new Node(str,NULL);
//新建節點, sName=str, End->NEXT=NULL
Prev->NEXT=End;
cout << "\n 增加鏈表節點到表尾!!! " << endl;
}
void List::AddNodeSta() //增加節點到表頭
{
string str; //聲明節點標示變量
cout<<"\n 輸入姓名 : ";
cin >> str;
if(Start==NULL) //條件成立,創建新鏈表的第一個節點
{
Start=new Node(str,NULL);
//新建節點, sName=str, Start->NEXT=NULL
End=Start;
cout << "\n 創建鏈表的第一個節點完畢!!! " << endl;
return; //函數返回,不再向下執行
}
Start=new Node(str,Start); //新建節點作為表頭
//新建節點, sName=str, Start->NEXT=Start
cout << "\n 增加鏈表節點到表頭完畢!!! " << endl;
}
void List::AddNodeEnd() //增加節點到表尾
{
string str; //聲明節點標示變量
cout<<"\n 輸入姓名 : ";
cin >> str;
if(Start==NULL) //條件成立,創建新鏈表的第一個節點
{
Start=new Node(str,NULL);
//新建節點, sName=str, Start->NEXT=NULL
End=Start;
cout << "\n 創建鏈表的第一個節點完畢!!! " << endl;
return; //函數返回,不再向下執行
}
Prev=Start; //Prev指針初始化到表頭
Curr=Prev->NEXT; //Cur指針初始化到表頭
while(Curr!=NULL) //使用循環查找插入節點位置
{
Prev=Curr; //后移Prev指針
Curr=Prev->NEXT; //后移Cur指針
}
End=new Node(str,NULL);
//新建節點, sName=str, End->NEXT=NULL
Prev->NEXT=End;
cout << "\n 增加鏈表節點到表尾!!! " << endl;
}
void List::AddNode(string sName,string sAddree,string sPhone,
string sMobile,string sEmail)
{ //從文件中讀取節點,讀入后的順序和文件中的順序一致
if(Start==NULL)
{
Start=new Node(sName,sAddree,sPhone,sMobile,sEmail);
Curr=End=Start;
}
else
{
Curr=End;
End=new Node(sName,sAddree,sPhone,sMobile,sEmail);
Curr->NEXT=End;
}
}
void List::Modify()
{
string sKey; //聲明關鍵字變量
cout << "\n 輸入修改關鍵字(姓名/地址/電話/手機/郵箱) : ";
cin >> sKey;
for(Curr=Start;Curr!=NULL;Curr=Curr->NEXT)
{
if(sKey==Curr->sName||Curr->stud.CmpKey(sKey))
{
Curr->stud.Modify();//修改節點信息
}
}
if(Curr=NULL)
cout << "\n 查詢完畢,沒有查詢到相關信息!!! " << endl;
}
void List::Traverse() //遍歷鏈表(瀏覽所有節點信息)
{
if(Start==NULL)
{
cout << "\n 鏈表不存在!!! " << endl;
}
else
{
iPosition=1;
for(Curr=Start;Curr!=NULL;Curr=Curr->NEXT)
{ //循環顯示所有節點信息
cout<<iPosition++<<" . "; //顯示節點序號
cout<<Curr->sName<<endl; //顯示節點標示
// Curr->stud.GetName()<<endl; //顯示節點信息姓名
// Curr->stud.Display()<<endl; //顯示節點信息全部
}
cout << "\n 鏈表遍歷完畢!!! " << endl;
}
}
void List::QueryNode() //查詢節點(按照關鍵字查找符合條件的節點)
{
string sKey; //聲明關鍵字變量
cout << "\n 輸入查詢關鍵字(姓名/地址/電話/手機/郵箱) : ";
cin >> sKey;
for(Curr=Start;Curr!=NULL;Curr=Curr->NEXT)
{
if(sKey==Curr->sName||Curr->stud.CmpKey(sKey))
{
cout<<"\n 查詢到一個相關節點,顯示如下: "<<endl;
Curr->stud.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 sKey; //聲明關鍵字變量
cout<<"\n 輸入刪除節點關鍵字(姓名/地址/電話/手機/郵箱) : ";
cin >> sKey;
for(Prev=Curr=Start;Curr!=NULL;Prev=Curr,Curr=Prev->NEXT)
{
if(sKey==Curr->sName||Curr->stud.CmpKey(sKey))
{
Curr->stud.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::DelNodeSta() //刪除表頭節點
{
if(Start==NULL)
cout << "\n 鏈表不存在!!! " << endl;
return;
Start=Start->NEXT;
delete Start;
cout << "\n 刪除鏈表表頭節點完畢!!! " << endl;
}
void List::DelNodeEnd() //刪除表尾節點
{
if(Start==NULL)
cout << "\n 鏈表不存在!!! " << endl;
return;
for(Curr=Start;Curr->NEXT!=NULL;Prev=Curr,Curr=Prev->NEXT);
Prev->NEXT=NULL; //刪除表尾節點
delete Curr;
cout << "\n 刪除鏈表表尾節點完畢!!! " << endl;
}
void List::RowOrder() //鏈表按字母順序排序
{
if(Start==NULL)
{
cout << "\n 鏈表不存在!!! " << endl;
}
else
{
Prev=Start;
Curr=Start->NEXT;
while(Curr!=NULL)
{
if(Prev->sName > Curr->sName)
{
Node *Temp;
Temp=Prev;
Prev=Curr;
Curr=Temp;
Prev=Start;
Curr=Start->NEXT;
continue;
}
Prev=Curr;
Curr=Curr->NEXT;
}
cout << "\n 鏈表按字母順序排序完畢!!! " << endl;
}
}
void List::Save(ofstream &ofile)
{
for(Prev=Curr=Start;Curr!=NULL;Curr=Curr->NEXT)
{
ofile << Curr->stud.GetName() << endl;
ofile << Curr->stud.GetPhone() << endl;
ofile << Curr->stud.GetMobile() << endl;
ofile << Curr->stud.GetEmail() << endl;
}
}
int main(int argc,char* argv[]) //向主函數傳入參數
{
List list;
if(argc>1)
{
cout << argv[0] << endl; //顯示程序文件名
cout << argv[1] << endl; //顯示加載文件名
ifstream ifile(argv[1]); //讀取文件
string sName,sAddree,sPhone,sMobile,sEmail;
while(true)
{
if(!(ifile >> sName)) break;
if(!(ifile >> sPhone)) break;
if(!(ifile >> sMobile)) break;
if(!(ifile >> sEmail)) break;
list.AddNode(sName,sAddree,sPhone,sMobile,sEmail);
}
}
cout << " ******************************《通 訊 錄 程 序》****************************** "<< endl;
char cCmd;
do
{
cout << "\n 增加(A) 遍歷(T) 修改(M) 刪除(D) 查詢(Q) 排序(R) 保存(S) 退出(X): ";
cin >> cCmd;
switch(cCmd)
{
case 'a':
case 'A':
{
list.AddNode();
break;
}
case 'm':
case 'M':
{
list.Modify();
break;
}
case 'd':
case 'D':
{
list.DelNode();
break;
}
case 't':
case 'T':
{
list.Traverse();
break;
}
case 'q':
case 'Q':
{
list.QueryNode();
break;
}
case 'r':
case 'R':
{
list.RowOrder();
break;
}
case 's':
case 'S':
{
cout << "\n 輸入要保存的文件路徑名 : ";
string sFile;
cin >> sFile;
ofstream ofile(sFile.data());
list.Save(ofile);
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 + -