C++双向链表实现简单通讯录

本文实例为大家分享了C++双向链表实现简单通讯录的具体代码,供大家参考,具体内容如下

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

//头节点初始化
Directory p0 = {"0","0","0","0","0","0","0",NULL,NULL};
Directory pn = {"0","0","0","0","0","0","0",NULL,NULL};

//设置头指针,指向头节点
Directory *head = &p0;

//函数声明
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;       //这俩句是初始化头尾节点,头尾节点连起来
 pn.prev = &p0;

 while(1)
 {
  cin>>i;        //输入i,用于选择第几个功能
  switch(i){       //选择,i等于几,就执行case几
  case 1:
   load();       //新建节点并插入链表
   cout<<endl;
   cout<<"添加完成!!!"<<endl;
   printf_a();
   break;
  case 2:
   cout<<"请输入名字:";
   cin>>key;
   key_ramove(key);    //删除节点,就是删除一个人的信息
   printf_a();
   break;
  case 3:
   cout<<"请输入名字:";
   cin>>key;
   display_menu(find_load(key)); //打印找到节点内的信息,find_load(key)为找节点用的遍历函数
   printf_a();      /
   break;
  case 4:
   display_list();     //打印所有节点的名字
   printf_a();
   break;
  case 5:
   display_listfiile();   //把所有节点的信息输入到"address.txt"文件
   break;
  default:
   break;
  }
 }
 return 0;
}
/**************************************************
* 返回类型:void
* 函数作用:打印菜单
***************************************************/
void printf_a()
{
 cout<<"----------------------------------------"<<endl;
 cout<<"- 1.添加 2.删除 3.查找 4.查看通讯录 -"<<endl;
 cout<<"- 5.导出txt文档      -"<<endl;
 cout<<"----------------------------------------"<<endl;
}
/**************************************************
* 返回类型:Directory*
* 函数作用:新建节点插入,链表
***************************************************/
Directory* load()
{
 Directory *p = new Directory;   //给这个新节点分配空间
 enter(p);        

 p->next = head->next;     //p的下一个指向头指针指向节点的下一个
 head->next = p;       //头指针指向节点的下一个指向p
 p->prev = head;       //p的上一个指向指针指向节点的下一个
 p->next->prev = p;
 head = p;        //头指针指向p

 return p;
}
/**************************************************
* 返回类型:void
* 函数作用:单个节点查找
* 传入参数:名字     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
* 函数作用:单个节点删除
* 传入参数:名字    15分
***************************************************/
int key_ramove(string key_name)
{
 Directory *p;       //定义结构体类型的指针
 p = &pn;
 for(p; p->prev != NULL;p = p->prev)
 {
  if(p->Name == key_name )
  {
   head = pn.prev;
   p->prev->next = p->next;  //p的上一个的下一个指向p的下一个
   p->next->prev = p->prev;  //p的下一个的上一个指向p的上一个
   free(p);      //释放p的空间
   return 0;      //删除后,退出函数
  }
 }
 cout<<"没有此人!!!!"<<endl;
 return 0;
}
/**************************************************
* 返回类型:void
* 函数作用:单个节点输入
* 传入参数:Directtory(自己定义的结构体)型指针, 5分
***************************************************/
void enter(Directory *P )
{
 char jubge;      //用来判断的变量
 string name, mobile;

 cout<<"输入姓名:";
 cin>>name;
 P->Name = name;     //把输入的字符串放到,当前指针指向的节点

 cout<<"输入电话:";
 cin>>mobile;
 P->Mobile = mobile;    //把输入的字符串放到,当前指针指向的节点

 cout<<"是否完善信息?(Y/N)"<<endl;
 cin>>jubge;

 if(jubge == 'y' || jubge == 'Y')
 {
  string wechatnumber;  //微信
  string street;    //街道
  string city;    //城市
  string eip;     //邮编
  string state;    //国家
  cout<<"微信:";
  cin>>wechatnumber;
  P->Wechatnumber = wechatnumber;

  cout<<"街道:";
  cin>>street;
  P->STREET = street;

  cout<<"城市:";
  cin>>city;
  P->CITY = city;

  cout<<"国家:";
  cin>>state;
  P->STATE = state;
 }else{       //除了输入y以外都会执行这个
  P->Wechatnumber = "NULL";

  P->STREET = "NULL";

  P->CITY = "NULL";

  P->STATE = "china";
 }
}
/**************************************************
* 返回类型:void
* 函数作用:打印通讯录(所有人名字,逆序)
***************************************************/
void display_list()
{
 Directory *p; //定义结构体类型的指针
 p = head;  // 让p 等于当前head指针所指的节点
 int i = 1;  //显示序号
 cout<<endl;
 cout<<"*******************************************"<<endl;
 cout<<"    通 讯 录     "<<endl;
 cout<<"------------------------------------------"<<endl;
 while(p->prev != NULL)            //循环,知道p指向节点的prev指针指向NULL
 {
  cout<<" "<<i<<":  "<<p->Name<<endl;       //打印p指针对应节点的名字
  cout<<"------------------------------------------"<<endl;
  p = p->prev;             //指针指向上一个节点
  i++;
 }
 cout<<"*******************************************"<<endl;
 cout<<endl;
}
void display_listfiile()
{
 Directory *p;         //定义结构体类型的指针
 p = &pn;          // 让p 等于当前head指针所指的节点
 int i = 1;          //显示序号
 ofstream fout("address.txt");     //打开address.txt文件,没有自动创建

 while(p->prev != NULL)       //循环,知道p指向节点的prev指针指向NULL
 {
  fout << i <<":" << p->Name <<endl;   //把当前节点的名字输出到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;        //指针指向上一个节点
  i++;
 }
 fout.close();         //关闭文件流
}
/**************************************************
* 返回类型 Directory
* 函数作用:打印详细信息
***************************************************/
void display_menu(Directory *P)
{
 if(P == NULL) // 判断 如果P为空,则打印没有这个人
 {
  cout<<"没有此人!! "<<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<<"* 国家:"<<P->STATE<<endl;
 cout<<"* * * * * * * * * * * * * * * * * * * * "<<endl;
 }
}

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

