栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++通讯录管理系统

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++通讯录管理系统

基于带头节点的单链表和C++语言写的一个简易通讯录管理系统,包含文件读取、文件保存、联系人添加、联系人删除、联系人查询、联系人修改、通讯录输出、通讯录排序、通讯录清空等功能。

部分界面效果: 主菜单:

添加联系人:

通讯录输出:

联系人查询:

文件保存:

源代码:
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;


typedef struct {
	int num;		 //编号
	string name;     //姓名
	string phonenum; //电话
	string address;  //地址
	string relation; //分组
}ElemType;


typedef struct Node {
	ElemType data;
	struct Node* next;
}Node, * linkList;


void Read_linkList(linkList& L);                         //读取信息
void Save_linkList(const linkList& L);                   //保存信息
void Init_linkList(linkList& L);                         //初始化通讯录链表
void Create_linkList(linkList& L);                       //添加联系人
void Delete_linkList(linkList& L);                       //删除联系人
void Query_linkList(const linkList& L);                  //查询联系人
void Modify_linkList(linkList& L);                       //修改联系人
void Print_linkList(const linkList& L);                  //通讯录显示
bool compare(const ElemType& t1, const ElemType& t2);    //定义sort函数的关系
void Sort_linkList(linkList& L);                         //通讯录排序
void Clear_linkList(linkList& L);                        //通讯录清空
void menu(linkList& L);                                  //主控菜单


int main()
{
	system("color 70");
	linkList L;
	Init_linkList(L);
	Read_linkList(L);
	menu(L);
	return 0;
}


void Read_linkList(linkList& L)
{
	Node* p = L;
	ifstream infile("contact.txt", ios::in);
	int len = 0;
	infile >> len;
	ElemType tem;
	while (len--)
	{
		infile >> tem.num >> tem.name >> tem.phonenum >> tem.address >> tem.relation;
		Node* t = new Node;
		t->data = tem;
		t->next = NULL;
		p->next = t;
		p = p->next;
	}
	infile.close();
}


void Save_linkList(linkList& L)
{
	Node* t = L, * cnt = L;
	ofstream outfile("contact.txt", ios::out);
	int len = 0;
	while (cnt->next)
	{
		len++;
		cnt = cnt->next;
	}
	outfile << len << endl;
	while (t)
	{
		if (t != L)
			outfile << t->data.num << "t" << t->data.name << "t" << t->data.phonenum << "t" << t->data.address << "t" << t->data.relation << endl;
		t = t->next;
	}
	outfile.close();
}


void Init_linkList(linkList& L)
{
	L = new Node;
	L->next = NULL;
}


void Create_linkList(linkList& L)
{
	system("cls");
	cout << "ttt**************欢迎来到添加联系人功能***************" << endl;
	Node* t = L;
	int i = 1, flag = 1;
	while (t->next)
	{
		i++;
		t = t->next;
	}
	while (flag)
	{
		Node* p = new Node;
		cout << "ttt输入姓名:";
		cin >> p->data.name;
		cout << "ttt输入电话:";
		cin >> p->data.phonenum;
		cout << "ttt输入地址:";
		cin >> p->data.address;
		cout << "ttt输入分组:";
		cin >> p->data.relation;
		p->data.num = i++;
		p->next = NULL;
		t->next = p;
		t = t->next;
		Save_linkList(L); //将改动保存至文件中
		cout << "ttt添加成功!是否继续添加?(1 是 0 否)" << endl;
		cout << "ttt请选择【0-1】:";
		cin >> flag;
	}
}


