单链表实现简单通讯录c语言,C++双向链表实现简单通讯录

#include

#include

#include

#include

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<

cout<

cout<

cout<

cout<

cout<

int i = 0; //定义按键变量,存放键值

string key; //定义字符串变量,存放输入的字符串

p0.next = &pn; //这俩句是初始化头尾节点,头尾节点连起来

pn.prev = &p0;

while(1)

{

cin>>i; //输入i,用于选择第几个功能

switch(i){ //选择,i等于几,就执行case几

case 1:

load(); //新建节点并插入链表

cout<

cout<

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<

cout<

cout<

cout<

}

/**************************************************

* 返回类型: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<

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<

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<

cout<

cout<

cout<

while(p->prev != NULL) //循环,知道p指向节点的prev指针指向NULL

{

cout<Name<

cout<

p = p->prev; //指针指向上一个节点

i++;

}

cout<

cout<

}

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

fout <Mobile <

fout <Wechatnumber <

fout <STREET <

fout <CITY <

fout <STATE <

fout <

p = p->prev; //指针指向上一个节点

i++;

}

fout.close(); //关闭文件流

}

/**************************************************

* 返回类型 Directory

* 函数作用:打印详细信息

***************************************************/

void display_menu(Directory *P)

{

if(P == NULL) // 判断 如果P为空,则打印没有这个人

{

cout<

}else{

cout<

cout<Name<

cout<Mobile<

cout<Wechatnumber<

cout<STREET<

cout<CITY<

cout<STATE<

cout<

}

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值