(0)

相关推荐

  • C++实现简易通讯录

    本文实例为大家分享了C++实现简易通讯录的具体代码,供大家参考,具体内容如下 #include <iostream> #include <string> #define MAX 1000 using namespace std; // 设计联系人的结构体 struct Person { string m_Name; int m_Sex; // 1.男 2 女 int m_Age; string m_Phone; string m_Addr; }; // 设计通讯录的结构体 stru

  • C++实现简单通讯录

    本文实例为大家分享了C++实现简单通讯录的具体代码,供大家参考,具体内容如下 说明: 1 程序中运用到两个类,一个是Person类,另一个是List类.前者存储用户信息,后者主要用于操作,如增删改查等.但由于本程序中没有涉及到太复杂的功能,用户信息可以由一个简单的结构体表示,但是为了以后拓展方便,和达到学习运算符重载的目的,还是使用了类. 2 List类中的Reflush()方法用户刷新文件内容,即每次修改了vector后要将最新内容写入到文件.因此增删改操作中都要调用该操作,这种方法在数据库开

  • C++容器vector实现通讯录功能

    之前学习C语言的时候,用链表实现过通讯录的基本功能.最近写了一个C++版本的通讯录,参考代码如下所示. main.cpp /***************************************************** Copyright (C): 2017-2018 File name : main.cpp Author : Zhengqijun Date : 2017年02月12日 星期日 16时47分52秒 Description : 主函数 Funcion List : ma

  • C++链表实现通讯录管理系统

    用数据结构里面线性结构的链表实现,供大家参考,具体内容如下 文件操作未写 有登录操作,复制源码需要更改登录模块的密码文件存放位置 使用VS2017编译器需要保留开头: #define _CRT_SECURE_NO_WARNINGS #define _CRT_SECURE_NO_WARNINGS #include "iostream" #include "cstdio" #include "fstream" #include "stdli

  • C++实现通讯录管理系统

    本文实例为大家分享了C++通讯录管理系统的具体代码,供大家参考,具体内容如下 #include<iostream> #include<string> using namespace std; #define MAX 1000 struct Person { string m_Name; int m_Sex; int m_Age; string m_Phone; string m_Addr; }; struct Addressbooks { struct Person personA

  • C++实现链表版本通讯录

    本文实例为大家分享了C++实现链表版本通讯录的具体代码,供大家参考,具体内容如下 #include <iostream> #include <string> using namespace std; class Address; class Contact{ private: string name; string sex; string tel; string QQ; string address; string addition; Contact *next; public:

  • C++双向链表实现简单通讯录

    本文实例为大家分享了C++双向链表实现简单通讯录的具体代码,供大家参考,具体内容如下 #include<iostream> #include<fstream> #include <stdlib.h> #include<string> using namespace std; typedef struct Directory { string Name; string Mobile; string Wechatnumber; string STREET; st

  • C语言实现简单通讯录功能

    本文实例为大家分享了C语言实现简单通讯录功能的具体代码,供大家参考,具体内容如下 1.存放联系人信息 2.信息:名字+年龄+性别+电话+住址 3.增加联系人 4.删除联系人 5.查找联系人 6.修改联系人 7.排序 test.c源文件代码如下: #define _CRT_SECURE_NO_WARNINGS 1 #include "contact.h" void menu() { printf("#####################################\n&

  • C++实现简单通讯录系统

    本文实例为大家分享了C++实现简单通讯录系统的具体代码,供大家参考,具体内容如下 需求分析: 1.通讯录可以添加联系人. 2.通讯录可以显示所有联系人. 3.通讯录可以查找联系人. 4.通讯录可以删除联系人. 5.通讯录可以修改联系人. 6.可以清空通讯录. 7.退出通讯录. 项目代码: #include<iostream> #include<string> #include<stdlib.h> using namespace std; #define MAX 1000

  • C语言使用结构体实现简单通讯录

    C语言用结构体实现一个通讯录,通讯录可以用来存储1000个人的信息,每个人的信息包括: 姓名.性别.年龄.电话.住址 提供方法: 1. 添加联系人信息 2. 删除指定联系人信息 3. 查找指定联系人信息 4. 修改指定联系人信息 5. 显示所有联系人信息 6. 清空所有联系人 代码实现: 头文件: #ifndef __HEAD_H__ ////防止头文件被多次调用 #define __HEAD_H__ #include<stdio.h> #include<string.h> #in

  • C++实现简单通讯录管理系统

    本文实例为大家分享了C++实现简单的通讯录管理系统的具体代码,供大家参考,具体内容如下 一.代码 #include <iostream> #include <string> #include <cstring> #include <fstream> using namespace std; //自定义一个联系人结点类型 typedef struct node1 {     string name;        //姓名     string tel;  

  • 30分钟学会用PHP写带数据库的简单通讯录第1/3页

    引用上篇文章的开场白: 我接触PHP也不是很久,所以有什么不足的地方,欢迎各位指正,让大家见笑了. 这篇小教程的对象是PHP初学者,都是些最简单.最基本的东西,因此高手们可以略过哦. 为了让各位初学者提起兴趣.尽快入门,这里写的是将是最简单,最基本的PHP程序,相信你只要有一点点的PHP基础知识,10分钟之内就能把它学会.没有PHP基础知识也没有关系,只要耐心的看,学会它也不会超过一个小时的. 我写这篇文章的目的是,和大家一起共同学习.共同进步,然后将PHP初学者们对PHP的恐惧心理驱赶到十万八

  • C语言实现简单通讯录系统

    本文实例为大家分享了C语言通讯录系统(增删改查),供大家参考,具体内容如下 全部代码如下所示: #include <iostream> #include <string> using namespace std; const int MAX = 1000; //联系人结构体 typedef struct person { string m_name; //姓名 int m_sex; //性别 1 男,0 女 int m_age; //年龄 string m_phone; //电话

  • C语言实现简单通讯录管理系统

    C语言实现的通讯录管理系统,供大家参考,具体内容如下 设计一个学生通信录,学生通迅录数据信息构成内容可自行设计(如:学号.姓名.电话号码.所在班级.寝室地址等),通信录数据类型定义为结构体类型. 主要实现功能包括: (1)创建学生通讯录 (2)修改学生通讯录 (3)增删学生通讯录 (4)能够按多种方式进行查询(如:①按学号查询:②按所在班级查询) 源代码: #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.

  • Java实现简单通讯录管理系统

    本文实例为大家分享了Java实现通讯录管理系统的具体代码,供大家参考,具体内容如下 题目: 1.完成一个通讯录,需求: (1)添加联系人(联系人:编号,姓名,手机号,QQ,邮箱地址)添加时需要检查手机号和邮箱地址格式是否正确,若不正确,不允许添加 (2)联系人查询(输入姓名或电话查询) (3)显示联系人列表 (4)根据编号删除指定编号的联系人 代码分析: 之前写过类似的管理系统,不过是使用数组进行数据存储,这次的通讯录管理系统通过动态数组 ArrayList进行数据存储.其中代码实现的原理和之前

随机推荐