欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++實現簡單通訊錄管理系統(tǒng)

 更新時間:2022年02月27日 10:19:29   作者:xjfyt  
這篇文章主要為大家詳細介紹了C++實現簡單通訊錄管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了C++實現簡單的通訊錄管理系統(tǒng)的具體代碼,供大家參考,具體內容如下

一、代碼

#include <iostream>
#include <string>
#include <cstring>
#include <fstream>
using namespace std;

//自定義一個聯系人結點類型
typedef struct node1
{
? ? string name; ? ? ? ?//姓名
? ? string tel; ? ? ? ? //手機號
? ? string email; ? ? ? //郵箱
? ? string address; ? ? //地址
? ? struct node1 *next; //指向下一節(jié)點的指針
} Node;

//自定義一個二叉排序樹結點類型
typedef struct node2
{
? ? Node data;
? ? struct node2 *lchild, *rchild;
} BSTNode;

//構造結點通訊錄類
class Fnode
{
public:
? ? Fnode(); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//構造函數,用于初始化一些變量
? ? ~Fnode(); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //析構函數,用于程序結束之后對分配的內存進行清理
? ? void CreateInfo(); ? ? ? ? ? ? ? ? ? ? ?//錄入聯系人信息
? ? void InsertInfo(); ? ? ? ? ? ? ? ? ? ? ?//插入聯系人信息
? ? void FindInfoName(); ? ? ? ? ? ? ? ? ? ?//按姓名查找聯系人信息
? ? void FindInfoTel(); ? ? ? ? ? ? ? ? ? ? //按手機號查找聯系人信息
? ? void DeleteInfoTel(); ? ? ? ? ? ? ? ? ? //按手機號刪除聯系人信息
? ? void DispInfo(); ? ? ? ? ? ? ? ? ? ? ? ?//打印所有聯系人信息
? ? void DispInfoSort(); ? ? ? ? ? ? ? ? ? ?//按姓名排序輸出聯系人信息
? ? void SaveInfoToFile(); ? ? ? ? ? ? ? ? ?//保存聯系人信息至文件
? ? void ReadInfoFromFile(); ? ? ? ? ? ? ? ?//從文件讀取聯系人信息
? ? void Run(); ? ? ? ? ? ? ? ? ? ? ? ? ? ? //功能函數,包含菜單和相關函數的入口
? ? bool InsertBST(BSTNode *&bt, Node key); //插入二叉排序樹結點,遞歸實現
? ? void CreateBST(); ? ? ? ? ? ? ? ? ? ? ? //由鏈表創(chuàng)建二叉排序樹
? ? void InOrder(BSTNode *b); ? ? ? ? ? ? ? //中序遍歷輸出二叉排序樹,遞歸實現
? ? void DestroyBST(BSTNode *&b); ? ? ? ? ? //釋放二叉排序樹,遞歸實現

private:
? ? bool opened; ? ? //用于表明文件是否被讀取過,未讀為0,已讀為1
? ? Node *L, *p, *q; //定義通訊錄結點的頭指針和其他成員函數中可能用到的指針
? ? BSTNode *btree; ?//二叉排序樹頭節(jié)點
};

//構造函數,用于初始化一些變量
Fnode::Fnode()
{
? ? L = new Node;
? ? L->next = NULL;
? ? p = q = NULL;
? ? btree = NULL;
? ? opened = 0;
}

//析構函數,用于程序結束之后對分配的內存進行清理
Fnode::~Fnode()
{
? ? p = L;
? ? while (p != NULL)
? ? {
? ? ? ? delete p;
? ? ? ? p = p->next;
? ? }
}