void Delete_linkList(linkList& L)
{
	system("cls");
	cout << "ttt**************欢迎来到删除联系人功能***************" << endl;
	int sel = 0;
	Node* p = L, * t = NULL;
	ElemType tem;
	cout << "ttt-----------------" << endl;
	cout << "ttt1 按编号删除" << endl;
	cout << "ttt2 按姓名删除" << endl;
	cout << "ttt3 返回主菜单" << endl;
	cout << "ttt-----------------" << endl;
	cout << "ttt请选择【1-3】:";
	cin >> sel;
	while (sel < 1 || sel>3)
	{
		cout << "ttt输入不合法,请重新选择【1-3】:";
		cin >> sel;
	}
	if (sel == 1)
	{
		int flag = 0;
		cout << "ttt请输入待删除联系人的编号:";
		cin >> tem.num;
		while (p->next)
		{
			t = p->next;
			if (t->data.num == tem.num)
			{
				cout << "ttt待删除联系人信息如下:" << endl;
				cout << "ttt编号t" << "姓名t" << "联系电话t" << "家庭地址t" << "分组" << endl;
				cout << "ttt" << t->data.num << "t" << t->data.name << "t" << t->data.phonenum << "t" << t->data.address << "t" << t->data.relation << endl;
				flag = 1;
				break;
			}
			p = p->next;
		}
		if (flag == 0) cout << "ttt查无此人,无法删除!" << endl;
		else
		{
			cout << "ttt确认删除?(1 是 0 否)" << endl;
			cout << "ttt请选择【0-1】:";
			cin >> sel;
			while (sel < 0 || sel>1)
			{
				cout << "ttt输入不合法,请重新选择【0-1】:";
				cin >> sel;
			}
			if (sel == 0);
			else if (sel == 1)
			{
				p->next = t->next;
				delete t;
				cout << "ttt删除成功!" << endl;
				Save_linkList(L); //改动保存至文件中
			}
		}
		cout << "nttt";
		system("pause");
		Delete_linkList(L);
	}
	else if (sel == 2)
	{
		int flag = 0;
		cout << "ttt请输入待删除联系人的姓名:";
		cin >> tem.name;
		while (p->next)
		{
			t = p->next;
			if (t->data.name == tem.name)
			{
				cout << "ttt待删除联系人信息如下:" << endl;
				cout << "ttt序号t" << "姓名t" << "联系电话t" << "家庭地址t" << "分组" << endl;
				cout << "ttt" << t->data.num << "t" << t->data.name << "t" << t->data.phonenum << "t" << t->data.address << "t" << t->data.relation << endl;
				flag = 1;
				break;
			}
			p = p->next;
		}
		if (flag == 0) cout << "ttt查无此人,无法删除!" << endl;
		else
		{
			cout << "ttt确认删除?(1 是 0 否)" << endl;
			cout << "ttt请选择【0-1】:";
			cin >> sel;
			while (sel < 0 || sel>1)
			{
				cout << "ttt输入不合法,请重新选择【0-1】:";
				cin >> sel;
			}
			if (sel == 0);
			else if (sel == 1)
			{
				p->next = t->next;
				delete t;
				cout << "ttt删除成功!" << endl;
				Save_linkList(L); //改动保存至文件中
			}
		}
		cout << "nttt";
		system("pause");
		Delete_linkList(L);
	}
	else if (sel == 3) return;
}


void Query_linkList(const linkList& L)
{
	system("cls");
	cout << "ttt**************欢迎来到查询联系人功能***************" << endl;
	int sel = 0;
	Node* t = L;
	ElemType tem;
	cout << "ttt-----------------" << endl;
	cout << "ttt1 按编号查询" << endl;
	cout << "ttt2 按姓名查询" << endl;
	cout << "ttt3 返回主菜单" << endl;
	cout << "ttt-----------------" << endl;
	cout << "ttt请选择【1-3】:";
	cin >> sel;
	while (sel < 1 || sel>3)
	{
		cout << "ttt输入不合法,请重新选择【1-3】:";
		cin >> sel;
	}
	if (sel == 1)
	{
		int flag = 0;
		cout << "ttt请输入待查询联系人的编号:";
		cin >> tem.num;
		while (t->next)
		{
			t = t->next;
			if (t->data.num == tem.num)
			{
				cout << "ttt待查询联系人信息如下:" << endl;
				cout << "ttt序号t" << "姓名t" << "联系电话t" << "家庭地址t" << "分组" << endl;
				cout << "ttt" << t->data.num << "t" << t->data.name << "t" << t->data.phonenum << "t" << t->data.address << "t" << t->data.relation << endl;
				flag = 1;
				break;
			}
		}
		if (flag == 0) cout << "ttt查无此人!" << endl;
		cout << "nttt";
		system("pause");
		Query_linkList(L);
	}
	else if (sel == 2)
	{
		int flag = 0;
		cout << "ttt请输入待查询联系人的姓名:";
		cin >> tem.name;
		while (t->next)
		{
			t = t->next;
			if (t->data.name == tem.name)
			{
				cout << "ttt待查询联系人信息如下:" << endl;
				cout << "ttt序号t" << "姓名t" << "联系电话t" << "家庭地址t" << "分组" << endl;
				cout << "ttt" << t->data.num << "t" << t->data.name << "t" << t->data.phonenum << "t" << t->data.address << "t" << t->data.relation << endl;
				flag = 1;
				break;
			}
		}
		if (flag == 0) cout << "ttt查无此人!" << endl;
		cout << "nttt";
		system("pause");
		Query_linkList(L);
	}
	else if (sel == 3)
	{
		return;
	}
}


