?? dianhuaben.cpp
字號:
/*電話簿管理—源代碼及關(guān)鍵源代碼注解如下*/
#include<fstream.h>
#include<conio.h>
#include<iostream.h>
#include<iomanip.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
class CTelRecord //定義電話簿記錄類
{private:
int nYear,nMonth,nDay,nHour,nMinute; //時(shí)間單元
char Name[20]; //電話簿的數(shù)據(jù),姓名
char Homenum[20]; //電話號碼
public:
CTelRecord();
CTelRecord(char *name,char *homenum); //構(gòu)造函數(shù)
void SetRecord(char * name,char *homenum); //輸入數(shù)據(jù)函數(shù)
int Compare(CTelRecord &); //比較函數(shù),比較姓名
void Show(); //打印數(shù)據(jù)函數(shù)
void Modify(char *homenum); //修改結(jié)點(diǎn)上的數(shù)據(jù)
int LookChar(char *letter); //根據(jù)首字母查找匹配的姓名
char * GetName(){return Name;} //返回姓名
};
class CNode //定義結(jié)點(diǎn)類
{
private:
CTelRecord * pData; //用于指向數(shù)據(jù)類的指針
CNode * pNext; //指向鏈表下一結(jié)點(diǎn)的指針
public:
CNode(){ pData=0;pNext=0;} //結(jié)點(diǎn)構(gòu)造函數(shù)
CNode(CNode &node) //用于拷貝的構(gòu)造函數(shù)
{
pData=node.pData;
pNext=node.pNext;
}
void InputData(CTelRecord *pdata){ pData=pdata; } //輸入數(shù)據(jù)
void ShowNode(){ pData->Show(); }
CTelRecord * GetData(){ return pData;}
friend class CList; //定義鏈表類為友元類
};
class CList //定義鏈表類
{
private:
CNode * pHead; //鏈表頭結(jié)點(diǎn)指針
public:
CList(){ pHead=0; }
~CList(){ DeleteList(); }
void AddNode(CNode * pnode); //首部添加結(jié)點(diǎn)
CNode * DeleteNode(CNode *); //刪除一個(gè)指定的結(jié)點(diǎn),返回該結(jié)點(diǎn)的指針
CNode * LookUp(CTelRecord &); /*查找一個(gè)指定的數(shù)據(jù),返回該數(shù)據(jù)所在結(jié)點(diǎn)在鏈表中的指針,若未找
到返回0 */
void ShowList(); //打印整個(gè)鏈表
void DeleteList(); //刪除整個(gè)鏈表
CNode * GetListHead(){return pHead;} //返回鏈表首結(jié)點(diǎn)
CNode * GetListNextNode(CNode *); //返回鏈表指定結(jié)點(diǎn)的下一個(gè)結(jié)點(diǎn)
void Insert(CNode * pnode); //按姓名插入一個(gè)結(jié)點(diǎn)
};
inline istream & Flush(istream & stream) //清空輸入緩沖區(qū)
{
stream.clear();
int chars_to_skip=stream.rdbuf()->in_avail();
return stream.ignore(chars_to_skip);
}
void main()
{
int choice;
CList list;
CTelRecord *p;
CNode *pn;
char name[20]; //用于輸入姓名
char homenum[20]; //用于輸入家庭電話
char str[20];
ifstream infile("FRIENDS.DAT",ios::in|ios::nocreate); //從文件中讀入鏈表
if(!infile)
{
cout<<"歡迎使用電話簿管理程序.\n"<<flush;
system("pause");
system("cls");
}
else
{
CTelRecord pitem;
infile.read(reinterpret_cast<char *>(&pitem),sizeof(CTelRecord));
while(! infile.eof())
{
p=new CTelRecord;
*p=pitem;
pn=new CNode;
pn->InputData(p);
list.Insert(pn); //將結(jié)點(diǎn)插入鏈表
infile.read(reinterpret_cast<char *>(&pitem),sizeof(CTelRecord));
}
}
infile.close(); //關(guān)閉輸入文件
do
{
cout<<"\n 歡迎進(jìn)入電話簿管理系統(tǒng) "<<endl<<endl;
cout<<" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
cout<<"\n\n 1. 添加電話簿記錄 "
<<"\n\n 2. 顯示電話簿記錄 "
<<"\n\n 3. 根據(jù)姓名查詢電話簿數(shù)據(jù)"
<<"\n\n 4. 根據(jù)姓名刪除電話簿數(shù)據(jù)"
<<"\n\n 5. 根據(jù)姓名修改電話簿數(shù)據(jù)"
<<"\n\n 6. 智能查找電話簿數(shù)據(jù) "
<<"\n\n 0. 退出系統(tǒng) "<<endl<<endl;
cout<<" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl<<endl;
cout<<" 0610200256 張佳斌";
cout<<"\n\n輸入選擇: "<<endl;
Flush(cin);
cin.getline(str,20);
choice=atoi(str);
switch(choice)
{
case 1: //添加電話簿記錄
system("cls");
cout<<"輸入姓名(拼音):";
Flush(cin);
cin.getline(name,20); //獲取姓名數(shù)據(jù)
cout<<endl;
cout<<"輸入家庭電話:";
Flush(cin);
cin.getline(homenum,20); //獲取家庭電話數(shù)據(jù)
cout<<endl;
p=new CTelRecord(name,homenum); //開辟電話簿記錄類新空間
pn=new CNode; //開辟結(jié)點(diǎn)類新空間
pn->InputData(p); // 結(jié)點(diǎn)數(shù)據(jù)輸入函數(shù)
list.Insert(pn); //結(jié)點(diǎn)數(shù)據(jù)插入鏈表
system("cls");
break;
case 2: //顯示電話簿記錄
system("cls"); //清空屏幕
pn=list.GetListHead();
if(pn==0) //結(jié)點(diǎn)數(shù)據(jù)為空時(shí)
{
cout<<"無電話簿數(shù)據(jù)."<<endl;
system("pause");
system("cls");
}
else //輸出結(jié)點(diǎn)數(shù)據(jù)
{
list.ShowList();
system("pause");
system("cls");
}
break;
case 3: //根據(jù)姓名查詢電話簿數(shù)據(jù)
system("cls"); //清空屏幕
cout<<"輸入姓名(拼音):";
Flush(cin);
cin.getline(name,20); //獲取姓名
p=new CTelRecord(name,homenum); //開辟電話簿記錄類新空間
pn=list.LookUp(*p); //查找數(shù)據(jù)函數(shù)
if(pn) //結(jié)點(diǎn)數(shù)據(jù)不為空則輸出結(jié)點(diǎn)數(shù)據(jù),為空則輸出無電話簿記錄
{
pn->GetData()->Show();
system("pause");
system("cls");
}
else
{
cout<<"\n無電話簿數(shù)據(jù) \n\n"<<flush; //結(jié)點(diǎn)數(shù)據(jù)為空輸出無電話簿數(shù)據(jù)
system("pause");
system("cls");
}
delete p;
break;
case 4: //根據(jù)姓名刪除電話簿記錄
system("cls");
cout<<"輸入姓名(拼音):";
Flush(cin);
cin.getline(name,20);
cout<<endl;
p=new CTelRecord(name,homenum);
pn=list.LookUp(*p);
if(pn)
{
char YesNo;
cout<<"找到電話簿數(shù)據(jù),確定刪除(y/n):"; //用戶選擇是否刪除
cin>>YesNo;
if(YesNo=='y'||YesNo=='Y') list.DeleteNode(pn);
system("cls"); //清空屏幕
}
else
{
cout<<"\n無電話簿數(shù)據(jù) \n\n"<<flush; //若無數(shù)據(jù),則輸出無電話簿數(shù)據(jù)
system("pause");
system("cls");
}
delete p;
break;
case 5: //根據(jù)姓名修改電話簿數(shù)據(jù)
system("cls");
cout<<"輸入姓名(拼音):";
Flush(cin);
cin.getline(name,20);
p=new CTelRecord(name,homenum);
pn=list.LookUp(*p);
if(pn) pn->GetData()->Show();
else
{
cout<<"\n無電話簿數(shù)據(jù) \n\n"<<flush;
system("pause");
system("cls");
break;
}
cout<<"\n\n1. 只修改電話號碼"; //選擇只修改電話號碼
cout<<"\n\n2. 修改電話號碼和姓名 "; //選擇電話號碼和姓名均更改
cout<<"\n\n輸入選擇: ";
cin>>choice;
switch(choice)
{case 1:
cout<<"輸入電話號碼:";
Flush(cin);
cin.getline(homenum,20);
cout<<endl;
pn->GetData()->Modify(homenum); //修改結(jié)點(diǎn)數(shù)據(jù)
break;
case 2: //可修改結(jié)點(diǎn)上的所有數(shù)據(jù)
list.DeleteNode(pn);
cout<<"輸入姓名(拼音):";
Flush(cin);
cin.getline(name,20); //修改姓名
cout<<endl;
cout<<"輸入電話號碼:";
Flush(cin);
cin.getline(homenum,20); //修改家庭電話
cout<<endl;
pn=new CNode; //新結(jié)點(diǎn)類
pn->InputData(p);
list.Insert(pn);
break;
default:
cout<<"輸入錯(cuò)誤\n";
break;
}
delete p;
system("cls");
break;
case 6: //智能查找
system("cls");
Flush(cin);
cout<<"輸入姓的首字母:";
cin.getline(name,20);
pn=list.GetListHead(); //提取鏈表首結(jié)點(diǎn)
while(pn)
{
p=pn->GetData();
if(p->LookChar(name)==1)
p->Show();
pn=list.GetListNextNode(pn);
}
system("pause");
system("cls");
break;
case 0:
break;
default:
cout<<"選擇錯(cuò)誤!\n"<<flush;
system("pause");
system("cls");
}
}while(choice!=0);
ofstream outfile("FRIENDS.DAT"); //從鏈表中寫入文件
if(!outfile)
{
cout<<"錯(cuò)誤,不能打開文件";
getch();
exit(1);
}
pn=list.GetListHead();
while(pn)
{
p=pn->GetData();
outfile.write(reinterpret_cast<const char *>(p),sizeof(CTelRecord));
pn=list.GetListNextNode(pn);
}
outfile.close();
}
CTelRecord::CTelRecord() //數(shù)據(jù)初始化
{
strcpy(Name,"\0");
strcpy(Homenum,"\0");
time_t time_date; //時(shí)間轉(zhuǎn)換
tm CurrentTime;
time_date=time(NULL);
CurrentTime=*localtime(& time_date);
nYear=CurrentTime.tm_year+1900;
nMonth=CurrentTime.tm_mon+1;
nDay=CurrentTime.tm_mday;
nHour=CurrentTime.tm_hour;
nMinute=CurrentTime.tm_min;
}
CTelRecord::CTelRecord(char * name,char * homenum) //結(jié)點(diǎn)數(shù)據(jù)賦值
{
strcpy(Name,name);
strcpy(Homenum,homenum);
time_t time_date;
tm CurrentTime;
time_date=time(NULL); //寫入時(shí)間
CurrentTime=*localtime(& time_date);
nYear=CurrentTime.tm_year+1900;
nMonth=CurrentTime.tm_mon+1;
nDay=CurrentTime.tm_mday;
nHour=CurrentTime.tm_hour;
nMinute=CurrentTime.tm_min;
}
void CTelRecord::SetRecord(char * name,char * homenum) //修改結(jié)點(diǎn)數(shù)據(jù)
{
strcpy(Name,name);
strcpy(Homenum,homenum);
}
int CTelRecord::Compare(CTelRecord & pitem) //比較函數(shù),比較姓名,
{
int n;
n=strcmp(Name,pitem.Name);
if(n!=0) return 0;
else return 1;
}
void CTelRecord::Show() //輸出數(shù)據(jù)
{
cout<<"姓名: "<<Name<<endl; //輸出姓名
cout <<"家庭電話: "<<Homenum<<endl; //輸出電話號碼
cout<<"時(shí)間:"<<nYear<<"-"<<nMonth<<"-"<<nDay<<" "
<<nHour<<":"<<nMinute<<endl; //存儲時(shí)間的輸出
cout<<endl;
}
void CTelRecord::Modify(char * homenum) //修改結(jié)點(diǎn)上的電話號碼
{
strcpy(Homenum,homenum); //修改電話號碼
}
int CTelRecord::LookChar(char * letter) //首字母匹配返回1,否則返回0
{
if(Name[0]==letter[0])
return 1;
return 0;
}
void CList::AddNode(CNode *pnode) //添加結(jié)點(diǎn)
{
if(pHead==0)
{
pHead=pnode;
pnode->pNext=0;
}
else
{
pnode->pNext=pHead;
pHead=pnode;
}
}
CNode * CList::DeleteNode(CNode *pnode) //刪除一個(gè)指定的結(jié)點(diǎn),返回該結(jié)點(diǎn)的指針
{
if(pnode==pHead)
{
pHead=pnode->pNext;
pnode->pNext=0;
}
else
{
CNode *p=pHead;
while(p->pNext!=pnode)
p=p->pNext;
p->pNext=pnode->pNext;
pnode->pNext=0;
}
return(pnode);
}
CNode * CList::LookUp(CTelRecord &pitem)/*查找一個(gè)指定的數(shù)據(jù),返回該數(shù)據(jù)所在結(jié)點(diǎn)
在鏈表中的指針,若未找到返回0 */
{
CNode * pn=pHead;
while(pn)
{
if(pn->pData->Compare(pitem)) return pn;
pn=pn->pNext;
}
return 0;
}
void CList::ShowList() //打印整個(gè)鏈表
{
CNode * p=pHead;
while(p)
{
p->pData->Show();
p=p->pNext;
}
}
void CList::DeleteList() //刪除整個(gè)鏈表
{
CNode * p,* q;
p=pHead;
while(p)
{
delete p->pData;
q=p;
p=p->pNext;
delete q;
}
}
CNode * CList::GetListNextNode(CNode *pnode) //返回鏈表指定結(jié)點(diǎn)的下一個(gè)結(jié)點(diǎn)
{
return pnode->pNext;
}
void CList::Insert(CNode * pnode) //根據(jù)姓名的順序插入鏈表
{
CNode * p1,* p2;
if(pHead==0)
{
pHead=pnode;
pnode->pNext=0;
return;
}
if(strcmp(pHead->pData->GetName(),pnode->pData->GetName())>=0)
{
pnode->pNext=pHead;
pHead=pnode;
return;
}
p2=p1=pHead;
while(p2->pNext&&strcmp(p2->pData->GetName(),pnode->pData->GetName())<0)
{
p1=p2;
p2=p2->pNext;
}
if(strcmp(p2->pData->GetName(),pnode->pData->GetName())<0)
{
p2->pNext=pnode;
pnode->pNext=0;
}
else
{
pnode->pNext=p2;
p1->pNext=pnode;
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -