C++實(shí)現(xiàn)簡(jiǎn)單通訊錄管理系統(tǒng)
本文實(shí)例為大家分享了C++實(shí)現(xiàn)簡(jiǎn)單的通訊錄管理系統(tǒng)的具體代碼,供大家參考,具體內(nèi)容如下
一、代碼
#include <iostream> #include <string> #include <cstring> #include <fstream> using namespace std; //自定義一個(gè)聯(lián)系人結(jié)點(diǎn)類型 typedef struct node1 { ? ? string name; ? ? ? ?//姓名 ? ? string tel; ? ? ? ? //手機(jī)號(hào) ? ? string email; ? ? ? //郵箱 ? ? string address; ? ? //地址 ? ? struct node1 *next; //指向下一節(jié)點(diǎn)的指針 } Node; //自定義一個(gè)二叉排序樹(shù)結(jié)點(diǎn)類型 typedef struct node2 { ? ? Node data; ? ? struct node2 *lchild, *rchild; } BSTNode; //構(gòu)造結(jié)點(diǎn)通訊錄類 class Fnode { public: ? ? Fnode(); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//構(gòu)造函數(shù),用于初始化一些變量 ? ? ~Fnode(); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //析構(gòu)函數(shù),用于程序結(jié)束之后對(duì)分配的內(nèi)存進(jìn)行清理 ? ? void CreateInfo(); ? ? ? ? ? ? ? ? ? ? ?//錄入聯(lián)系人信息 ? ? void InsertInfo(); ? ? ? ? ? ? ? ? ? ? ?//插入聯(lián)系人信息 ? ? void FindInfoName(); ? ? ? ? ? ? ? ? ? ?//按姓名查找聯(lián)系人信息 ? ? void FindInfoTel(); ? ? ? ? ? ? ? ? ? ? //按手機(jī)號(hào)查找聯(lián)系人信息 ? ? void DeleteInfoTel(); ? ? ? ? ? ? ? ? ? //按手機(jī)號(hào)刪除聯(lián)系人信息 ? ? void DispInfo(); ? ? ? ? ? ? ? ? ? ? ? ?//打印所有聯(lián)系人信息 ? ? void DispInfoSort(); ? ? ? ? ? ? ? ? ? ?//按姓名排序輸出聯(lián)系人信息 ? ? void SaveInfoToFile(); ? ? ? ? ? ? ? ? ?//保存聯(lián)系人信息至文件 ? ? void ReadInfoFromFile(); ? ? ? ? ? ? ? ?//從文件讀取聯(lián)系人信息 ? ? void Run(); ? ? ? ? ? ? ? ? ? ? ? ? ? ? //功能函數(shù),包含菜單和相關(guān)函數(shù)的入口 ? ? bool InsertBST(BSTNode *&bt, Node key); //插入二叉排序樹(shù)結(jié)點(diǎn),遞歸實(shí)現(xiàn) ? ? void CreateBST(); ? ? ? ? ? ? ? ? ? ? ? //由鏈表創(chuàng)建二叉排序樹(shù) ? ? void InOrder(BSTNode *b); ? ? ? ? ? ? ? //中序遍歷輸出二叉排序樹(shù),遞歸實(shí)現(xiàn) ? ? void DestroyBST(BSTNode *&b); ? ? ? ? ? //釋放二叉排序樹(shù),遞歸實(shí)現(xiàn) private: ? ? bool opened; ? ? //用于表明文件是否被讀取過(guò),未讀為0,已讀為1 ? ? Node *L, *p, *q; //定義通訊錄結(jié)點(diǎn)的頭指針和其他成員函數(shù)中可能用到的指針 ? ? BSTNode *btree; ?//二叉排序樹(shù)頭節(jié)點(diǎn) }; //構(gòu)造函數(shù),用于初始化一些變量 Fnode::Fnode() { ? ? L = new Node; ? ? L->next = NULL; ? ? p = q = NULL; ? ? btree = NULL; ? ? opened = 0; } //析構(gòu)函數(shù),用于程序結(jié)束之后對(duì)分配的內(nèi)存進(jìn)行清理 Fnode::~Fnode() { ? ? p = L; ? ? while (p != NULL) ? ? { ? ? ? ? delete p; ? ? ? ? p = p->next; ? ? } } void Fnode::CreateInfo() //創(chuàng)建結(jié)點(diǎn) { ? ? int n; ? ? q = L, p = NULL; ? ? while (q->next != NULL) ? ? ? ? q = q->next; ? ? cout << "請(qǐng)輸入您要錄入的聯(lián)系人個(gè)數(shù):"; ? ? cin >> n; ? ? for (int i = 0; i < n; i++) ? ? { ? ? ? ? p = new Node; ? ? ? ? cout << "請(qǐng)輸入第" << i + 1 << "位聯(lián)系人的姓名、手機(jī)號(hào)、郵箱和地址(用空格隔開(kāi)):" << endl; ? ? ? ? cin >> p->name >> p->tel >> p->email >> p->address; ? ? ? ? p->next = q->next; ? ? ? ? q->next = p; ? ? ? ? q = p; ? ? } } //插入聯(lián)系人信息 void Fnode::InsertInfo() { ? ? q = L, p = NULL; ? ? while (q->next != NULL) ? ? ? ? q = q->next; ? ? p = new Node; ? ? cout << "請(qǐng)輸入您要插入的聯(lián)系人的姓名、手機(jī)號(hào)、郵箱和地址(用空格隔開(kāi)):" << endl; ? ? cin >> p->name >> p->tel >> p->email >> p->address; ? ? p->next = q->next; ? ? q->next = p; ? ? cout << "插入成功!" << endl; } //打印所有聯(lián)系人信息 void Fnode::DispInfo() { ? ? p = L->next; ? ? if (p == NULL) ? ? ? ? cout << "數(shù)據(jù)為空,無(wú)法打印" << endl; ? ? else ? ? { ? ? ? ? cout << "姓名 ?\t\t" ? ? ? ? ? ? ?<< "手機(jī)號(hào) ? ? ? \t\t" ? ? ? ? ? ? ?<< "郵箱 ? ? ? ? ? ? \t\t" ? ? ? ? ? ? ?<< "地址" << endl; ? ? ? ? while (p != NULL) ? ? ? ? { ? ? ? ? ? ? cout << p->name << "\t\t" << p->tel << "\t\t" << p->email << "\t\t" << p->address << endl; ? ? ? ? ? ? p = p->next; ? ? ? ? } ? ? } } //按姓名查找聯(lián)系人信息 void Fnode::FindInfoName() { ? ? string name; ? ? p = L->next; ? ? if (p == NULL) ? ? ? ? cout << "數(shù)據(jù)為空,無(wú)法查找" << endl; ? ? else ? ? { ? ? ? ? cout << "請(qǐng)輸入要查找的聯(lián)系人的姓名:"; ? ? ? ? cin >> name; ? ? ? ? while (p->name != name) ? ? ? ? { ? ? ? ? ? ? p = p->next; ? ? ? ? ? ? if (p == NULL) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? cout << "沒(méi)有找到相關(guān)聯(lián)系人信息" << endl; ? ? ? ? ? ? ? ? return; ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? cout << "該聯(lián)系人的信息如下" << endl; ? ? ? ? cout << "姓名 ?\t\t" ? ? ? ? ? ? ?<< "手機(jī)號(hào) ? ? ? \t\t" ? ? ? ? ? ? ?<< "郵箱 ? ? ? ? ? ? \t\t" ? ? ? ? ? ? ?<< "地址" << endl; ? ? ? ? cout << p->name << "\t\t" << p->tel << "\t\t" << p->email << "\t\t" << p->address << endl; ? ? } } //按手機(jī)號(hào)查找聯(lián)系人信息 void Fnode::FindInfoTel() { ? ? string tel; ? ? p = L->next; ? ? if (p == NULL) ? ? ? ? cout << "數(shù)據(jù)為空,無(wú)法查找" << endl; ? ? else ? ? { ? ? ? ? cout << "請(qǐng)輸入要查找的聯(lián)系人的手機(jī)號(hào):"; ? ? ? ? cin >> tel; ? ? ? ? while (p->tel != tel) ? ? ? ? { ? ? ? ? ? ? p = p->next; ? ? ? ? ? ? if (p == NULL) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? cout << "沒(méi)有找到相關(guān)信息" << endl; ? ? ? ? ? ? ? ? return; ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? cout << "該聯(lián)系人的信息如下" << endl; ? ? ? ? cout << "姓名 ?\t\t" ? ? ? ? ? ? ?<< "手機(jī)號(hào) ? ? ? \t\t" ? ? ? ? ? ? ?<< "郵箱 ? ? ? ? ? ? \t\t" ? ? ? ? ? ? ?<< "地址" << endl; ? ? ? ? cout << p->name << "\t\t" << p->tel << "\t\t" << p->email << "\t\t" << p->address << endl; ? ? } } //按手機(jī)號(hào)刪除聯(lián)系人信息 void Fnode::DeleteInfoTel() { ? ? string tel; ? ? p = L->next, q = L; ? ? if (p == NULL) ? ? ? ? cout << "數(shù)據(jù)為空,無(wú)法刪除" << endl; ? ? else ? ? { ? ? ? ? cout << "請(qǐng)輸入要?jiǎng)h除的聯(lián)系人的手機(jī)號(hào)" << endl; ? ? ? ? cin >> tel; ? ? ? ? while (p->tel != tel) ? ? ? ? { ? ? ? ? ? ? p = p->next; ? ? ? ? ? ? q = q->next; ? ? ? ? ? ? if (p == NULL) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? cout << "沒(méi)有找到相關(guān)信息" << endl; ? ? ? ? ? ? ? ? return; ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? q->next = p->next; ? ? ? ? delete p; ? ? ? ? cout << "手機(jī)號(hào)為" << tel << "的聯(lián)系人刪除成功!" << endl; ? ? } } //按姓名排序輸出聯(lián)系人信息 void Fnode::DispInfoSort() { ? ? CreateBST(); ? ? cout << "姓名 ?\t\t" ? ? ? ? ?<< "手機(jī)號(hào) ? ? ? \t\t" ? ? ? ? ?<< "郵箱 ? ? ? ? ? ? \t\t" ? ? ? ? ?<< "地址" << endl; ? ? InOrder(btree); ? ? DestroyBST(btree); } //保存聯(lián)系人信息至文件 void Fnode::SaveInfoToFile() { ? ? p = L->next; ? ? if (p == NULL) ? ? ? ? cout << "數(shù)據(jù)為空,無(wú)法寫入!" << endl; ? ? else ? ? { ? ? ? ? ofstream outfile("./聯(lián)系人.csv"); ? ? ? ? if (!outfile) ? ? ? ? { ? ? ? ? ? ? cout << "無(wú)法打開(kāi)文件!"; ? ? ? ? ? ? return; ? ? ? ? } ? ? ? ? outfile << "姓名," ? ? ? ? ? ? ? ? << "手機(jī)號(hào)," ? ? ? ? ? ? ? ? << "郵箱," ? ? ? ? ? ? ? ? << "地址" << endl; ? ? ? ? while (p->next != NULL) ? ? ? ? { ? ? ? ? ? ? outfile << p->name << "," << p->tel << "," << p->email << "," << p->address << endl; ? ? ? ? ? ? p = p->next; ? ? ? ? } ? ? ? ? outfile << p->name << "," << p->tel << "," << p->email << "," << p->address; ? ? ? ? outfile.close(); ? ? ? ? cout << "保存聯(lián)系人信息成功!請(qǐng)查看當(dāng)前目錄下的“聯(lián)系人.csv文件”" << endl; ? ? } } //從文件讀取聯(lián)系人信息 void Fnode::ReadInfoFromFile() { ? ? ifstream infile("./聯(lián)系人.csv"); ? ? if (!infile) ? ? { ? ? ? ? cout << "無(wú)法打開(kāi)文件!"; ? ? ? ? return; ? ? } ? ? else if (opened == 1) ? ? { ? ? ? ? cout << "文件已經(jīng)被讀取,不能夠重復(fù)讀取!" << endl; ? ? ? ? return; ? ? } ? ? else ? ? { ? ? ? ? char str[500]; ? ? ? ? q = L, p = NULL; ? ? ? ? while (q->next != NULL) ? ? ? ? ? ? q = q->next; ? ? ? ? infile.getline(str, sizeof(str)); ? ? ? ? while (!infile.eof()) ? ? ? ? { ? ? ? ? ? ? p = new Node; ? ? ? ? ? ? infile.getline(str, sizeof(str)); ? ? ? ? ? ? p->name = strtok(str, ","); ? ? ? ? ? ? p->tel = strtok(NULL, ","); ? ? ? ? ? ? p->email = strtok(NULL, ","); ? ? ? ? ? ? p->address = strtok(NULL, ","); ? ? ? ? ? ? p->next = q->next; ? ? ? ? ? ? q->next = p; ? ? ? ? ? ? q = p; ? ? ? ? } ? ? ? ? infile.close(); ? ? ? ? cout << "讀取數(shù)據(jù)成功!" << endl; ? ? ? ? opened = 1; ? ? } } //插入二叉排序樹(shù)結(jié)點(diǎn) bool Fnode::InsertBST(BSTNode *&bt, Node key) { ? ? if (bt == NULL) ? ? { ? ? ? ? bt = new BSTNode; ? ? ? ? bt->data = key; ? ? ? ? bt->lchild = bt->rchild = NULL; ? ? ? ? return true; ? ? } ? ? else if (key.name == bt->data.name) ? ? ? ? return false; ? ? else if (key.name < bt->data.name) ? ? ? ? return InsertBST(bt->lchild, key); ? ? else ? ? ? ? return InsertBST(bt->rchild, key); } //由鏈表創(chuàng)建二叉排序樹(shù) void Fnode::CreateBST() { ? ? btree = NULL; ? ? p = L->next; ? ? while (p != NULL) ? ? { ? ? ? ? InsertBST(btree, *p); ? ? ? ? p = p->next; ? ? } } //中序遍歷輸出二叉排序樹(shù) void Fnode::InOrder(BSTNode *b) { ? ? if (b != NULL) ? ? { ? ? ? ? InOrder(b->lchild); ? ? ? ? cout << b->data.name << "\t\t" << b->data.tel << "\t\t" << b->data.email << "\t\t" << b->data.address << endl; ? ? ? ? InOrder(b->rchild); ? ? } } //釋放二叉排序樹(shù) void Fnode::DestroyBST(BSTNode *&b) { ? ? if (b != NULL) ? ? { ? ? ? ? DestroyBST(b->lchild); ? ? ? ? DestroyBST(b->rchild); ? ? ? ? delete b; ? ? } } //菜單 void Fnode::Run() { ? ? int item; ? ? do ? ? { ? ? ? ? cout << "\t\t\t==================通訊錄管理系統(tǒng)==================" << endl; ? ? ? ? cout << "\t\t\t# \t ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #" << endl; ? ? ? ? cout << "\t\t\t# \t1)聯(lián)系人信息的逐條錄入。 ? ? ? ? ? ? ? ? #" << endl; ? ? ? ? cout << "\t\t\t# \t2)插入某個(gè)聯(lián)系人的信息。 ? ? ? ? ? ? ? ? #" << endl; ? ? ? ? cout << "\t\t\t# \t3)按手機(jī)號(hào)查找某個(gè)聯(lián)系人的信。 ? ? ? ? ? #" << endl; ? ? ? ? cout << "\t\t\t# \t4)按姓名查詢某個(gè)聯(lián)系人。 ? ? ? ? ? ? ? ? #" << endl; ? ? ? ? cout << "\t\t\t# \t5)按手機(jī)號(hào)刪除某個(gè)聯(lián)系人的信息 ? ? ? ? ? #" << endl; ? ? ? ? cout << "\t\t\t# \t6)所有聯(lián)系人信息的輸出顯示。 ? ? ? ? ? ? #" << endl; ? ? ? ? cout << "\t\t\t# \t7)所有聯(lián)系人按姓名排序并輸出顯示。 ? ? ? #" << endl; ? ? ? ? cout << "\t\t\t# \t8)所有聯(lián)系人信息的文件保存。 ? ? ? ? ? ? #" << endl; ? ? ? ? cout << "\t\t\t# \t9)所有聯(lián)系人信息的文件讀取。 ? ? ? ? ? ? #" << endl; ? ? ? ? cout << "\t\t\t# \t0)退出管理系統(tǒng)。 ? ? ? ? ? ? ? ? ? ? ? ? #" << endl; ? ? ? ? cout << "\t\t\t==================================================" << endl; ? ? ? ? cout << "請(qǐng)輸入相應(yīng)的命令,執(zhí)行相應(yīng)的功能:"; ? ? ? ? cin >> item; ? ? ? ? system("cls"); ? ? ? ? switch (item) ? ? ? ? { ? ? ? ? case 1: ? ? ? ? ? ? CreateInfo(); ? ? ? ? ? ? getchar(); ? ? ? ? ? ? cout << "\n按任意鍵返回主菜單" << endl; ? ? ? ? ? ? getchar(); ? ? ? ? ? ? system("cls"); ? ? ? ? ? ? break; ? ? ? ? case 2: ? ? ? ? ? ? InsertInfo(); ? ? ? ? ? ? getchar(); ? ? ? ? ? ? cout << "\n按任意鍵返回主菜單" << endl; ? ? ? ? ? ? getchar(); ? ? ? ? ? ? system("cls"); ? ? ? ? ? ? break; ? ? ? ? case 3: ? ? ? ? ? ? FindInfoTel(); ? ? ? ? ? ? getchar(); ? ? ? ? ? ? cout << "\n按任意鍵返回主菜單" << endl; ? ? ? ? ? ? getchar(); ? ? ? ? ? ? system("cls"); ? ? ? ? ? ? break; ? ? ? ? case 4: ? ? ? ? ? ? FindInfoName(); ? ? ? ? ? ? getchar(); ? ? ? ? ? ? cout << "\n按任意鍵返回主菜單" << endl; ? ? ? ? ? ? getchar(); ? ? ? ? ? ? system("cls"); ? ? ? ? ? ? break; ? ? ? ? case 5: ? ? ? ? ? ? DeleteInfoTel(); ? ? ? ? ? ? getchar(); ? ? ? ? ? ? cout << "\n按任意鍵返回主菜單" << endl; ? ? ? ? ? ? getchar(); ? ? ? ? ? ? system("cls"); ? ? ? ? ? ? break; ? ? ? ? case 6: ? ? ? ? ? ? DispInfo(); ? ? ? ? ? ? getchar(); ? ? ? ? ? ? cout << "\n按任意鍵返回主菜單" << endl; ? ? ? ? ? ? getchar(); ? ? ? ? ? ? system("cls"); ? ? ? ? ? ? break; ? ? ? ? case 7: ? ? ? ? ? ? DispInfoSort(); ? ? ? ? ? ? getchar(); ? ? ? ? ? ? cout << "\n按任意鍵返回主菜單" << endl; ? ? ? ? ? ? getchar(); ? ? ? ? ? ? system("cls"); ? ? ? ? ? ? break; ? ? ? ? case 8: ? ? ? ? ? ? SaveInfoToFile(); ? ? ? ? ? ? getchar(); ? ? ? ? ? ? cout << "\n按任意鍵返回主菜單" << endl; ? ? ? ? ? ? getchar(); ? ? ? ? ? ? system("cls"); ? ? ? ? ? ? break; ? ? ? ? case 9: ? ? ? ? ? ? ReadInfoFromFile(); ? ? ? ? ? ? getchar(); ? ? ? ? ? ? cout << "\n按任意鍵返回主菜單" << endl; ? ? ? ? ? ? getchar(); ? ? ? ? ? ? system("cls"); ? ? ? ? ? ? break; ? ? ? ? case 0: ? ? ? ? ? ? cout << "即將退出通訊錄管理系統(tǒng)......" << endl; ? ? ? ? ? ? cout << "謝謝您的使用!"; ? ? ? ? ? ? exit(0); ? ? ? ? ? ? break; ? ? ? ? default: ? ? ? ? ? ? cout << "您輸入的指令錯(cuò)誤,請(qǐng)重新輸入!" << endl; ? ? ? ? ? ? getchar(); ? ? ? ? ? ? cout << "\n按任意鍵返回主菜單" << endl; ? ? ? ? ? ? getchar(); ? ? ? ? ? ? system("cls"); ? ? ? ? } ? ? } while (item); } //主函數(shù) int main() { ? ? Fnode f; ? ? system("cls"); ? ? f.Run(); ? ? return 0; }
二、功能展示
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- C++實(shí)現(xiàn)通訊錄管理系統(tǒng)
- C++實(shí)現(xiàn)簡(jiǎn)單通訊錄
- C++鏈表實(shí)現(xiàn)通訊錄管理系統(tǒng)
- C++雙向鏈表實(shí)現(xiàn)簡(jiǎn)單通訊錄
- C++實(shí)現(xiàn)鏈表版本通訊錄
- C++ 實(shí)現(xiàn)的通訊錄管理系統(tǒng)詳解
- C++實(shí)現(xiàn)簡(jiǎn)易通訊錄
- C++容器vector實(shí)現(xiàn)通訊錄功能
- C++簡(jiǎn)易通訊錄系統(tǒng)實(shí)現(xiàn)流程詳解
- C++實(shí)現(xiàn)簡(jiǎn)單通訊錄系統(tǒng)
相關(guān)文章
C語(yǔ)言通過(guò)gets和gets_s分別實(shí)現(xiàn)讀取含空格的字符串
在遇到包含空格的字符串輸入時(shí)該如何讀取呢?如果使用scanf以%s格式去讀取輸入的字符串,遇到空格就讀取結(jié)束了,顯然這樣是讀取不了的。本文就將介紹兩個(gè)可以對(duì)含空格字符串讀取的庫(kù)函數(shù)------gets和gets_s函數(shù),感興趣的可以了解一下2021-12-12利用Matlab復(fù)刻兩款粒子愛(ài)心動(dòng)畫效果
最近電視劇《點(diǎn)燃我,溫暖你》大火,蹭一下熱度,發(fā)一下MATLAB畫愛(ài)心的代碼,寫的比較隨意,大家可以自行調(diào)整粒子大小和顏色啥的2022-11-11C++中智能指針最常用的shared_ptr和unique_ptr
C++中的智能指針最常用的是shared_ptr和unique_ptr,C++新手最常問(wèn)的問(wèn)題是我從一個(gè)函數(shù)中拿到unique_ptr,但要轉(zhuǎn)成shared_ptr才能使用,要怎么轉(zhuǎn)換?同理是否能將shared_ptr轉(zhuǎn)換成unique_ptr,面對(duì)這些問(wèn)題,跟隨小編一起看看吧2022-08-08C語(yǔ)言之結(jié)構(gòu)體定義 typedef struct 用法詳解和用法小結(jié)
這篇文章主要介紹了C語(yǔ)言的結(jié)構(gòu)體定義typedef struct用法詳解和用法小結(jié),typedef是類型定義,typedef struct 是為了使用這個(gè)結(jié)構(gòu)體方便,感興趣的同學(xué)可以參考閱讀2023-03-03利用C語(yǔ)言實(shí)現(xiàn)猜數(shù)字游戲
這篇文章主要為大家詳細(xì)介紹了利用C語(yǔ)言實(shí)現(xiàn)猜數(shù)字游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-02-02C++設(shè)計(jì)模式之享元模式(Flyweight)
這篇文章主要為大家詳細(xì)介紹了C++設(shè)計(jì)模式之享元模式Flyweight,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04C++動(dòng)態(tài)規(guī)劃實(shí)現(xiàn)查找最長(zhǎng)公共子序列
這篇文章主要介紹了C++動(dòng)態(tài)規(guī)劃最長(zhǎng)公共子序列,在動(dòng)態(tài)規(guī)劃中,你要將某個(gè)指標(biāo)最大化。在這個(gè)例子中,你要找出最長(zhǎng)公共子序列2022-06-06