简单的通讯录管理系统

这是一个基于链表实现的简单通讯录管理系统,目前有待进一步优化。如果采用带头结点的链表,代码结构会更加简洁。
摘要由CSDN通过智能技术生成

一个简单的通讯录管理系统  采用链表,有待优化 ,如果使用带头结点的链表 代码可以更精简

// 通讯录管理系统.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<string>
#include<stdlib.h>
#include<fstream>

using namespace std;
struct Tonxunlu
{

	string name;
	string num;
	Tonxunlu *front;
	Tonxunlu *next;

};


class Myclass
{
public:
	void add();
	void del();
	void find();
	void xiugai();
	void print();
	void save();
	void load();
	void mainmenu();
	Tonxunlu *head = NULL;
};
void Myclass::add() {

	Tonxunlu * new_node;
	new_node = new Tonxunlu;//分配空间
	cout << "请输入姓名:   ";
	cin >> new_node->name;
	cout << "请输入电话号码:   ";
	cin >> new_node->num;
	new_node->front = NULL;//新结点没有前驱
	new_node->next = head;//新节点的后继为原来链表的第一个结点
	if (!head)//原表为空
	{
		head = new_node;
	}
	else
	{
		head->front = new_node;//原来表中的第一个结点的前驱是新插入的结点
		head = new_node;//新结点成为链表的第一个结点
	}

}

