[数据结构]Phone-Number Manager

//程序说明:需要将date.txt与exe放置在同一文件

#include<iostream>
#include<string>
#include<fstream>
using namespace std;
//构造单链表
struct Node
{
	string name_contain,number_contain;
	Node *next;
	Node();
	Node(string name,string number, Node *add_on = NULL);
};

Node::Node()
{
	next = NULL;
}

Node::Node(string name, string number, Node * add_on)
{
	name_contain = name;
	number_contain = number;
	next = add_on;
}
//********************************************************************************
Node *head = new Node("First_Node", "First_Node");//第一个节点
Node *last = new Node("Last_Node", "Last_Node");//最后一个节点
Node *p[100];//暂时存储相同用户不同号码的指针
int same = 0;//记录相同用户名的个数
//********************************************************************************
void Insert(string name,string number) {//插入函数
	Node *i = head;
	Node *temp = i->next;
	i->next = new Node(name, number);
	i->next->next = temp;
	cout << "Insert successful!" << endl;
}
//*********************************************************************************
bool SearchEngine(string name) {//判断是否存在,并存储存在用户的指针
	int temp = 0;
	Node *s = head;
	for (int i = 0; i < 10; i++) {
		p[i] = NULL;
	}
	while (s->next) {
		if (s->next->name_contain == name) p[temp++] = s;
		s = s->next;
	}
	same = temp;
	s = head;			//复位
	if (temp != 0)return true;
	else return false;
}
//**********************************************************************************
void Delete(string name) {		//删除功能
	if (name == "-1")return;
	for (int i = 0; i < same; i++)
		cout << p[i]->next->name_contain << ' ' << p[i]->next->number_contain << endl;
	cout << "Confirm Delete?(y or n)" << endl;
	char key;
	cin >> key;
	cin.ignore(100, '\n');
	while (key != 'y'&&key != 'n') {
		cout << "Please enter y or n." << endl;
		cin >> key;
		cin.ignore(100, '\n');
	}
	if (key == 'y') {
		Node *delete_p[10];
		for (int i = 0; i < same; i++)
			delete_p[i] = p[i]->next;
		for (int i = 0; i < same;i++) {
				Node *temp = p[i]->next;
				p[i]->next = temp->next;
				int count = 1;
				while (i+count<same&&p[i]->next == p[i+count]->next) {
					temp = p[i + count]->next;
					p[i]->next = temp->next;
					count++;
				}
				i += count-1;
		}
		for (int i = 0; i < same; i++) 
			delete delete_p[i];
		cout << "Delete successful!" << endl;
	}
	else cout << "Cancel delete." << endl;
}
//***********************************************************************************
void Search(string name) {			//搜索功能
	while (!SearchEngine(name)&&name!="-1") {
		cout << "Not exist this name. Please enter again ,or enter -1 to return ." << endl;
		cin >> name;
	}
	if (name == "-1")return;
	for (int i = 0; i < same; i++)
		cout << p[i]->next->name_contain << ' ' << p[i]->next->number_contain << endl;
}
//************************************************************************************
int Initialize() {
	ifstream read;
	read.open("date.txt");
	if (!read) {
		cout << "Please put the file \"date.txt\" with the \".exe\" programme." << endl;
		return 0;
	}
	string name, number;
	while (read >> name >> number) {
		Insert(name, number);
		system("cls");
	}
	read.close();
	cout << "Initialize succeed!" << endl;
	system("pause");
	return 1;
}
//************************************************************************************
void Save() {
	ofstream out;
	out.open("date.txt");
	Node *s = head->next;
	while (s) {
		out << s->name_contain <<'\t' << s->number_contain << endl;
		s = s->next;
	}
	cout << "Save succeed!" << endl;
	out.close();
}
//************************************************************************************
void UI() {
	cout << "*********************************Phone-Number Manager***************************************" << endl;
	cout << "MENU" << endl;
	cout << "1.Insert a phone number." << endl;
	cout << "2.Delete a phone number." << endl;
	cout << "3.Search a phone number." << endl;
	cout << "0.Save and exit the programme." << endl;
}
//************************************************************************************
void main() {			//主界面(驱动程序)
	if (!Initialize()) return;
	system("cls");
	UI();
	while (1) {
		cout << "Please choose the function." << endl;
		char key;
		cin >> key;
		cin.ignore(100,'\n');
		while (key != '1'&& key != '2' && key != '3'&& key != '0') {
			cout << "Please enter 0 or 1 or 2 or 3." << endl;
			cin >> key;
			cin.ignore(100,'\n');
		}
		string name, number;
		switch (key - '0')
		{
		case 1:
			cout << "Please enter the item you want to add.(Eg:zhang3  123456)" << endl;
			cin >> name >> number;
			Insert(name, number);
			system("pause");
			system("cls");
			UI();
			break;
		case 2:
			cout << "Please enter the name you want to delete." << endl;
			cin >> name;
			while (!SearchEngine(name) && name != "-1") {
				cout << "Not exist this name. Please enter again ,or enter -1 to return ." << endl;
				cin >> name;
			}
			Delete(name);
			system("pause");
			system("cls");
			UI();
			break;
		case 3:
			cout << "Please enter the name you want to search." << endl;
			cin >> name;
			Search(name);
			system("pause");
			system("cls");
			UI();
			break;
		case 0:
			Save();
			system("pause");
			return;
			break;
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值