void Fnode::CreateInfo() //創(chuàng)建結點
{
? ? int n;
? ? q = L, p = NULL;
? ? while (q->next != NULL)
? ? ? ? q = q->next;
? ? cout << "請輸入您要錄入的聯系人個數:";
? ? cin >> n;
? ? for (int i = 0; i < n; i++)
? ? {
? ? ? ? p = new Node;
? ? ? ? cout << "請輸入第" << i + 1 << "位聯系人的姓名、手機號、郵箱和地址(用空格隔開):" << endl;
? ? ? ? cin >> p->name >> p->tel >> p->email >> p->address;
? ? ? ? p->next = q->next;
? ? ? ? q->next = p;
? ? ? ? q = p;
? ? }
}

//插入聯系人信息
void Fnode::InsertInfo()
{
? ? q = L, p = NULL;
? ? while (q->next != NULL)
? ? ? ? q = q->next;
? ? p = new Node;
? ? cout << "請輸入您要插入的聯系人的姓名、手機號、郵箱和地址(用空格隔開):" << endl;
? ? cin >> p->name >> p->tel >> p->email >> p->address;
? ? p->next = q->next;
? ? q->next = p;
? ? cout << "插入成功!" << endl;
}

//打印所有聯系人信息
void Fnode::DispInfo()
{
? ? p = L->next;
? ? if (p == NULL)
? ? ? ? cout << "數據為空,無法打印" << endl;
? ? else
? ? {
? ? ? ? cout << "姓名 ?\t\t"
? ? ? ? ? ? ?<< "手機號 ? ? ? \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;
? ? ? ? }
? ? }
}

