//程序说明:需要将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;
}
}
}