C++使用鏈表存儲實現通訊錄功能管理
本文實例為大傢分享瞭C++使用鏈表存儲實現通訊錄功能管理的具體代碼,供大傢參考,具體內容如下
簡介
這是第二周老師給的一個小項目要求實現基本通訊錄功能,有數據的增刪改查,包含插入時間的能力。
代碼詳情
頭文件
#include <iostream> #include <string> #include<malloc.h> //system功能調用 #include <windows.h> //使用本地系統API獲取插入時間 #include <sstream>
基本存儲結構體
typedef struct info{ string number; string date; string name; string adress; string birthday; }A; typedef struct LNode{ A data; struct LNode *next; }LNode,*LinkList;
鏈表數據初始化
用前插法插入數據
int InitList(LinkList &L){ //初始化鏈表 L = new LNode; L->next = NULL; return OK; } int ListInsert(LinkList &L,string name,string adress,string birthday,string date,string number){ //考慮使用數組來賦值 LinkList p; p= new LNode; p->data.name = name; p->data.adress = adress; p->data.date = date; p->data.birthday = birthday; p->data.number = number; p->next = L->next; L->next = p; return OK; }
本地WindowsAPI調用插入時間
SYSTEMTIME sys; GetLocalTime( &sys ); string y = doubleToString(sys.wYear); string m = doubleToString(sys.wMonth); string d = doubleToString(sys.wDay); string ymd = y+"-"+m+"-"+d;
因為獲取的是一個double值,您得對其時間強制類型轉換
string doubleToString(double num) { //強制類型轉換 double強制轉換為string類型 stringstream ss; string str; ss << num; ss >> str; return str; }
數據查詢功能
LinkList SearchElemChar(LinkList L,int i,string e){ //思路,傳遞參數1,2,3,4,eg 1代表name,再分不同的方法在鏈表內循環查找操作 if (i == 1){ //查名字 while(L!= NULL){ if(L->data.name == e){ return L; }else{ L = L->next; } } if(L = NULL){ cout << "未查到數據!"<<endl; } }else if(i == 2){//查生日 while(L!= NULL){ if(L->data.birthday == e){ return L; }else{ L = L->next; } } if(L = NULL){ cout <<"未查到數據!"<<endl; } } else if(i == 3){//查地址 while(L!= NULL){ if(L->data.adress == e){ return L; }else{ L = L->next; } } if(L = NULL){ cout <<"未查到數據!"<<endl; } }else if(i == 4){//查時間 while(L!= NULL){ if(L->data.date == e){ return L; }else{ L = L->next; } } if(L = NULL){ cout <<"未查到數據!"<<endl; } } else if(i == 5){//查電話 while(L!= NULL){ if(L->data.number == e){ return L; }else{ L = L->next; } } if(L = NULL){ cout <<"未查到數據!"<<endl; } } }
完整案例
//樂公第二周項目 實現基本通訊錄存儲結構 //基礎鏈表存儲數據 #include <iostream> #include <string> #include<malloc.h> //system功能調用 #include <windows.h> //使用本地系統API獲取插入時間 #include <sstream> #define ERROR 0 #define OK 1 using namespace std; typedef int ElemType; /*定義表元素的類型*/ //結構體文件 typedef struct info{ string number; string date; string name; string adress; string birthday; }A; typedef struct LNode{ A data; struct LNode *next; }LNode,*LinkList; int InitList(LinkList &L){ //初始化鏈表 L = new LNode; L->next = NULL; return OK; } int ListInsert(LinkList &L,string name,string adress,string birthday,string date,string number){ //考慮使用數組來賦值 LinkList p; p= new LNode; p->data.name = name; p->data.adress = adress; p->data.date = date; p->data.birthday = birthday; p->data.number = number; p->next = L->next; L->next = p; return OK; } //查找元素 (難題需要解決) LinkList SearchElemChar(LinkList L,int i,string e){ //思路,傳遞參數1,2,3,4,eg 1代表name,再分不同的方法在鏈表內循環查找操作 if (i == 1){ //查名字 while(L!= NULL){ if(L->data.name == e){ return L; }else{ L = L->next; } } if(L = NULL){ cout << "未查到數據!"<<endl; } }else if(i == 2){//查生日 while(L!= NULL){ if(L->data.birthday == e){ return L; }else{ L = L->next; } } if(L = NULL){ cout <<"未查到數據!"<<endl; } } else if(i == 3){//查地址 while(L!= NULL){ if(L->data.adress == e){ return L; }else{ L = L->next; } } if(L = NULL){ cout <<"未查到數據!"<<endl; } }else if(i == 4){//查時間 while(L!= NULL){ if(L->data.date == e){ return L; }else{ L = L->next; } } if(L = NULL){ cout <<"未查到數據!"<<endl; } } else if(i == 5){//查電話 while(L!= NULL){ if(L->data.number == e){ return L; }else{ L = L->next; } } if(L = NULL){ cout <<"未查到數據!"<<endl; } } } LinkList SearchElemBefore(LinkList L,string e){ //刪除結點必須返回前個結點的地址,這裡查找前個結點 LinkList P; while(L!= NULL){ if(L->data.name == e){ return P; }else{ P = L; L = L->next; } } if(L = NULL){ return L; } } int ShowMenu(){ //主菜單 int a; cout<<"------歡迎您使用樂公通訊錄系統!------"<< endl; cout <<"-----請根據功能輸入對應的序號--------" <<endl; cout <<"-----------1.新建聯系人--------------" <<endl; cout <<"--------2.查看所有聯系人-------------" <<endl; cout <<"--------3.修改選定聯系人-------------" <<endl; cout <<"--------4.查詢選定聯系人-------------" <<endl; cout <<"--------5.刪除選定聯系人-------------" <<endl; cout <<"------------6.退出系統---------------" <<endl; cout << "請您輸入序號並按回車進入:" ; cin >> a; return a; } string doubleToString(double num) { //強制類型轉換 double強制轉換為string類型 stringstream ss; string str; ss << num; ss >> str; return str; } void foreachelem(LinkList L){ if(L->next == NULL){ cout<<"通訊錄裡還沒有聯系人,快去新建一下吧~"<<endl; }else{ while(L->next!=NULL){ L=L->next; cout<< "聯系人姓名:" << L->data.name <<endl; cout<< "聯系人電話:" << L->data.number<<endl; cout<< "聯系人地址:" << L->data.adress <<endl; cout<< "聯系人生日:" << L->data.birthday <<endl; cout<< "錄入時間:" << L->data.date <<endl; } cout<< "\n"; } //system("pause"); } int serachsamename(LinkList L,string name){ //查找是否存在姓名相同的聯系人 while(L->next!=NULL){ L=L->next; if(L->data.name==name)return 0; } return 1; } int main(){ int i; LinkList L; InitList(L); while(i!=6){ i = ShowMenu(); if(i ==1){ cout << "您選擇瞭:新建聯系人" <<endl; string number; string date; string time; string name; string adress; string birthday; cout << "請輸入聯系人姓名:"; cin >> name; SYSTEMTIME sys; GetLocalTime( &sys ); string y = doubleToString(sys.wYear); string m = doubleToString(sys.wMonth); string d = doubleToString(sys.wDay); string ymd = y+"-"+m+"-"+d; int repeat = serachsamename(L,name); if(repeat == 0){ cout << "聯系人姓名重復,請刪除舊聯系人或更改姓名!" << endl; }else{ cout << "請輸入聯系人電話:"; cin >> number; if(number.size()!=11){ cout << "手機號輸入有誤,請大於11位!" << endl; }else{ cout << "請輸入聯系人生日:"; cin >> birthday; cout << "請輸入聯系人地址:"; cin >> adress; cout << "聯系人於" << ymd; int ok; ok = ListInsert(L,name,adress,birthday,ymd,number); if(ok == 1){ cout << "日新建成功!" << endl; }else{ cout << "新建失敗!" << endl; } } } system("pause"); system("cls"); }else if(i==2){ cout << "您選擇瞭:遍歷聯系人" <<endl; foreachelem(L); system("pause"); system("cls"); }else if(i==3){ cout << "您選擇瞭:修改選定聯系人" <<endl; cout <<"請輸入要修改的聯系人姓名:" ; string name; cin >> name; LinkList B; B = SearchElemChar(L,1,name); if(B){ system("cls"); cout << "聯系人查找成功!姓名:" << B->data.name << endl; int select; cout <<"---------修改姓名請輸入1---------" << endl; cout <<"---------修改電話請輸入2---------" << endl; cout <<"---------修改生日請輸入3---------" << endl; cout <<"---------修改地址請輸入4---------" << endl; cout <<"請根據序號輸入對象的選項修改:" ; cin >> select; switch(select){ case 1: { string name; cout <<"請輸入新姓名:"; cin >> name; B->data.name = name; cout <<"修改完成!" << endl; break; } case 2: { string number; cout <<"請輸入新電話:"; cin >> number; if(number.size()!=11){ cout << "手機號輸入有誤,請大於11位!" << endl; }else{ B->data.number = number; cout <<"修改完成!" << endl; } break; } case 3:{ string birthday; cout <<"請輸入新生日:"; cin >> birthday; B->data.birthday = birthday; cout <<"修改完成!" << endl; break; } case 4:{ string adress; cout <<"請輸入新地址:"; cin >> adress; B->data.adress = adress; cout <<"修改完成!" << endl; break; } default:cout <<"序號輸入錯誤,請重新輸入!"<<endl; } }else{ cout << "未查找到聯系人!請重新輸入!" << endl; } system("pause"); system("cls"); }else if(i==4){ system("cls"); cout << "您選擇瞭:查詢選定聯系人" <<endl; cout <<"---------根據姓名查詢請輸入1---------" << endl; cout <<"---------根據電話查詢請輸入2---------" << endl; cout <<"---------根據生日查詢請輸入3---------" << endl; cout <<"---------根據地址查詢請輸入4---------" << endl; int select; cout <<"請根據序號輸入對象的進行查詢:" ; cin >> select; switch(select){ case 1:{ cout <<"請輸入要查詢的聯系人姓名:" ; string name; cin >> name; LinkList B; B = SearchElemChar(L,1,name); if(B){ cout<<"查詢成功!"<< endl; cout<<"聯系人姓名:"<< B->data.name << endl; cout<<"聯系人電話:"<< B->data.number << endl; cout<<"聯系人生日:"<< B->data.birthday << endl; cout<<"聯系人地址:"<< B->data.adress << endl; cout<<"插入日期:"<< B->data.date << endl; }else{ cout<<"查詢失敗!請重新輸入!"<< endl; } break; } case 2: { cout <<"請輸入要查詢的聯系人電話:" ; string number; cin >> number; LinkList B; B = SearchElemChar(L,5,number); if(B){ cout<<"查詢成功!"<< endl; cout<<"聯系人姓名:"<< B->data.name << endl; cout<<"聯系人電話:"<< B->data.number << endl; cout<<"聯系人生日:"<< B->data.birthday << endl; cout<<"聯系人地址:"<< B->data.adress << endl; cout<<"插入日期:"<< B->data.date << endl; }else{ cout<<"查詢失敗!請重新輸入!"<< endl; } break; } case 3:{ cout <<"請輸入要查詢的聯系人生日:" ; string bd; cin >> bd; LinkList B; B = SearchElemChar(L,2,bd); if(B){ cout<<"查詢成功!"<< endl; cout<<"聯系人姓名:"<< B->data.name << endl; cout<<"聯系人電話:"<< B->data.number << endl; cout<<"聯系人生日:"<< B->data.birthday << endl; cout<<"聯系人地址:"<< B->data.adress << endl; cout<<"插入日期:"<< B->data.date << endl; }else{ cout<<"查詢失敗!請重新輸入!"<< endl; } break; } case 4:{ cout <<"請輸入要查詢的聯系人地址:" ; string ad; cin >> ad; LinkList B; B = SearchElemChar(L,3,ad); if(B){ cout<<"查詢成功!"<< endl; cout<<"聯系人姓名:"<< B->data.name << endl; cout<<"聯系人電話:"<< B->data.number << endl; cout<<"聯系人生日:"<< B->data.birthday << endl; cout<<"聯系人地址:"<< B->data.adress << endl; cout<<"插入日期:"<< B->data.date << endl; }else{ cout<<"查詢失敗!請重新輸入!"<< endl; } break; break; } default:cout <<"序號輸入錯誤,請重新輸入!"<<endl; } system("pause"); system("cls"); }else if(i==5){ cout << "您選擇瞭:刪除聯系人" <<endl; string name; cout << "請輸入聯系人姓名:" <<endl; cin >> name; LinkList D,P; P = SearchElemBefore(L,name); if(P){ D = P->next; P->next = D->next; delete D; //釋放結點數據 cout << "刪除成功!" <<endl; }else{ cout<<"查詢失敗!未找到指定聯系人!"<< endl; } system("pause"); system("cls"); }else if(i==6){ cout << "系統已退出,歡迎下次使用!" <<endl; } else{ cout <<"輸入異常,請重新選擇輸入!" <<endl; system("pause"); system("cls"); } } return 0; }
以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。