简易通讯录系统
#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;
}
}