您好,登錄后才能下訂單哦!
本篇文章為大家展示了怎么在C++中利用鏈表實現通訊錄管理系統,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
#define _CRT_SECURE_NO_WARNINGS #include "iostream" #include "cstdio" #include "fstream" #include "stdlib.h" #include "String" #include "iomanip" #include "windows.h" #define LEN 100 using namespace std; using std::cin; using std::cout; using std::endl; using std::ifstream; using std::ofstream; using std::ios; using std::cerr; using std::string; using std::setw; typedef struct LNode { char num[10]; char name[20]; char telNum[12]; char qq[10]; struct LNode *next; }LNode,*LinkList; int n = 0; void InitList(LinkList &L);//初始化表 void InsertLNode(LinkList &L,LNode *s);//前插法插入新結點 LinkList SearchName(LinkList L);//按姓名查找 LinkList SearchNum(LinkList L);//按學號查找 void DelLNode(LinkList &L,LinkList p);//刪除p結點 void PrintLNode(LinkList p);//打印結點 void PrintList(LinkList L);//打印表 /*----------------系統函數----------------*/ void CreateLinkList(LinkList &L);//創建鏈表 void DelName(LinkList &L);//按姓名刪除通訊錄成員 void DelNum(LinkList &L);//按學號刪除通訊錄成員 void saveRecord(LinkList L);//存儲信息 void loadRecord(LinkList &L);//加載信息 /*--------------------------------------*/ void Secret(); void fun(); void ver(); void yanshi(char *p); void clear(); void header(); void menu() { LinkList L=NULL; int select; do { system("cls"); printf("\t\t\t Welcome to the address book information management system!\n\n\n"); printf("\t\t\t\t***************************************************\n"); printf("\t\t\t\t * │1.InitList 2.Add Message │ *\n"); printf("\t\t\t\t * │ │ *\n"); printf("\t\t\t\t * │3.Search Message 4.Save File │ *\n"); printf("\t\t\t\t * │ │ *\n"); printf("\t\t\t\t * │5.Sort Static 6.Load Message │ *\n"); printf("\t\t\t\t * │ │ *\n"); printf("\t\t\t\t * │7.Display Message 8.Delete Message│ *\n"); printf("\t\t\t\t * │ │ *\n"); printf("\t\t\t\t * │9.Save Message 0.Exit System │ *\n"); printf("\t\t\t\t***************************************************\n"); cout << endl; yanshi((char *)"\t\tPlease choose the mode of operation(1~8):\n"); /* cout << "\t\tPlease choose the mode of operation(1~8):" << endl;*/ cin >> select; switch (select) { case 8: cout << "Please select the deletion method:\n1.Delete by student number 2.Delete by name\n" << endl; int x; cin >> x; switch (x) { case 1: DelNum(L); break; case 2: DelName(L); break; } case 6: loadRecord(L); break; case 5: break; case 4: saveRecord(L); break; case 3: clear(); cout << "Please select a search method:\n1.Find by student number 2.Find by name\n" << endl; int a; cin >> a; switch (a) { case 1: clear(); { LinkList aa = SearchNum(L); header(); PrintLNode(aa); cout << "\n\n\n成功!" << endl; system("pause"); menu(); } break; case 2: clear(); { LinkList b = SearchName(L); header(); PrintLNode(b); cout << "\n\n\n成功!" << endl; system("pause"); menu(); break; } } break; case 1: InitList(L); break; case 9: break; case 7: PrintList(L); break; case 2: CreateLinkList(L); break; case 0: cout << endl << endl << endl; cout << "The programe is over!" << endl << endl << endl; Sleep(2000); exit(0); break; } } while (select != 8); } int main() { fun(); ver();//版本信息 Secret();//密碼登錄 menu(); return 0; } //初始化表 void InitList(LinkList & L) { L = new LNode;//申請頭結點 L->next= NULL; } //插入一條信息 void InsertLNode(LinkList & L, LNode *s) { s->next = L->next; L->next = s; } //按姓名查找 LinkList SearchName(LinkList L) { char name[20]; cout << "請輸入要查找的姓名:" << endl; cin >> name; LinkList p = L->next; while (p) { //如果找到,退出循環,返回p if (strcmp(p->name, name) == 0) break; else p = p->next; } return p; } //按學號查找 LinkList SearchNum(LinkList L) { char num[10]; cout << "請輸入要查找的學號:" << endl; cin >> num; LinkList p = L->next; while (p) { //如果找到,退出循環,返回p if (strcmp(p->num, num) == 0) break; else p = p->next; } return p; } //刪除節點 void DelLNode(LinkList &L,LinkList p) { LinkList s=NULL, q; q = L->next; //將s指向p前面的一個結點 while (q&&q!=p) { s = q; q = q->next; } s->next = q->next; delete q; } //打印一條信息 void PrintLNode(LinkList p) { printf("%15s", p->num); printf("%15s", p->name); printf("%15s", p->telNum); printf("%15s\n",p->qq); } //打印通訊錄 void PrintList(LinkList L) { clear(); header(); LinkList p = L->next; while (p) { PrintLNode(p); p = p->next; } system("pause"); } //添加信息 void CreateLinkList(LinkList & L) { char ans = 'y'; n = 0; while (ans=='y'||ans=='Y') { system("cls"); LNode *p = new LNode; cout << "請輸入學號:" << endl; cin >> p->num; cout << "請輸入姓名:" << endl; cin >> p->name; cout << "請輸入電話號碼:" << endl; cin >> p->telNum; cout << "請輸入QQ號:" << endl; cin >> p->qq; InsertLNode(L,p); n++; cout<<"是否繼續?(Y/N)"<<endl; getchar(); ans=getchar(); } system("pause"); } //按姓名刪除 void DelName(LinkList &L) { char name[20]; LinkList p; cout << "請輸入要刪除的學生姓名:" << endl; cin >> name; p = SearchName(L); if (p) { DelLNode(L,p); } system("pause"); } //按學號刪除 void DelNum(LinkList & L) { char num[20]; LinkList p; cout << "請輸入要刪除的學生學號:" << endl; cin >> num; p = SearchName(L); if (p) { DelLNode(L, p); } system("pause"); } //存儲信息 void saveRecord(LinkList L) { FILE *fp=NULL; int count = 0; if ((fp=(fopen("student.dat","wb")))==NULL) { cout << "Can't open this file!" << endl; Sleep(3000); } LinkList q = L->next; while (q) { fwrite(q, sizeof(LNode), 1, fp); count ++; q = q->next; } fclose(fp); cout << "Save the file successfully!" << endl; getchar(); } //加載信息 void loadRecord(LinkList & L) { FILE *fp=NULL; int count = 0; if ((fp=(fopen("student.dat", "rb"))) == NULL) { cout << "Can't open this file!" << endl; Sleep(3000); } LinkList p=NULL; while(1){ p = new LNode; if (fread(p, sizeof(LNode), 1, fp) > 0) { InsertLNode(L,p); count++; } else { break; } } fclose(fp); cout << endl << endl << "Load "<<count<<"messages!" << endl; Sleep(2200); } //控制臺樣式 void fun() { system("color 2a"); system("title 學生通訊錄信息管理系統"); } //版本信息 void ver() { yanshi((char*)"\t \3\3\3\3\3\3\3歡迎使用通訊錄信息管理系統\3\3\3\3\3\3\3\n\n\n\n"); cout << "\t 學生通訊錄信息管理系統\n\n\n\n\n"; cout << "\t\t version 1.0\n\n\n\n\n"; cout << "\t\t xxxxxxxxx 某某某\n\n\n\n\n"; cout << "\t\t Loading......\n\n" << endl; Sleep(3000); system("cls"); } //延時輸出 void yanshi(char *p) { while (1) { if (*p != 0) cout << *p++; else break; Sleep(50); } } //清屏 void clear() { system("cls"); } //表頭 void header() { printf("%15s%15s%15s%15s\n","學號","姓名","電話","QQ"); } /*--------------------------------登錄模塊----------------------------------*/ /*--------------------------------登錄模塊----------------------------------*/ /*--------------------------------登錄模塊----------------------------------*/ struct UsrInfo//用戶名的賬戶和密碼信息 { char UsrName[20]; char Psword[20]; }; /* 注意我的文件中用戶名是一行,密碼是一樣。在注冊的時候只需要看用戶名,不需要看密碼是不是相符,所以設置i為計數變量,當i不能整除2 的時候是訪問用戶名的時候,當i整除2的時候是訪問密碼的時候。讀入密碼這一行直接跳出去就行了。 */ int regest(struct UsrInfo* usr) {//注冊程序 char usrname[20]; char psword[20]; strcpy_s(usrname, usr->UsrName); strcpy_s(psword, usr->Psword); string temp; int flag = 0; int i = 0; ifstream fin("E:\\Love-Study\\學生通訊錄管理系統\\static.dat", ios::in);//在這個路徑下讀入文件 ofstream fout("E:\\Love-Study\\學生通訊錄管理系統\\static.dat", ios::app);//在同一個路徑下,如果注冊成功則寫入文件 while (std::getline(fin, temp))//每次讀一行的數據進入temp中。 { i++; if (i % 2 == 0) continue;//訪問的是密碼這一行,跳出。 if (!strcmp(usrname, temp.c_str())) flag = 1;//flag=1說明用戶名已經被注冊了 } fin.close(); if (flag) { return 0;//之前有重復的賬戶名 } else {//沒注冊 fout << usrname << endl;//向文件寫入注冊者的用戶名,然后換一行 fout << psword << endl;//寫入密碼,換行 fout.close(); return 1;//注冊成功 } } int login(struct UsrInfo* usr) { char usrname[20]; char psword[20]; strcpy_s(usrname, usr->UsrName); strcpy_s(psword, usr->Psword); string temp1; string temp2; int existname = 0; int match = 0; int i = 0; ifstream fin("E:\\Love-Study\\學生通訊錄管理系統\\static.dat", ios::in); while (std::getline(fin, temp1)) { std::getline(fin, temp2);//一次讀進去兩行,分別是用戶名和密碼 if (!strcmp(usrname, temp1.c_str())) {//有這個用戶名了,接下來看看密碼是不是相符的 existname = 1; if (!strcmp(psword, temp2.c_str())) {//相符 match = 1; break; } } } fin.close(); if (!existname) { return 2;//沒有賬戶名 } else { if (match) return 1; else return 3;//用戶名和密碼不匹配 } } void Secret() { clear(); cout << "1.注冊 2.登錄" << endl; int c; cin >> c; switch (c) { case 1: { clear(); UsrInfo test1;//用于測試注冊程序的。 char urr[20], prr[20]; cout << "請輸入用戶名:" << endl; cin >> urr; cout << "請輸入密碼:" << endl; cin >> prr; strcpy(test1.UsrName, urr); strcpy(test1.Psword, prr); switch (regest(&test1)) { case 1: cout << "注冊成功" << endl; system("pause"); Secret(); break; case 0: cout << "用戶名已被注冊,請重新選擇用戶名" << endl; system("pause"); Secret(); break; default: break; } break; } case 2: { clear(); UsrInfo test2;//用于測試注冊程序的。 char ur[20], pr[20]; cout << "請輸入用戶名:" << endl; cin >> ur; cout << "請輸入密碼:" << endl; cin >> pr; strcpy(test2.UsrName, ur); strcpy(test2.Psword, pr); switch (login(&test2)) { case 1: cout << "登錄成功" << endl; system("pause"); menu(); break; case 3: cout << "密碼錯誤" << endl; system("pause"); Secret(); break; case 2: cout << "沒有此用戶名,請注冊" << endl; system("pause"); Secret(); break; default: break; } } } }
上述內容就是怎么在C++中利用鏈表實現通訊錄管理系統,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。