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("ttt Welcome to the address book information management system!nnn");   printf("tttt***************************************************n");   printf("tttt * │1.InitList  2.Add Message │ *n");   printf("tttt * │     │ *n");   printf("tttt * │3.Search Message 4.Save File │ *n");   printf("tttt * │     │ *n");   printf("tttt * │5.Sort Static 6.Load Message │ *n");   printf("tttt * │     │ *n");   printf("tttt * │7.Display Message 8.Delete Message│ *n");   printf("tttt * │     │ *n");   printf("tttt * │9.Save Message 0.Exit System │ *n");   printf("tttt***************************************************n");   cout << endl;   yanshi((char *)"ttPlease choose the mode of operation(1~8):n");  /* cout << "ttPlease 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 namen" << 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 namen" << endl;   int a;   cin >> a;   switch (a) {   case 1:   clear();   {   LinkList aa = SearchNum(L);   header();   PrintLNode(aa);   cout << "nnn成功!" << endl;   system("pause");   menu();   }   break;   case 2:   clear();   {   LinkList b = SearchName(L);   header();   PrintLNode(b);   cout << "nnn成功!" << 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("%15sn",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 3333333欢迎使用通讯录信息管理系统3333333nnnn");   cout << "t   学生通讯录信息管理系统nnnnn";   cout << "tt  version 1.0nnnnn";   cout << "tt  xxxxxxxxx 某某某nnnnn";   cout << "tt  Loading......nn" << 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%15sn","学号","姓名","电话","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;   }   }   }  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持<计算机技术网(www.ctvol.com)!!>。

—-想了解C++链表实现通讯录管理系统分享!全部内容且更多的C语言教程关注<计算机技术网(www.ctvol.com)!!>

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/483439.html

(0)
上一篇 2020年11月10日
下一篇 2020年11月10日

精彩推荐