链表实现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<

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 "<

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;

}

}

}

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
通讯录管理系统 通讯录(add_book)中的联系人包含以下信息项:姓名、手机、办公电话、家庭电话、电子邮箱、所在省市、工作单位、家庭住址,群组分类(亲属、同事、同学、朋友、其他)。 Name Mobile phones Office phone Family telephone E-mail In cities Work units0 Address Group classification (relative, colleagues, friends, classmates, other). 系统的主要功能包括: 1. 输入联系人的信息,要求:至少输入10个联系人的数据,且注意数据的多样性。 2. 按姓名对联系人信息进行排序,并将排序后信息存放到一个文本文件中。 3. 添加联系人的信息,在已经存在的通讯录文件中添加若干个联系人。要求:添加后仍按联系人的姓名排序,并保存至原文件。 4. 删除联系人的信息,输入一个姓名,若通讯录中有该联系人的信息,则删除该联系人,否则输出提示信息,并提示用户选择是否继续进行删除操作。 5. 修改联系人的信息,输入一个姓名,根据具体需要修改该联系人的某一项信息,将修改后的信息重新保存到通讯录文件中,并提示用户选择是否继续进行修改操作。 6. 按不同条件对通讯录进行查询操作,输出满足条件的联系人的信息。 (1) 按姓名查询,包括精确查询(输入全名),模糊查询(输入姓); (2) 按手机号码查询,输入全部号码或号码位段(如输入130、133、139等); (3) 按群组分类查询,输入分类名称,输出该群组的全部联系人信息。 7. 输出联系人的信息Contact information,按一定格式输出信息,保证信息排列整齐美观。ContactPerson

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值