void Modify_linkList(linkList& L)
{
	system("cls");
	cout << "ttt**************欢迎来到修改联系人功能***************" << endl;
	int sel = 0;
	Node* t = L;
	ElemType tem;
	cout << "ttt-----------------" << endl;
	cout << "ttt1 按编号修改" << endl;
	cout << "ttt2 按姓名修改" << endl;
	cout << "ttt3 返回主菜单" << endl;
	cout << "ttt-----------------" << endl;
	cout << "ttt请选择【1-3】:";
	cin >> sel;
	while (sel < 1 || sel>3)
	{
		cout << "ttt输入不合法,请重新输入【1-3】:";
		cin >> sel;
	}
	if (sel == 1)
	{
		int flag = 0;
		cout << "ttt请输入待修改联系人的编号:";
		cin >> tem.num;
		while (t->next)
		{
			t = t->next;
			if (t->data.num == tem.num)
			{
				cout << "ttt待修改联系人信息如下:" << endl;
				cout << "ttt序号t" << "姓名t" << "联系电话t" << "家庭地址t" << "分组" << endl;
				cout << "ttt" << t->data.num << "t" << t->data.name << "t" << t->data.phonenum << "t" << t->data.address << "t" << t->data.relation << endl;
				flag = 1;
				break;
			}
		}
		if (flag == 0) cout << "ttt查无此人,无法修改!" << endl;
		else
		{
			ElemType tem;
			cout << "ttt输入修改后的联系人信息:" << endl;
			cout << "ttt输入姓名:";
			cin >> tem.name;
			cout << "ttt输入电话:";
			cin >> tem.phonenum;
			cout << "ttt输入地址:";
			cin >> tem.address;
			cout << "ttt输入分组:";
			cin >> tem.relation;
			tem.num = t->data.num;
			cout << "ttt确认修改?(1 是 0 否)" << endl;
			cout << "ttt请选择【0-1】:";
			cin >> sel;
			while (sel < 0 || sel>1)
			{
				cout << "ttt输入不合法,请重新选择【0-1】:";
				cin >> sel;
			}
			if (sel == 0);
			else if (sel == 1)
			{
				t->data = tem;
				cout << "ttt修改成功!" << endl;
				Save_linkList(L); //将改动保存至文件中
			}
		}
		cout << "nttt";
		system("pause");
		Modify_linkList(L);
	}
	else if (sel == 2)
	{
		int flag = 0;
		cout << "ttt请输入待修改联系人的姓名:";
		cin >> tem.name;
		while (t->next)
		{
			t = t->next;
			if (t->data.name == tem.name)
			{
				cout << "ttt待修改联系人信息如下:" << endl;
				cout << "ttt序号t" << "姓名t" << "联系电话t" << "家庭地址t" << "分组" << endl;
				cout << "ttt" << t->data.num << "t" << t->data.name << "t" << t->data.phonenum << "t" << t->data.address << "t" << t->data.relation << endl;
				flag = 1;
				break;
			}
		}
		if (flag == 0) cout << "ttt查无此人,无法修改!" << endl;
		else
		{
			ElemType tem;
			cout << "ttt输入修改后的联系人信息:" << endl;
			cout << "ttt输入姓名:";
			cin >> tem.name;
			cout << "ttt输入电话:";
			cin >> tem.phonenum;
			cout << "ttt输入地址:";
			cin >> tem.address;
			cout << "ttt输入分组:";
			cin >> tem.relation;
			tem.num = t->data.num;
			cout << "ttt确认修改?(1 是 0 否)" << endl;
			cout << "ttt请选择【0-1】:";
			cin >> sel;
			while (sel < 0 || sel>1)
			{
				cout << "ttt输入不合法,请重新选择【0-1】:";
				cin >> sel;
			}
			if (sel == 0);
			else if (sel == 1)
			{
				t->data = tem;
				cout << "ttt修改成功!" << endl;
				Save_linkList(L); //将改动保存至文件中
			}
		}
		cout << "nttt";
		system("pause");
		Delete_linkList(L);
	}
	else if (sel == 3) return;
}


void Print_linkList(const linkList& L)
{
	system("cls");
	cout << "ttt***************欢迎来到通讯录显示功能***************" << endl;
	Node* t = L->next;
	cout << "ttt-----------------------------------------------------" << endl;
	cout << "ttt序号t" << "姓名t" << "联系电话t" << "家庭地址t" << "分组" << endl;
	cout << "ttt-----------------------------------------------------" << endl;
	while (t)
	{
		cout << "ttt" << t->data.num << "t" << t->data.name << "t" << t->data.phonenum << "t" << t->data.address << "t" << t->data.relation << endl;
		t = t->next;
	}
	cout << "ttt-----------------------------------------------------" << endl;
	cout << "ttt";
	system("pause");
}


