一、实验目的
1)熟悉并掌握线性表的逻辑结构、物理结构;
2)熟悉并掌握线性链表的存储结构、基本操作和具体函数的定义;
二、实验内容
设计一个含有多个菜单项的主菜单程序,然后再为这些菜单项配上相应的功能,实现通讯录所有操作的管理。
1)通讯录链表的建立。
2)通讯者信息的插入
3)通讯者信息的查找,查找成功,将查找者的信息输出。
4)通讯者记录的删除,要求先进行通讯者的查找,查找成功后确定是否删除。确定之后才实现删除功能。
5)通讯者信息修改,先输入通讯者关键信息进行查询(如编号、身份证号码、姓名等),查找到进行修改,查找不到返回无此通讯者信息;
6)通讯录链表的显示,按照编号有序输出所有通讯者的信息。
三、实验步骤
1)定义单链表;
2)初始链表;
3)定义main函数,实现通讯录菜单;
4)定义插入通讯录信息函数;
5)定义查询通讯录信息函数;
6)定义删除通讯录信息函数;
7)定义修改通讯录信息函数。
四、算法流程图
流程图1
流程图2
流程图3
五、实现代码
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#define N 100
typedef struct{ //通讯录结点类型,应包含,编号、姓名、联系方式、通讯地址等信息
char num[N];//编号
char name[N];//姓名
char phone[N];//电话号码
char add[N];//地址
}DataType;
typedef struct node { //结点类型定义——单链表(数据域、指针域)
DataType data;
struct node *next;
}ListNode,*LinkList;
typedef ListNode *LinkList; //定义单链表
LinkList head;
ListNode *p;
void CreateList(LinkList &L){ //尾插法建立带头结点的通讯录链表算法
int i,n;
L=(LinkList)malloc(sizeof(ListNode));
ListNode *p,*q=L;
printf("请输入员工人数:");
scanf("%d",&n);
for (i=1;i<=n;i++){
p=(LinkList)malloc(sizeof(ListNode));
printf("请输入第%d个员工信息:\n",i);
printf("编号:");//输入元素值
scanf("%s",p->data.num);
printf("姓名:");
scanf("%s",p->data.name);
printf("联系方式:");
scanf("%s",p->data.phone);
printf("通讯地址:");
scanf("%s",p->data.add);
p->next=q->next;
q->next=p;
q=p;
}
q->next=NULL;
}
void InsertNode(LinkList &head)//插入员工信息
{
ListNode *p,*q;
q=head->next;
p=new ListNode[sizeof(ListNode)];//创建一个新节点
printf("请输入要插入的员工信息:\n");
printf("编号:");
scanf("%s",p->data.num);
while (q){
if (strcmp(q->data.num,p->data.num)==0){
printf("该员工已存在!");
break ;
}
q=q->next;
}
if (q==NULL){
printf("姓名:");
scanf("%s",p->data.name);
printf("联系方式:");
scanf("%s",p->data.phone);
printf("通讯地址:");
scanf("%s",p->data.add);
p->next=head->next;
head->next=p;
}
}
void revise(LinkList &head)//修改员工信息
{
ListNode *p;
p=head->next;
int k=0;
char num1[N];
printf("请输入需要修改员工的编号:");
scanf("%s",&num1);
while(p){
if (strcmp(p->data.num,num1)==0){
k=1;
break;
}
p=p->next;
}
if (k){
printf("请输入修改后的员工信息:\n");
printf("姓名:");
scanf("%s",p->data.name);
printf("联系方式:");
scanf("%s",p->data.phone);
printf("通讯地址:");
scanf("%s",p->data.add);
}else{
printf("编号为%s的员工不存在!\n",num1);
}
}
void PrintList(LinkList &head) //输出链表
{
ListNode P;
p=head->next;
printf("编号\t姓名\t联系方式\t通讯地址\n");
while (p){
printf("%s\t",p->data.num);
printf("%s\t",p->data.name);
printf("%s\t\t",p->data.phone);
printf("%s",p->data.add);
printf("\n");
p=p->next;
}
}
void ListFind1(LinkList head)
{// 有序通讯录链表上的查找
ListNode *p;
int op;
char num1[N],name1[N];
p=head->next;
int k=0;
printf("==================\n");
printf(" 1. 按编号查询 \n");
printf(" 2. 按姓名查询 \n");
printf("==================\n");
printf("请选择:");
scanf("%d",&op);
switch (op){
case 1:{
printf("请输入需要查找的员工编号:");
scanf("%s",&num1);
while (p){
if (strcmp(p->data.num,num1)==0){
k=1;
break;
}
p=p->next;
}
if (k){
printf("编号:%s\n",p->data.num);
printf("姓名:%s\n",p->data.name);
printf("联系方式:%s\n",p->data.phone);
printf("通讯地址:%s\n",p->data.add);
printf("\n");
}
else{
printf("编号为%s的员工不存在!\n",num1);
}
break;
}
case 2:{
printf("请输入需要查找的员工姓名:");
scanf("%s",&name1);
while (p){
if (strcmp(p->data.name,name1)==0){
k=1;
break;
}
p=p->next;
}
if (k){
printf("编号:%s\n",p->data.num);
printf("姓名:%s\n",p->data.name);
printf("联系方式:%s\n",p->data.phone);
printf("通讯地址:%s\n",p->data.add);
printf("\n");
}
else{
printf("姓名是%s的员工不存在!\n",name1);
}
break;
}
}
}
void DelNode(LinkList &head)
{
ListNode *p=head->next;
ListNode *q=head;
int op;
char a;
char num1[N],name1[N];
p=head->next;
printf("==================\n");
printf(" 1. 按编号查询 \n");
printf(" 2. 按姓名查询 \n");
printf("==================\n");
printf("请选择:");
scanf("%d",&op);
switch (op){
case 1:{
printf("请输入需要删除的员工编号:");
scanf("%s",&num1);
while (p&&strcmp(p->data.num,num1)!=0){
p=p->next;
q=q->next;
}
if (p==NULL) {
printf("没有查到要删除的通讯者!\n");
break ;
}
if (p){
printf("真的要删除该员工吗?(y/n):\n");
//待续…………………………
printf("请选择:");
scanf("%s",&a);
if (a=='y'){
printf("删除成功!");
q->next=p->next;
free(p);
}
}
else if(a=='n') break ;
break;
}
case 2:{
printf("请输入需要删除的员工姓名:");
scanf("%s",&name1);
while (p&&strcmp(p->data.name,name1)!=0){
p=p->next;
q=q->next;
}
if (p==NULL) {
printf("没有查到要删除的通讯者!\n");
break ;
}
if (p){
printf("真的要删除该员工吗?(y/n):\n");
//待续…………………………
printf("请选择:");
scanf("%s",&a);
if (a=='y'){
printf("删除成功!");
q->next=p->next;
free(p);
}
}
else if(a=='n') break ;
break;
}
}
}
//主函数
int main()
{
//良好的菜单引导程序功能
//如1:建立;2:添加;3:查询;4删除;5:修改;6:显示;0:退出;
LinkList L;
int op;
printf("**************通讯录*************\n");
printf("\t1、建立员工信息\n\t2、添加员工信息\n\t3、查询员工信息\n\t4、删除员工信息\n\t5、修改员工信息\n\t6、显示通讯录\n\t0、退出系统\n");
printf("**********************************\n");
while (1){
printf("请选择相应的功能:");
scanf("%d",&op);
if (op==0) break;
switch (op){
case 1:{
CreateList(L);
printf("\n");
break;
}
case 2:{
InsertNode(L);
printf("\n");
break;
}
case 3:{
ListFind1(L);
printf("\n");
break;
}
case 4:{
DelNode(L);
printf("\n");
break;
}
case 5:{
revise(L);
printf("\n");
break;
}
case 6:{
PrintList(L);
printf("\n");
break;
}
}
}
return 0;
}
六、运行结果及分析
1、建立员工信息(经验证员工信息建立成功)
图 1 建立员工信息
图 2显示通讯录
2、查询员工信息(按编号查询或按姓名查询)
1.如果输入不存在的员工编号或姓名,则输出员工不存在。
2.如果输入的员工编号或姓名存在,则输出对应的员工信息
3、删除员工信息(按编号删除或按姓名删除)
1.如果输入不存在的员工编号或姓名,则输出员工不存在。
2.如果输入的员工编号或姓名存在,则删除对应的员工信息
(在删除前还会询问是否真的要删除该员工(y/n),如果选择y,则删除员工,如果输入n则退出删除系统)
经检验,对应员工已被删除。
4、添加员工信息
1.如果输入的员工编号已存在,则输出该员工已存在。
2.如果输入员工编号不重复,则添加该员工信息(经验证,该员工已添加)
5、修改员工信息
1.如果输入员工编号不存在,则输出员工不存在。
2.如果输入员工编号存在,则输入需要修改的员工信息(经验证员工信息修改成功)
6、退出员工信息管理系统