1. 程式人生 > 程式設計 >C++連結串列實現通訊錄管理系統

C++連結串列實現通訊錄管理系統

用資料結構裡面線性結構的連結串列實現,供大家參考,具體內容如下

檔案操作未寫

有登入操作,複製原始碼需要更改登入模組的密碼檔案存放位置

使用VS2017編譯器需要保留開頭 #define _CRT_SECURE_NO_WARNINGS

#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,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->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;
 }
 }
 }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。