bool compare(const ElemType& t1, const ElemType& t2)
{
	return t1.name < t2.name;
}


void Sort_linkList(linkList& L)
{
	system("cls");
	cout << "ttt***************欢迎来到通讯录排序功能***************" << endl;
	Node* p = L;
	int cnt = 0, i = 0;
	while (p->next)
	{
		p = p->next;
		cnt++;
	}
	ElemType* arr = new ElemType[cnt];
	p = L;
	while (p->next)
	{
		p = p->next;
		arr[i++] = p->data;
	}
	sort(arr, arr + cnt, compare);
	p = L, i = 0;
	while (p->next)
	{
		p = p->next;
		p->data = arr[i++];
		p->data.num = i;
	}
	cout << "ttt对通讯录进行排序并整理如下:" << endl;
	Node* t = L->next;
	cout << "ttt-----------------------------------------------------" << endl;
	cout << "ttt序号t" << "姓名t" << "联系电话t" << "家庭地址t" << "分组" << endl;
	cout << "ttt-----------------------------------------------------" << endl;
	while (t)
	{
		cout << "ttt" << t->data.num << "t" << t->data.name << "t" << t->data.phonenum << "t" << t->data.address << "t" << t->data.relation << endl;
		t = t->next;
	}
	cout << "ttt-----------------------------------------------------" << endl;
	Save_linkList(L); //改动保存至文件中
	cout << "ttt";
	system("pause");
}


void Clear_linkList(linkList& L)
{
	int sel = 0;
	system("cls");
	cout << "ttt**************欢迎来到通讯录清空功能*************" << endl;
	cout << "ttt-----------------" << endl;
	cout << "ttt1 确认清空通讯录" << endl;
	cout << "ttt2 返回主菜单" << endl;
	cout << "ttt-----------------" << endl;
	cout << "ttt请慎重选择【1-2】:";
	cin >> sel;
	while (sel < 1 || sel>2)
	{
		cout << "ttt输入不合法,请重新输入【1-2】:";
		cin >> sel;
	}
	if (sel == 1)
	{
		Node* head = L;
		if (head == NULL)
		{
			return;
		}
		//清空链表,是不清空头节点的,因此从第一个有数据的节点开始释放
		Node* curNode = head->next;
		while (curNode != NULL)
		{
			//先保住下一个节点的位置
			Node* nextNode = curNode->next;
			free(curNode);
			curNode = nextNode;
		}
		//将头结点next指针置空
		head->next = NULL;
		Save_linkList(L);
		cout << "nttt";
		system("pause");
	}
	else if (sel == 2) return;
}


void menu(linkList& L)
{
	char sel;
	system("cls");
	cout << "ttt***********欢迎来到通讯录管理系统***********" << endl;
	cout << "ttt你可以进行以下操作:" << endl;
	cout << "ttt|------------------------------------------|" << endl;
	cout << "ttt|             1   添加联系人               |" << endl;
	cout << "ttt|------------------------------------------|" << endl;
	cout << "ttt|             2   删除联系人               |" << endl;
	cout << "ttt|------------------------------------------|" << endl;
	cout << "ttt|             3   修改联系人               |" << endl;
	cout << "ttt|------------------------------------------|" << endl;
	cout << "ttt|             4   查询联系人               |" << endl;
	cout << "ttt|------------------------------------------|" << endl;
	cout << "ttt|             5   通讯录显示               |" << endl;
	cout << "ttt|------------------------------------------|" << endl;
	cout << "ttt|             6   通讯录排序               |" << endl;
	cout << "ttt|------------------------------------------|" << endl;
	cout << "ttt|             7   通讯录清空               |" << endl;
	cout << "ttt|------------------------------------------|" << endl;
	cout << "ttt|             0   退出                     |" << endl;
	cout << "ttt|------------------------------------------|" << endl;
	cout << "ttt请选择【0-7】:";
	cin >> sel;
	while (sel < '0' || sel>'7')
	{
		cout << "ttt输入非法,请重新选择【0-7】:";
		cin >> sel;
	}
	switch (sel)
	{
	case '1':
		Create_linkList(L);
		menu(L);
		break;
	case '2':
		Delete_linkList(L);
		menu(L);
		break;
	case '3':
		Modify_linkList(L);
		menu(L);
		break;
	case '4':
		Query_linkList(L);
		menu(L);
		break;
	case '5':
		Print_linkList(L);
		menu(L);
		break;
	case '6':
		Sort_linkList(L);
		menu(L);
		break;
	case '7':
		Clear_linkList(L);
		menu(L);
		break;
	case '0':
		exit(0);
	default:
		menu(L);
	}
}

有问题欢迎交流~

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/304322.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号