问题描述
为某个单位建立一个员工通讯录管理系统,可以方便查询每一个员工的办公室电话、手机号、及电子邮箱。其功能包括通讯录链表的建立、员工通讯信息的查询、修改、插入与删除、以及整个通讯录表的输出。
算法思想
建立一个结构体储存员工信息,作为链表的数据域。将每个功能分别写到一个函数里,供主函数调用。建立通讯录是从键盘输入信息,使用后插法储存在链表里;查找信息时从前往后遍历链表,使用字符串比较法进行比较来找到信息;删除信息的第一步就是查找到该信息,方法与查找信息相同,找到信息后定义一个结点保存其前驱,用删除结点的前驱直接指向它的后继,再把结点删除;插入结点使用前插法插入;修改结点信息时即是查找到该结点,然后重新输入该结点信息。主函数中使用while循环和switch对功能进行调用。
算法设计
1、新建通讯录Status CreatList(LinkList &L)——先从键盘输入要存入的员工个数,以便控制for循环的结束,然后按照提示从键盘依次输入员工信息,利用后插法插入链表中。
2、查找员工信息Status GetData(LinkList L)——从键盘输入员工编号或姓名,从前往后遍历链表,使用字符串比较法进行比较来找到信息。
3、删除员工信息Status DeleteData(LinkList &L)——从键盘输入员工编号或姓名,然后第一步就是查找到该信息,方法与查找信息相同,找到信息后定义一个结点保存其前驱,用删除结点的前驱直接指向它的后继,再把结点删除。
4、添加员工信息Status InsertData(LinkList &L)——依次输入新的员工信息,使用前插法插入到链表中。
5、修改员工信息Status ChangeData(LinkList &L)——查找到该结点,然后重新输入该结点信息。
6、输出全部信息Status AllPrint(LinkList L)——输出全部员工信息。
7、主函数int main()——使用while循环和switch对功能进行调用,使用清屏函数,使界面更理想。
代码实现
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
typedef int Status;
#define OK 1
#define ERROR 0
typedef struct {
char num[5];
char name[10];
char phone[15];
char call[15];
char mail[25];
}DataType;
typedef struct node
{ DataType data;
struct node *next;
}ListNode,*LinkList;
Status CreatList(LinkList &L)//创建通讯录
{
L=new ListNode;
L->next=NULL;
printf("请输入目前通讯录中将要存入的员工个数:\n");
LinkList p,r;
DataType d;
int n;
scanf("%d",&n);
r=L;
printf("请分别输入该员工的编号、姓名、办公室电话、手机号码和邮箱号:\n");
for(int i=0;i<n;i++){//后插法
p=new ListNode;
scanf("%s",d.num);
scanf("%s",d.name);
scanf("%s",d.phone);
scanf("%s",d.call);
scanf("%s",d.mail);
p->data=d;//赋值颠倒导致出错
p->next=NULL;
r->next=p;
r=p;
}
return OK;
}
Status GetData(LinkList L)//查找员工信息
{
printf("请输入该员工的编号或姓名:\n");
char c[10];
scanf("%s",c);
LinkList p;
p=L->next;
DataType da;
while(p){
da=p->data;
if(strcmp(c,da.num)==0||strcmp(c,da.name)==0)//搞错strcmp的用法
{
printf("该员工的信息如下:\n");
printf("编号:%s\n",da.num);
printf("姓名:%s\n",da.name);
printf("办公室电话:%s\n",da.phone);
printf("手机号码:%s\n",da.call);
printf("邮箱:%s\n",da.mail);
return OK;
}
p=p->next;
}
printf("查无此人\n");
return OK;
}
Status DeleteData(LinkList &L){//删除员工信息
printf("请输入该员工的编号或姓名:\n");
char c[10];
scanf("%s",c);
LinkList p,q;
p=L;
DataType da;
while(p->next){
q=p;
p=p->next;
da=p->data;
if(strcmp(c,da.num)||strcmp(c,da.name))//字符串比较
{
q->next=p->next;
delete p;
return OK;
}
}
return ERROR;
}
Status InsertData(LinkList &L)//添加员工信息
{
LinkList p;
printf("请分别输入该员工的编号、姓名、办公室电话、手机号码和邮箱号:\n");
p=new ListNode;
scanf("%s%s%s%s%s",p->data.num,p->data.name,p->data.phone,p->data.call,p->data.mail);
p->next=L->next;
L->next=p;
return OK;
}
Status ChangeData(LinkList &L){//修改员工信息
printf("请输入该员工的编号或姓名:\n");
char c[10];
scanf("%s",c);
printf("请输入该员工的新信息\n");
LinkList p;
p=L->next;
while(p){
if(strcmp(c,p->data.num)==0||strcmp(c,p->data.name)==0)
{
scanf("%s%s%s%s%s",p->data.num,p->data.name,p->data.phone,p->data.call,p->data.mail);
return OK;
}
p=p->next;
}
return ERROR;
}
Status AllPrint(LinkList L){//全部输出员工信息
LinkList p;
p=L->next;
printf("全部员工的信息如下:\n");
while(p){
printf("编号:%s\n",p->data.num);
printf("姓名:%s\n",p->data.name);
printf("办公室电话:%s\n",p->data.phone);
printf("手机号码:%s\n",p->data.call);
printf("邮箱:%s\n",p->data.mail);
p=p->next;
}
return OK;
}
int main(){
LinkList L;
int m;
while(m!=0)
{
printf("-----------员工通讯录系统-----------\n");
printf("0、退出系统\n");
printf("1、新建通讯录\n");
printf("2、查询员工信息\n");
printf("3、添加员工信息\n");
printf("4、删除员工信息\n");
printf("5、修改员工信息\n");
printf("6、输出全部员工信息\n");
printf("请输入您的选择:\n");
scanf("%d",&m);
switch(m){
case 0:
printf("感谢您的使用!\n");
return 0;
case 1:
if(CreatList(L))
printf("新建成功!\n");
else
printf("创建失败\n");
break;
case 2:
GetData(L);
break;
case 3:
if(InsertData(L))
printf("添加成功!\n");
else
printf("添加失败\n");;
break;
case 4:
if(DeleteData(L))
printf("删除成功!\n");
else
printf("查无此人\n");
break;
case 5:
if(ChangeData(L))
printf("修改成功!\n");
else
printf("查无此人\n");
break;
case 6:
AllPrint(L);
break;
default:
printf("没有该选项!\n");
break;
}
system("pause");//清屏
system("cls");
}
return 0;
}