This commit is contained in:
kou he
2022-03-26 15:15:16 +00:00
committed by Gitee
parent d46c01908d
commit f84b1ecad6

388
main.cpp Normal file
View File

@@ -0,0 +1,388 @@
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
struct contacts *FindNode(string);
struct contacts {
string name;
string phone;
string fax;
string job;
string email;
string address;
string qq;
string folder;
struct contacts *next;
};
// create head node
contacts *head = NULL;
void PrintMenu(void) {
cout << "*********************************************************" << endl;
cout << "1.Add contacts" << endl;
cout << "2.Find contacts" << endl;
cout << "3.Edit" << endl;
cout << "4.Delete" << endl;
cout << "5.List all" << endl;
cout << "6.Filter and print" << endl;
cout << "8.Load data.csv" << endl;
cout << "9.Save to data.csv" << endl;
cout << "0.Exit" << endl;
cout << "*********************************************************" << endl;
}
void DeleteAll(void) {
contacts *p = head;
while (p != NULL) {
head = p->next;
delete p;
p = head;
}
}
void
AddNode(string name, string phone, string fax, string job, string email, string address, string qq, string folder) {
contacts *p = new contacts;
p->name = name;
p->phone = phone;
p->fax = fax;
p->job = job;
p->email = email;
p->address = address;
p->qq = qq;
p->folder = folder;
p->next = NULL;
if (head == NULL) {
head = p;
} else {
contacts *q = head;
while (q->next != NULL) {
q = q->next;
}
q->next = p;
}
}
void AddContacts(void) {
while (1) {
//input a name,check if the name is already in the linked list
//if yes,ask user to input another name
string input_name;
cout << "input a name:";
cin >> input_name;
//get the node address of the name
contacts *p = NULL;
p = FindNode(input_name);
//check if the name is already in the linked list
// if not,create a new node and add it to the linked list
if (p == NULL) {
//input other information
string input_phone;
string input_fax;
string input_job;
string input_email;
string input_address;
string input_qq;
string input_folder;
cout << "input phone:";
cin >> input_phone;
cout << "input fax:";
cin >> input_fax;
cout << "input job:";
cin >> input_job;
cout << "input email:";
cin >> input_email;
cout << "input address:";
cin >> input_address;
cout << "input qq:";
cin >> input_qq;
cout << "input folder:";
cin >> input_folder;
//add the node to the linked list
AddNode(input_name, input_phone, input_fax, input_job, input_email, input_address, input_qq, input_folder);
cout << "add successfully" << endl;
} else {
cout << "the name is already in the linked list" << endl;
cout << "please input another name" << endl;
}
//ask user continue or stop
char input_char;
cout << "continue?(y/n)" << endl;
cin >> input_char;
if (input_char == 'n') {
break;
}
}
}
void FindContacts(void) {
//find the node by name
//output data
struct contacts *p;
p = head;
cout << "input name:";
string name;
cin >> name;
while (p != NULL) {
if (p->name == name) {
cout << "name:" << p->name << endl;
cout << "phone:" << p->phone << endl;
cout << "fax:" << p->fax << endl;
cout << "job:" << p->job << endl;
cout << "email:" << p->email << endl;
cout << "address:" << p->address << endl;
cout << "qq:" << p->qq << endl;
cout << "folder:" << p->folder << endl;
break;
}
p = p->next;
}
}
struct contacts *FindNode(string name) {
//find the node by name
// return NULL if not found
struct contacts *p;
p = head;
while (p != NULL) {
if (p->name == name) {
return p;
}
p = p->next;
}
return NULL;
}
/*
struct contacts *FindNodeByFolders(string folder){
struct contacts *p;
p = head;
while(p != NULL){
if(p->folder == folder){
return p;
}
p = p->next;
}
return NULL;
}
*/
void EditContacts(void) {
//find the node by name
//input name
string name;
cout << "input the name you want to edit:";
cin >> name;
// get node address by name
struct contacts *p;
p = FindNode(name);
if (p == NULL) {
cout << "not found" << endl;
return;
}
//if it was found , then input new data
cout << "input new name:";
cin >> p->name;
cout << "input new phone:";
cin >> p->phone;
cout << "input new fax:";
cin >> p->fax;
cout << "input new job:";
cin >> p->job;
cout << "input new email:";
cin >> p->email;
cout << "input new address:";
cin >> p->address;
cout << "input new qq:";
cin >> p->qq;
cout << "input new folder:";
cin >> p->folder;
// Edit finished
cout << "Edit finished" << endl;
}
void DeleteContacts(void) {
while (true) {
//find the node by name
//input name
string name;
cout << "input the name you want to delete:";
cin >> name;
// get node address by name
struct contacts *p;
p = FindNode(name);
// check if the name is already in the linked list
// if not ,print error message
if (p == NULL) {
cout << "not found" << endl;
}
// if it was found , then delete it
else {
if (p == head) {
head = head->next;
} else {
struct contacts *q = head;
while (q->next != p) {
q = q->next;
}
q->next = p->next;
}
delete p;
cout << "delete successfully" << endl;
}
//ask user continue or stop
char input_char;
cout << "continue?(y/n)" << endl;
cin >> input_char;
if (input_char == 'n') {
break;
}
}
}
void ListAllContacts(void) {
//print all the contacts as table
struct contacts *p;
p = head;
cout << "name" << "\t" << "phone" << "\t" << "fax" << "\t" << "job" << "\t" << "email" << "\t" << "address" << "\t"
<< "qq" << "\t" << "folder" << endl;
while (p != NULL) {
cout << p->name << "\t" << p->phone << "\t" << p->fax << "\t" << p->job << "\t" << p->email << "\t"
<< p->address << "\t" << p->qq << "\t" << p->folder << endl;
p = p->next;
}
}
void Filter(void) {
//filter by folder
string folder;
cout << "input the folder you want to filter:";
cin >> folder;
// print the filter result as table
struct contacts *p;
p = head;
cout << "name" << "\t" << "phone" << "\t" << "fax" << "\t" << "job" << "\t" << "email" << "\t" << "address" << "\t"
<< "qq" << "\t" << "folder" << endl;
while (p != NULL) {
if (p->folder == folder) {
cout << p->name << "\t" << p->phone << "\t" << p->fax << "\t" << p->job << "\t" << p->email << "\t"
<< p->address << "\t" << p->qq << "\t" << p->folder << endl;
}
p = p->next;
}
}
// load data from csv file
void OpenFile() {
DeleteAll();
// load data from csv file to linked list
ifstream fin;
fin.open("contacts.csv");
if (!fin) {
cout << "open file error" << endl;
return;
}
string name, phone, fax, job, email, address, qq, folder;
while (!fin.eof()) {
getline(fin, name, ',');
getline(fin, phone, ',');
getline(fin, fax, ',');
getline(fin, job, ',');
getline(fin, email, ',');
getline(fin, address, ',');
getline(fin, qq, ',');
getline(fin, folder);
if (name == "") {
break;
}
AddNode(name, phone, fax, job, email, address, qq, folder);
}
fin.close();
}
// save the data to file as csv
void SaveToFile(void) {
ofstream outfile;
outfile.open("contacts.csv");
struct contacts *p;
p = head;
while (p != NULL) {
outfile << p->name << "," << p->phone << "," << p->fax << "," << p->job << "," << p->email << "," << p->address
<< "," << p->qq << "," << p->folder << endl;
p = p->next;
}
outfile.close();
}
int main() {
while (1) {
system("pause");
system("cls");
// print menu
PrintMenu();
// read a choice
int choice;
//1.Add a new contact
//2.Find a contact
//3.Edit a contact
//4.Delete a contact
//5.List all contacts
//6.Filter by folder
//8.Load data from file
//9.Save data to file
//10.Exit
cout << "please input your choice:";
cin >> choice;
switch (choice) {
case 1:
AddContacts();
break;
case 2:
FindContacts();
break;
case 3:
EditContacts();
break;
case 4:
DeleteContacts();
break;
case 5:
ListAllContacts();
break;
case 6:
Filter();
break;
case 8:
OpenFile();
break;
case 9:
SaveToFile();
break;
case 0:
exit(0);
default:
cout << "input error" << endl;
break;
}
}
}