//按姓名查找聯系人信息
void Fnode::FindInfoName()
{
? ? string name;
? ? p = L->next;
? ? if (p == NULL)
? ? ? ? cout << "數據為空,無法查找" << endl;
? ? else
? ? {
? ? ? ? cout << "請輸入要查找的聯系人的姓名:";
? ? ? ? cin >> name;
? ? ? ? while (p->name != name)
? ? ? ? {
? ? ? ? ? ? p = p->next;
? ? ? ? ? ? if (p == NULL)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? cout << "沒有找到相關聯系人信息" << endl;
? ? ? ? ? ? ? ? return;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? cout << "該聯系人的信息如下" << endl;
? ? ? ? cout << "姓名 ?\t\t"
? ? ? ? ? ? ?<< "手機號 ? ? ? \t\t"
? ? ? ? ? ? ?<< "郵箱 ? ? ? ? ? ? \t\t"
? ? ? ? ? ? ?<< "地址" << endl;
? ? ? ? cout << p->name << "\t\t" << p->tel << "\t\t" << p->email << "\t\t" << p->address << endl;
? ? }
}

//按手機號查找聯系人信息
void Fnode::FindInfoTel()
{
? ? string tel;
? ? p = L->next;
? ? if (p == NULL)
? ? ? ? cout << "數據為空,無法查找" << endl;
? ? else
? ? {
? ? ? ? cout << "請輸入要查找的聯系人的手機號:";
? ? ? ? cin >> tel;
? ? ? ? while (p->tel != tel)
? ? ? ? {
? ? ? ? ? ? p = p->next;
? ? ? ? ? ? if (p == NULL)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? cout << "沒有找到相關信息" << endl;
? ? ? ? ? ? ? ? return;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? cout << "該聯系人的信息如下" << endl;
? ? ? ? cout << "姓名 ?\t\t"
? ? ? ? ? ? ?<< "手機號 ? ? ? \t\t"
? ? ? ? ? ? ?<< "郵箱 ? ? ? ? ? ? \t\t"
? ? ? ? ? ? ?<< "地址" << endl;
? ? ? ? cout << p->name << "\t\t" << p->tel << "\t\t" << p->email << "\t\t" << p->address << endl;
? ? }
}

//按手機號刪除聯系人信息
void Fnode::DeleteInfoTel()
{
? ? string tel;
? ? p = L->next, q = L;
? ? if (p == NULL)
? ? ? ? cout << "數據為空,無法刪除" << endl;
? ? else
? ? {
? ? ? ? cout << "請輸入要刪除的聯系人的手機號" << endl;
? ? ? ? cin >> tel;
? ? ? ? while (p->tel != tel)
? ? ? ? {
? ? ? ? ? ? p = p->next;
? ? ? ? ? ? q = q->next;
? ? ? ? ? ? if (p == NULL)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? cout << "沒有找到相關信息" << endl;
? ? ? ? ? ? ? ? return;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? q->next = p->next;
? ? ? ? delete p;
? ? ? ? cout << "手機號為" << tel << "的聯系人刪除成功!" << endl;
? ? }
}

//按姓名排序輸出聯系人信息
void Fnode::DispInfoSort()
{
? ? CreateBST();
? ? cout << "姓名 ?\t\t"
? ? ? ? ?<< "手機號 ? ? ? \t\t"
? ? ? ? ?<< "郵箱 ? ? ? ? ? ? \t\t"
? ? ? ? ?<< "地址" << endl;
? ? InOrder(btree);
? ? DestroyBST(btree);
}

//保存聯系人信息至文件
void Fnode::SaveInfoToFile()
{
? ? p = L->next;
? ? if (p == NULL)
? ? ? ? cout << "數據為空,無法寫入!" << endl;
? ? else
? ? {
? ? ? ? ofstream outfile("./聯系人.csv");
? ? ? ? if (!outfile)
? ? ? ? {
? ? ? ? ? ? cout << "無法打開文件!";
? ? ? ? ? ? return;
? ? ? ? }
? ? ? ? outfile << "姓名,"
? ? ? ? ? ? ? ? << "手機號,"
? ? ? ? ? ? ? ? << "郵箱,"
? ? ? ? ? ? ? ? << "地址" << 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 << "保存聯系人信息成功!請查看當前目錄下的“聯系人.csv文件”" << endl;
? ? }
}

//從文件讀取聯系人信息
void Fnode::ReadInfoFromFile()
{
? ? ifstream infile("./聯系人.csv");
? ? if (!infile)
? ? {
? ? ? ? cout << "無法打開文件!";
? ? ? ? return;
? ? }
? ? else if (opened == 1)
? ? {
? ? ? ? cout << "文件已經被讀取,不能夠重復讀取!" << 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 << "讀取數據成功!" << endl;
? ? ? ? opened = 1;
? ? }
}

//插入二叉排序樹結點
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)建二叉排序樹
void Fnode::CreateBST()
{
? ? btree = NULL;
? ? p = L->next;
? ? while (p != NULL)
? ? {
? ? ? ? InsertBST(btree, *p);
? ? ? ? p = p->next;
? ? }
}

//中序遍歷輸出二叉排序樹
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);
? ? }
}

//釋放二叉排序樹
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)聯系人信息的逐條錄入。 ? ? ? ? ? ? ? ? #" << endl;
? ? ? ? cout << "\t\t\t# \t2)插入某個聯系人的信息。 ? ? ? ? ? ? ? ? #" << endl;
? ? ? ? cout << "\t\t\t# \t3)按手機號查找某個聯系人的信。 ? ? ? ? ? #" << endl;
? ? ? ? cout << "\t\t\t# \t4)按姓名查詢某個聯系人。 ? ? ? ? ? ? ? ? #" << endl;
? ? ? ? cout << "\t\t\t# \t5)按手機號刪除某個聯系人的信息 ? ? ? ? ? #" << endl;
? ? ? ? cout << "\t\t\t# \t6)所有聯系人信息的輸出顯示。 ? ? ? ? ? ? #" << endl;
? ? ? ? cout << "\t\t\t# \t7)所有聯系人按姓名排序并輸出顯示。 ? ? ? #" << endl;
? ? ? ? cout << "\t\t\t# \t8)所有聯系人信息的文件保存。 ? ? ? ? ? ? #" << endl;
? ? ? ? cout << "\t\t\t# \t9)所有聯系人信息的文件讀取。 ? ? ? ? ? ? #" << endl;
? ? ? ? cout << "\t\t\t# \t0)退出管理系統(tǒng)。 ? ? ? ? ? ? ? ? ? ? ? ? #" << endl;
? ? ? ? cout << "\t\t\t==================================================" << endl;
? ? ? ? cout << "請輸入相應的命令,執(zhí)行相應的功能:";
? ? ? ? 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 << "您輸入的指令錯誤,請重新輸入!" << endl;
? ? ? ? ? ? getchar();
? ? ? ? ? ? cout << "\n按任意鍵返回主菜單" << endl;
? ? ? ? ? ? getchar();
? ? ? ? ? ? system("cls");
? ? ? ? }
? ? } while (item);
}