void Myclass::del() {
	int choice3;
	string name1, num1;
	Tonxunlu *q;
	q = head;
	if (!head) { cout << "通讯录是空的,请按3结束" << endl; }
	cout << "按姓名删除请按1,电话号码删除请按2" << endl;
	cin >> choice3;
	switch (choice3)
	{
	case 1:
		cout << "请输入要删除的联系人姓名" << endl;
		cin >> name1;
		//循环结束q指向name值为name1的结点
		while (q&&q->name != name1)
		{

			q = q->next;
		}
		if (!q) { cout << "没有找到名字为" << name1 << "的联系人" << endl; break; }
		//被删除的结点是第一个结点且表中不只有一个结点
		if (q == head&&head->next)
		{   
			//头结点指向头结点后指针指向的结点
			head = head->next;
			//此时头结点的指针为空
			head->front = NULL;
			//把name值为name1的结点空间撤销
			delete q;
			q = NULL;
			break;
		}
		//被删除的结点是第一个结点并且只有一个结点
		if (q == head && !head->next)
		{
			head = NULL;
			delete q;
			q = NULL;
			break;
		}
		else {
			//被删除的结点是双链表中的尾结点
			if (!q->next) {          
				q->front->next = NULL;
				delete q;
				q = NULL;
				break;
			}
			else {					//q是两个以上的结点且不是头结点和尾结点
				q->front->next = q->next;
				q->next->front = q->front;
				delete q;
				q = NULL;
				break;
			}
		}

	case 2:
		cout << "请输入要删除的联系人电话号码" << endl;
		cin >> num1;

		while (q&&q->num != num1)
		{
			q = q->next;
		}
		if (!q) { cout << "没有找到电话号码为" << num1 << "的联系人" << endl; break; }
		if (q == head&&head->next)
		{
			head = head->next;
			head->front = NULL;
			delete q;
			q = NULL;
			break;
		}
		if (q == head && !head->next)
		{
			head = NULL;
			delete q;
			q = NULL;
			break;
		}
		else {
			if (!q->next) {
				q->front->next = NULL;
				delete q;
				q = NULL;
				break;
			}
			else {
				q->front->next = q->next;
				q->next->front = q->front;
				delete q;
				q = NULL;
				break;
			}
		}
	case 3:break;
	default:cout << "请输入正确的字符" << endl; getchar();
		break;
	}

}
void Myclass::find() {
	int choice;
	string name1, num1;
	Tonxunlu *q;
	q = head;
	cout << "按姓名查找请按1,电话号码查找请按2" << endl;
	cin >> choice;
	switch (choice)
	{
	case 1:
		cout << "请输入要查找的联系人姓名" << endl;
		cin >> name1;
		if (!q) cout << "通讯录是空的,无法找到该联系人!";
		else
		{
			while (q)
			{
				if (q->name == name1)
				{
					cout << "姓名:    " << name1 << "电话号码:       " << q->num << endl; getchar();
					break;
				}
				else { q = q->next; }
			}
			if (!q) { cout << "没有找到姓名为" << name1 << "的联系人" << endl;getchar(); }
		}
		break;
	case 2:
		cout << "请输入要查找的联系人电话号码" << endl;
		cin >> num1;
		if (!q) cout << "通讯录是空的,无法找到该联系人!" << endl;
		else
		{
			while (q)
			{
				if (q->num == num1)
				{
					cout << "姓名:    " << q->name << "电话号码:     " << num1 << endl;
					break;

				}
				else { q = q->next; }
			}
			if (!q) { cout << "没有找到电话号码为" << num1 << "的联系人" << endl; getchar(); }
		}
		break;
	default:cout << "请输入正确的字符" << endl; getchar();
		break;
	}
}
void Myclass::xiugai() {
	int choice;
	string name1, num1, name2, num2;
	Tonxunlu *q;
	q = head;
	cout << "按姓名修改请按1,电话号码修改请按2" << endl;
	cin >> choice;
	switch (choice)
	{
	case 1:
		cout << "请输入要修改的联系人姓名" << endl;
		cin >> name1;
		if (!q) cout << "通讯录是空的,无法完成修改!";
		else
		{
			while (q)
			{
				if (q->name == name1)
				{
					cout << "请输入要修改为的姓名" << endl;
					cin >> name2;
					cout << "姓名    " << name2 << "电话号码    " << q->num << endl;
					q->name = name2;
					//getchar();
					break;
				}
				else { q = q->next; }
			}
			if (!q) { cout << "没有找到姓名为" << name1 << "的联系人" << endl;getchar(); }
		}
		break;
	case 2:
		cout << "请输入要修改的联系人电话号码" << endl;
		cin >> num1;
		if (!q) cout << "通讯录是空的,无法完成修改!" << endl;
		else
		{
			while (q)
			{
				if (q->num == num1)
				{
					cout << "请输入要修改为的电话号码" << endl;
					cin >> num2;
					cout << "姓名    " << q->name << "电话号码    " << num2 << endl;
					q->num = num2;
					//getchar();
					break;

				}
				else { q = q->next; }
			}
			if (!q) { cout << "没有找到电话号码为" << num1 << "的联系人" << endl; getchar(); }
		}
		break;
	default:cout << "请输入正确的字符" << endl;
		break;
	}
}
void Myclass::print() {
	Tonxunlu *q;
	q = head;
	if (!q)
	{
		cout << "这是个空通讯录" << endl;
	}
	else
	{
		while (q) { cout << "姓名:   " << q->name << "电话号码:    " << q->num << endl;q = q->next; }
		getchar();
	}
}
void Myclass::mainmenu() {
	int select;
	cout << "\t\t" << endl
		<< "\t\t--------------------------------------------------" << endl
		<< "\t\t|                                                |" << endl
		<< "\t\t|                                                |" << endl
		<< "\t\t|             通 迅 录 管 理 系 统               |" << endl
		<< "\t\t|                                                |" << endl
		<< "\t\t|    1. 添加联系人          2. 修改联系人        |" << endl
		<< "\t\t|                                                |" << endl
		<< "\t\t|    3. 删除联系人          4. 查询联系人        |" << endl
		<< "\t\t|                                                |" << endl
		<< "\t\t|    5. 通讯录显示          6. 储存              |" << endl
		<< "\t\t|                                                |" << endl
		<< "\t\t|    7. 读取                8. 退出系统          |" << endl
		<< "\t\t|                                                |" << endl
		<< "\t\t--------------------------------------------------" << endl
		<< "\t\t                                                  " << endl
		<< "\t\t       请选择数字 : ";
	cin >> select;
	switch (select)
	{
	case 1:

		cout << "添加联系人" << endl;
		do
		{
			add();
			cout << "是否继续添加联系人信息(Y/N)" << endl;
			getchar();
		} while ((getchar() == 'Y') || (getchar() == 'y'));
		break;
	case 2:

		cout << "修改联系人" << endl;
		do {
			xiugai();
			cout << "是否继续修改联系人信息(Y/N)" << endl;
			getchar();
		} while ((getchar() == 'Y') || (getchar() == 'y'));
		break;
	case 3:

		cout << "删除联系人" << endl;
		do {
			del();
			cout << "是否继续删除联系人信息(Y/N)" << endl;
			getchar();
		} while ((getchar() == 'Y') || (getchar() == 'y'));
		break;
	case 4:

		cout << "查询联系人" << endl;
		find();
		break;
	case 5:

		cout << "通讯录显示" << endl;
		print();
		break;
	case 6:
		cout << "储存" << endl;
		save();
		break;
	case 7:
		cout << "读取" << endl;
		load();
		break;
	case 8:
		system("cls");
		cout << "欢迎下次使用" << endl;
		getchar();
		exit(0);
		break;
	default:
		system("cls");
		cout << "请输入正确的操作" << endl;
		break;
	}
}

void Myclass::save() {
	Tonxunlu *p;
	p = head;
	ofstream infile("Tonxunlu.txt", ios::out);
	while (p)
	{
		infile << p->name << "        " << p->num << endl;;
		p = p->next;
	}
	cout << "保存成功" << endl;
	infile.close();

}
void Myclass::load() {
	ifstream	outfile;
	Tonxunlu *p = head;
	string Name, Num;
	outfile.open("Tonxunlu.txt", ios::in);
	outfile >> Name >> Num;
	while (!outfile.eof()) {
		p = new Tonxunlu;
		p->name = Name;
		p->num = Num;
		p->front = NULL;
		p->next = head;
		head = p;
		outfile >> Name >> Num;
	}
	outfile.close();
}
int main()
{
	Myclass mc;
	while (1) { mc.mainmenu(); getchar(); }
	return 0;
}



  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值