C++雙向鏈表實(shí)現(xiàn)簡(jiǎn)單通訊錄
本文實(shí)例為大家分享了C++雙向鏈表實(shí)現(xiàn)簡(jiǎn)單通訊錄的具體代碼,供大家參考,具體內(nèi)容如下
#include<iostream> #include<fstream> #include <stdlib.h> #include<string> using namespace std; typedef struct Directory { string Name; string Mobile; string Wechatnumber; string STREET; string CITY; string EIP; string STATE; struct Directory* next; struct Directory* prev; }Directory; //頭節(jié)點(diǎn)初始化 Directory p0 = {"0","0","0","0","0","0","0",NULL,NULL}; Directory pn = {"0","0","0","0","0","0","0",NULL,NULL}; //設(shè)置頭指針,指向頭節(jié)點(diǎn) Directory *head = &p0; //函數(shù)聲明 void enter(Directory*); void display_list(); void printf_a(); void display_menu(Directory*); int key_ramove(string); void display_listfiile(); Directory* find_load(string); Directory* load(); int main() { cout<<"========================================"<<endl; cout<<"= 通 訊 錄 ="<<endl; cout<<"= ="<<endl; cout<<"= ="<<endl; cout<<"= 1.添加 2.刪除 3.查找 4.查看通訊錄 ="<<endl; cout<<"========================================"<<endl; int i = 0; //定義按鍵變量,存放鍵值 string key; //定義字符串變量,存放輸入的字符串 p0.next = &pn; //這倆句是初始化頭尾節(jié)點(diǎn),頭尾節(jié)點(diǎn)連起來(lái) pn.prev = &p0; while(1) { cin>>i; //輸入i,用于選擇第幾個(gè)功能 switch(i){ //選擇,i等于幾,就執(zhí)行case幾 case 1: load(); //新建節(jié)點(diǎn)并插入鏈表 cout<<endl; cout<<"添加完成?。?!"<<endl; printf_a(); break; case 2: cout<<"請(qǐng)輸入名字:"; cin>>key; key_ramove(key); //刪除節(jié)點(diǎn),就是刪除一個(gè)人的信息 printf_a(); break; case 3: cout<<"請(qǐng)輸入名字:"; cin>>key; display_menu(find_load(key)); //打印找到節(jié)點(diǎn)內(nèi)的信息,find_load(key)為找節(jié)點(diǎn)用的遍歷函數(shù) printf_a(); / break; case 4: display_list(); //打印所有節(jié)點(diǎn)的名字 printf_a(); break; case 5: display_listfiile(); //把所有節(jié)點(diǎn)的信息輸入到"address.txt"文件 break; default: break; } } return 0; } /************************************************** * 返回類型:void * 函數(shù)作用:打印菜單 ***************************************************/ void printf_a() { cout<<"----------------------------------------"<<endl; cout<<"- 1.添加 2.刪除 3.查找 4.查看通訊錄 -"<<endl; cout<<"- 5.導(dǎo)出txt文檔 -"<<endl; cout<<"----------------------------------------"<<endl; } /************************************************** * 返回類型:Directory* * 函數(shù)作用:新建節(jié)點(diǎn)插入,鏈表 ***************************************************/ Directory* load() { Directory *p = new Directory; //給這個(gè)新節(jié)點(diǎn)分配空間 enter(p); p->next = head->next; //p的下一個(gè)指向頭指針指向節(jié)點(diǎn)的下一個(gè) head->next = p; //頭指針指向節(jié)點(diǎn)的下一個(gè)指向p p->prev = head; //p的上一個(gè)指向指針指向節(jié)點(diǎn)的下一個(gè) p->next->prev = p; head = p; //頭指針指向p return p; } /************************************************** * 返回類型:void * 函數(shù)作用:?jiǎn)蝹€(gè)節(jié)點(diǎn)查找 * 傳入?yún)?shù):名字 10分 ***************************************************/ Directory* find_load(string key_name) { Directory *p; p = &pn; for(p; p->prev != NULL ;p = p->prev) { if(p->Name == key_name ) { return p; } } return NULL; } /************************************************** * 返回類型:void * 函數(shù)作用:?jiǎn)蝹€(gè)節(jié)點(diǎn)刪除 * 傳入?yún)?shù):名字 15分 ***************************************************/ int key_ramove(string key_name) { Directory *p; //定義結(jié)構(gòu)體類型的指針 p = &pn; for(p; p->prev != NULL;p = p->prev) { if(p->Name == key_name ) { head = pn.prev; p->prev->next = p->next; //p的上一個(gè)的下一個(gè)指向p的下一個(gè) p->next->prev = p->prev; //p的下一個(gè)的上一個(gè)指向p的上一個(gè) free(p); //釋放p的空間 return 0; //刪除后,退出函數(shù) } } cout<<"沒(méi)有此人!?。?!"<<endl; return 0; } /************************************************** * 返回類型:void * 函數(shù)作用:?jiǎn)蝹€(gè)節(jié)點(diǎn)輸入 * 傳入?yún)?shù):Directtory(自己定義的結(jié)構(gòu)體)型指針, 5分 ***************************************************/ void enter(Directory *P ) { char jubge; //用來(lái)判斷的變量 string name, mobile; cout<<"輸入姓名:"; cin>>name; P->Name = name; //把輸入的字符串放到,當(dāng)前指針指向的節(jié)點(diǎn) cout<<"輸入電話:"; cin>>mobile; P->Mobile = mobile; //把輸入的字符串放到,當(dāng)前指針指向的節(jié)點(diǎn) cout<<"是否完善信息?(Y/N)"<<endl; cin>>jubge; if(jubge == 'y' || jubge == 'Y') { string wechatnumber; //微信 string street; //街道 string city; //城市 string eip; //郵編 string state; //國(guó)家 cout<<"微信:"; cin>>wechatnumber; P->Wechatnumber = wechatnumber; cout<<"街道:"; cin>>street; P->STREET = street; cout<<"城市:"; cin>>city; P->CITY = city; cout<<"國(guó)家:"; cin>>state; P->STATE = state; }else{ //除了輸入y以外都會(huì)執(zhí)行這個(gè) P->Wechatnumber = "NULL"; P->STREET = "NULL"; P->CITY = "NULL"; P->STATE = "china"; } } /************************************************** * 返回類型:void * 函數(shù)作用:打印通訊錄(所有人名字,逆序) ***************************************************/ void display_list() { Directory *p; //定義結(jié)構(gòu)體類型的指針 p = head; // 讓p 等于當(dāng)前head指針?biāo)傅墓?jié)點(diǎn) int i = 1; //顯示序號(hào) cout<<endl; cout<<"*******************************************"<<endl; cout<<" 通 訊 錄 "<<endl; cout<<"------------------------------------------"<<endl; while(p->prev != NULL) //循環(huán),知道p指向節(jié)點(diǎn)的prev指針指向NULL { cout<<" "<<i<<": "<<p->Name<<endl; //打印p指針對(duì)應(yīng)節(jié)點(diǎn)的名字 cout<<"------------------------------------------"<<endl; p = p->prev; //指針指向上一個(gè)節(jié)點(diǎn) i++; } cout<<"*******************************************"<<endl; cout<<endl; } void display_listfiile() { Directory *p; //定義結(jié)構(gòu)體類型的指針 p = &pn; // 讓p 等于當(dāng)前head指針?biāo)傅墓?jié)點(diǎn) int i = 1; //顯示序號(hào) ofstream fout("address.txt"); //打開(kāi)address.txt文件,沒(méi)有自動(dòng)創(chuàng)建 while(p->prev != NULL) //循環(huán),知道p指向節(jié)點(diǎn)的prev指針指向NULL { fout << i <<":" << p->Name <<endl; //把當(dāng)前節(jié)點(diǎn)的名字輸出到address.txt文件 fout <<" " << p->Mobile <<endl; fout <<" " << p->Wechatnumber <<endl; fout <<" " << p->STREET <<endl; fout <<" " << p->CITY <<endl; fout <<" " << p->STATE <<endl; fout <<endl; p = p->prev; //指針指向上一個(gè)節(jié)點(diǎn) i++; } fout.close(); //關(guān)閉文件流 } /************************************************** * 返回類型 Directory * 函數(shù)作用:打印詳細(xì)信息 ***************************************************/ void display_menu(Directory *P) { if(P == NULL) // 判斷 如果P為空,則打印沒(méi)有這個(gè)人 { cout<<"沒(méi)有此人?。?"<<endl; }else{ cout<<"* * * * * * * * * * * * * * * * * * * * "<<endl; cout<<"* 姓名: "<<P->Name<<endl; cout<<"* 電話: "<<P->Mobile<<endl; cout<<"* 微信: "<<P->Wechatnumber<<endl; cout<<"* 街道: "<<P->STREET<<endl; cout<<"* 城市: "<<P->CITY<<endl; cout<<"* 國(guó)家:"<<P->STATE<<endl; cout<<"* * * * * * * * * * * * * * * * * * * * "<<endl; } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
c++11 符號(hào)修飾與函數(shù)簽名、函數(shù)指針、匿名函數(shù)、仿函數(shù)、std::function與std::bind
這篇文章主要介紹了c++11 符號(hào)修飾與函數(shù)簽名、函數(shù)指針、匿名函數(shù)、仿函數(shù)、std::function與std::bind,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05C++中將Char轉(zhuǎn)換成String的4種方法
本文主要介紹了C++中將Char轉(zhuǎn)換成String的4種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03OpenCV實(shí)現(xiàn)相機(jī)標(biāo)定示例詳解
相機(jī)標(biāo)定是圖像處理的基礎(chǔ),現(xiàn)在市面上買到的相機(jī),都存在著或多或少的畸變。本文將介紹如何利用一系列棋盤照片進(jìn)行攝像機(jī)標(biāo)定的,感興趣的小伙伴可以關(guān)注一下2021-11-11c++實(shí)現(xiàn)加載so動(dòng)態(tài)庫(kù)中的資源
下面小編就為大家?guī)?lái)一篇c++實(shí)現(xiàn)加載so動(dòng)態(tài)庫(kù)中的資源。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12C++如何將十六進(jìn)制字符串轉(zhuǎn)換為二進(jìn)制字符串
這篇文章主要介紹了C++如何將十六進(jìn)制字符串轉(zhuǎn)換為二進(jìn)制字符串問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08