//主函數
int main()
{
? ? Fnode f;
? ? system("cls");
? ? f.Run();
? ? return 0;
}

二、功能展示

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • C語言通過gets和gets_s分別實現讀取含空格的字符串

    C語言通過gets和gets_s分別實現讀取含空格的字符串

    在遇到包含空格的字符串輸入時該如何讀取呢?如果使用scanf以%s格式去讀取輸入的字符串,遇到空格就讀取結束了,顯然這樣是讀取不了的。本文就將介紹兩個可以對含空格字符串讀取的庫函數------gets和gets_s函數,感興趣的可以了解一下
    2021-12-12
  • 利用Matlab復刻兩款粒子愛心動畫效果

    利用Matlab復刻兩款粒子愛心動畫效果

    最近電視劇《點燃我,溫暖你》大火,蹭一下熱度,發(fā)一下MATLAB畫愛心的代碼,寫的比較隨意,大家可以自行調整粒子大小和顏色啥的
    2022-11-11
  • C++中智能指針最常用的shared_ptr和unique_ptr

    C++中智能指針最常用的shared_ptr和unique_ptr

    C++中的智能指針最常用的是shared_ptr和unique_ptr,C++新手最常問的問題是我從一個函數中拿到unique_ptr,但要轉成shared_ptr才能使用,要怎么轉換?同理是否能將shared_ptr轉換成unique_ptr,面對這些問題,跟隨小編一起看看吧
    2022-08-08
  • C語言之結構體定義 typedef struct 用法詳解和用法小結

    C語言之結構體定義 typedef struct 用法詳解和用法小結

    這篇文章主要介紹了C語言的結構體定義typedef struct用法詳解和用法小結,typedef是類型定義,typedef struct 是為了使用這個結構體方便,感興趣的同學可以參考閱讀
    2023-03-03
  • 利用C語言實現猜數字游戲

    利用C語言實現猜數字游戲

    這篇文章主要為大家詳細介紹了利用C語言實現猜數字游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-02-02
  • C語言的strcpy函數你了解嗎

    C語言的strcpy函數你了解嗎

    這篇文章主要為大家詳細介紹了C語言的strcpy函數,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • VC中使用GDI+的配置方法概述

    VC中使用GDI+的配置方法概述

    這篇文章主要介紹了VC中使用GDI+的配置方法,需要的朋友可以參考下
    2014-07-07
  • C++設計模式之享元模式(Flyweight)

    C++設計模式之享元模式(Flyweight)

    這篇文章主要為大家詳細介紹了C++設計模式之享元模式Flyweight,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • C++代碼實現雙向鏈表

    C++代碼實現雙向鏈表

    這篇文章主要為大家詳細介紹了C++代碼實現雙向鏈表,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C++動態(tài)規(guī)劃實現查找最長公共子序列

    C++動態(tài)規(guī)劃實現查找最長公共子序列

    這篇文章主要介紹了C++動態(tài)規(guī)劃最長公共子序列,在動態(tài)規(guī)劃中,你要將某個指標最大化。在這個例子中,你要找出最長公共子序列
    2022-06-06

最新評論