diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..8827aa1 --- /dev/null +++ b/main.cpp @@ -0,0 +1,388 @@ +#include +#include +#include + + +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; + } + } +} + + +