通讯录的建立

简易通讯录系统

#include<iostream>
#include<cstring>
#include<cstdlib>
using namespace std;
typedef struct lnode//定义节点和单链表的数据类型
{
	int num;//编号
	char name[10];//姓名
	char sex[2];//性别
	char pho[13];//电话
	char add[23];//地址
	lnode *next;//结构体指针域,存放后继的地址
}lnode,*Llist;//lnode是节点的类型,*Llist是指向该类型节点的的指针类型

Llist creat(Llist L)//初始化单链表
{//尾插法
	lnode *s,*r; //定义工作指针 r为尾指针 s为头指针   
	int a;        //设置元素的类型为int
	r=new lnode;//生成头结点
	L=new lnode;
	L->next=NULL;//将链表置空
	L=r;
	while(a!=0)
	{ 
		s=new lnode;//生成新的节点
		cout<<"请输入编号/姓名/性别/电话号码/地址:"<<endl;
		cin>>s->num>>s->name>>s->sex>>s->pho>>s->add; 
		r->next=s;//新节点的处理
		r=s;//r指向新的尾节点
		cout<<"结束输入按0,其他键继续"<<endl;
		cin>>a;
	}
	r->next=NULL;//对于非空表,最后节点的指针域放空指针
	return L;
}
Llist Insert(Llist L)//向链表中插入元素
{
	lnode *p=L;
	lnode *s;
	cout<<"请输入要插入的编号/姓名/性别/电话号码/地址:"<<endl;
	s=new lnode;//申请新的节点
	cin>>s->num>>s->name>>s->sex>>s->pho>>s->add;
	while(p->next)
		p=p->next;//先将p的后继指向p
	p->next=s;//再将s指向p的后继
	s->next=NULL;//尾节点、指针域置空
	return L;
}
void output(Llist L)//遍历单链表
{
	lnode *s; 
	s=L;
	cout<<"输出通讯录内容:"<<endl;
	if(s->next==NULL)//空链表
		cout<<"该通讯录没有任何内容!"<<endl;
	else
	{
		cout<<"编号/姓名/性别/电话号码/地址"<<endl; 
		while(s->next)//循环输出
		{ 
			s=s->next;//从头开始输出每个节点
			cout<<s->num<<"  "<<s->name<<"  "<<s->sex<<"  "<<s->pho<<"  "<<s->add<<endl;
		}
	}
}
void search_num(Llist L,int i)//通过编号进行检索
{
	lnode *s;
	s=L->next;//指向链表的头节点
	while(s&&i!=s->num)
	{
		s=s->next;//s指向链表的第一个数据节点,s沿着next指针向后移动
	}
	if(s!=NULL)
	{
		cout<<s->num<<"  "<<s->name<<"  "<<s->sex<<"  "<<s->pho<<"  "<<s->add<<endl;
	}
	else
		cout<<"查无记录"<<endl;
}
void search_name(Llist L,char n[10])//通过姓名进行检索
{
	lnode *s;
	s=L->next;
	if(s!=NULL){while(s&&strcmp(s->name,n))
		s=s->next;
	if(s!=NULL)
		cout<<s->num<<"  "<<s->name<<"  "<<s->sex<<"  "<<s->pho<<"  "<<s->add<<endl;
	else
		cout<<"查无记录!"<<endl;}
}
void search(Llist L)//设置是通过编号还是通过姓名查找数据
{
	int j,i;
	char n[10];
	cout<<"编号查找1  "<<"姓名查找2"<<endl;
	cin>>j;
	switch(j)
	{
	case 1: 
		cout<<"输入要查询的记录编码"<<endl; 
		cin>>i;
		search_num(L,i);//调用search num函数,查找数据
		break;
	case 2:
		cout<<"输入要查询的姓名"<<endl;
		cin>>n;
		search_name(L,n);//调用search name函数,查找数据
		break;
	default:
		cout<<"输入错误"<<endl;
	}
}
void del_num(Llist L,int i)//删除功能,通过编号删除
{
	lnode *p,*q;
	if(i<1)
	{
		cout<<"输入位置错误!"<<endl;
		return;
	}
	q=L;//指向链表的头节点
	p=L->next;//p指向链表的第一个数据节点
	while(p->next&&i!=p->num)//如果p没有到达链表的末尾,并且p的数据域不是i,则继续循环
	{
		q=p;
		p=p->next;//p沿着next指针向后移动,移动前p指向q
	}
	i除成功!"<<ef(p!=NULL)//删除p
	{
		q->next=p->next;//删除节点p
		delete p;
		cout<<"删ndl;
	}
	else
		cout<<"不存在该记录!"<<endl;
}
void del_name(Llist L,char n[10])//通过姓名删除
{
	lnode *p,*q;
	q=L;
	p=L->next;
	while(p&&strcmp(p->name,n))
	{
		q=p;
		p=p->next;
	}
	if(p!=NULL)
	{ 
		q->next=p->next;
		delete p;
		cout<<"删除成功!"<<endl;
		return;
	}
	else 
		cout<<"不存在该记录!"<<endl;
}
void del(Llist L)//编写是通过编号,还是通过姓名删除
{
	int j,i;
	char n[10];
	cout<<"编号删除1  "<<"姓名删除2"<<endl;
	cin>>j;
	switch(j)
	{
	case 1: 
		cout<<"输入要删除的记录编码"<<endl; 
		cin>>i;
		del_num(L,i);
		break;
	case 2:
		cout<<"输入要删除的姓名"<<endl;
		cin>>n;
		del_name(L,n);
		break;
	default:
		cout<<"输入错误"<<endl;
	}
}
void main()//主函数 包括界面设置
{
	Llist L;//申明链表L
	L=new lnode;
	cout<<endl;
	cout<<"                         欢迎使用通讯录管理系统"<<endl<<endl<<endl;
	cout<<"********************************************************************************";
	cout<<"                         请输入您要进行的操作序号:"<<endl;
	cout<<"                          操作前请先建立通讯录!"<<endl;
	cout<<"                            1、建立通讯录"<<endl;
	cout<<"                            2、插入通讯录"<<endl;
	cout<<"                            3、查询通讯录"<<endl;
	cout<<"                            4、通讯录删除"<<endl;
	cout<<"                            5、输出通讯录"<<endl;
	cout<<"                            6、退出系统"<<endl;
    cout<<"********************************************************************************"<<endl;
	while(1)
	{
		
		int q;
		cin>>q;
		switch(q)//swith语句
		{
		case 1:
			L=creat(L);break;
		case 2:
			Insert(L);break;
		case 3:
			search(L);break;
		case 4:
			del(L);break;
		case 5:
			output(L);break;
		case 6:
			exit(0);break;
		default:
			break;
		}
		system("pause");
		system("cls");
		cout<<endl;
		cout<<"                         欢迎使用通讯录管理系统"<<endl<<endl<<endl;
		cout<<"********************************************************************************";
		cout<<"                         请输入您要进行的操作序号:"<<endl;
		cout<<"                          操作前请先建立通讯录!"<<endl;
		cout<<"                            1、建立通讯录"<<endl;
		cout<<"                            2、插入通讯录"<<endl;
		cout<<"                            3、查询通讯录"<<endl;
		cout<<"                            4、通讯录删除"<<endl;
		cout<<"                            5、输出通讯录"<<endl;
		cout<<"                            6、退出系统"<<endl;
        cout<<"********************************************************************************"<<endl;
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力的10

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值