/**********************************************
*版权所有 (C)2015,jiaomengzhen
*
*文件名称:tongxunlu.cpp
*文件标识:无
*内容摘要:实现联系人的添加,删除,排序,修改,显示和查询。
*其他内容:无
*当前版本:V1.0
*作者:焦梦真
*完成日期:20151224
*
*修改记录:
*修改日期:20151224
*版本号:V1.0
*修改人:焦梦真
*修改内容:创建
*************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include "windows.h"
#define N 100
int n1=0;
int n2=0;
typedef struct
{
char name[10];
char sex[10];
char homeaddress[100];
char cellphone[15];
}AddressList;
AddressList t[N];
AddressList e;
typedef struct relatives
AddressList data;
struct relatives *next;
} Address;
Address *h;
void Menu();
void Input();
void Output();
void Delete();
void Sort();
void Correct();
void SecondMenu();
void NameFound();
void CellFound();
void InitList(Address *&L);
int ListInsert(Address *&L,int i,AddressList e);
void DispList(Address *L);
void CreateListR(Address *&L, AddressList a[],int n);
int ListEmpty(Address *L);
void DispName(Address *L);
int ListLength(Address *L);
int ListDelete(Address *&L,int i,AddressList &e);
int LocateElem1(Address *L,AddressList e);
int LocateElem2(Address *L,AddressList e);
int GetElem(Address *L,int i,AddressList &e);
void InsertSort(Address *L,int n);
void DestroyList(Address *&L);
int Name(Address *&L,int i,char newname[]);
int Sex(Address *&L,int i,char newsex[]);
int Cellphone(Address *&L,int i,char newcellphone[]);
int Homeaddress(Address *&L,int i,char newhomeaddress[]);
/******************************************************************************************
*功能描述:插入好友信息
*输入参数:n1—需添加的联系人个数
name—联系人姓名
sex—联系人性别
homeaddress—家庭住址
cellphone—联系电话
*输出参数:
*返回值:
*其他说明:消息字段之间用分号(;)分隔
******************************************************************************************/
void Input()
{
if (n1==0)
{
//int n1;
printf("\t*******************添加联系人功能的实现**********************\n");
printf("很高兴为您服务,请输入添加的联系人个数: ");
scanf("%d",&n1);
for (int i=0; i < n1; i++)
{ printf(" \n");
printf(" \n");
printf("请输入第%d个联系人的详细信息\n", i+1);
printf("姓 名: ");
scanf("%s", t[i].name);
printf("性 别: ");
scanf("%s", t[i].sex);
printf("家庭住址: ");
scanf("%s", t[i].homeaddress);
printf("联系电话: ");
scanf("%s", t[i].cellphone);
}
for (int j=0; j<n1; j++)
{
ListInsert(h,j+1,t[j]);
}
system("cls");
printf("**正在添加联系人,请稍后......\n");
for(int i1=0;i1<15;i1++)
{
Sleep(100);
printf("■");
}
system("cls");
printf("添加完成!\n");
}
else
{
n2 = n1;
printf("\t*******************添加联系人功能的实现**********************\n");
printf("很高兴为您服务,请输入需要添加的联系人个数: ");
scanf("%d",&n1);
for (int i=n2; i < n2+n1; i++)
{
printf("请输入第%d个联系人的详细信息\n", i+1);
printf("姓 名: ");
scanf("%s", t[i].name);
printf("性 别: ");
scanf("%s", t[i].sex);
printf("家庭住址: ");
scanf("%s", t[i].homeaddress);
printf("联系电话: ");
scanf("%s", t[i].cellphone);
for (int j=n2; j<n2+n1;j++)
{
ListInsert(h,j+1,t[j]);
//CreateListR(h,t,n1);
}
system("cls");
printf("**正在添加联系人,请稍后......\n");
for(int i2=0;i2<15;i2++)
{
Sleep(100);
printf("■");
}
system("cls");
printf("添加完成!\n");
}
n1 = n2+n1;
}
}
/******************************************************************************************
*功能描述:显示好友信息
*输入参数:
*输出参数:
*返回值:
*其他说明:消息字段之间用分号(;)分隔
******************************************************************************************/
void Output()
{
printf("显示好友信息功能\n");
printf("\n");
printf("通信录中所有联系人详细信息如下: \n");
DispList(h);
}
/******************************************************************************************
*功能描述:删除好友信息
*输入参数:m—想删除的联系人序号
*输出参数:
*返回值: 0—成功 其他—失败
*其他说明:消息字段之间用分号(;)分隔
******************************************************************************************/
void Delete()
{
int m;
printf("**********删除功能**********\n");
printf("%s\n",(ListEmpty(h)?"输入错误!通信录是空的!\n":"\n"));
printf("通信录中共有%d个联系!\n ",ListLength(h));
if(ListLength(h) == 0)
{
Menu();
}
else
{
printf("通信录中所有联系人姓名如下: \n");
DispName(h);
}
printf("请输入你想删除的联系人前面的序号(1——%d): ",ListLength(h));
scanf("%d",&m);
ListDelete(h,m,e);
printf("你删除的联系人的详细信息有: \n");
printf("*姓 名*:%s\n",e.name);
printf("*性 别*:%s\n",e.sex);
printf("*家庭住址*:%s\n",e.homeaddress);
printf("*联系电话*:%s\n",e.cellphone);
printf("**正在删除联系人,请稍后......\n");
for(int i2=0;i2<15;i2++)
{
Sleep(100);
printf("■");
}
system("cls");
printf("删除成功!\n");
}
/******************************************************************************************
*功能描述:按照姓名进行排序操作
*输入参数:
*输出参数:
*返回值:
*其他说明:消息字段之间用分号(;)分隔
******************************************************************************************/
void Sort()
{
printf("**********排序功能**********\n");
printf("%s\n",(ListEmpty(h)?"通信录是空的!\n":"\n"));
printf("通信录中共有%d个联系!\n ",ListLength(h));
InsertSort(h,ListLength(h));
}
/******************************************************************************************
*功能描述:修改好友信息
*输入参数:newsex—修改后的性别
newname—修改后的姓名
newcellphone—修改后的联系电话
newhomeaddress—修改后的家庭住址
num—需要修改的相应代码
*输出参数:无
*返回值:
*其他说明:消息字段之间用分号(;)分隔
******************************************************************************************/
void Correct()
{
char newsex[10];
char newname[10];
char newcellphone[15];
char newhomeaddress[100];
int num;
AddressList f;
printf("**********修改功能**********\n");
printf("%s\n",(ListEmpty(h)?"输入错误!通信录是空的!\n":"\n"));
printf("通信录中共有%d个联系!\n ",ListLength(h));
if(ListLength(h) == 0)
{
Menu();
}
else
{
printf("通信录中所有联系人姓名如下: \n");
DispName(h);
}
printf("请输入您需要修改的联系人姓名: ");
scanf("%s",f.name);
printf("您要修改的联系人的序号是%d\n",LocateElem1(h,f));
printf(" ***********************你具有的修改权限如下**************************\n");
printf(" ---------------------------------------------------------------------\n");
printf(" ||\t 1.姓 名 2.性 别 \t ||\n");
printf(" ||\t 3.家庭住址 4.联系电话 \t ||\n");
printf(" ---------------------------------------------------------------------\n");
printf("请输入您需要修改的相应代码: ");
scanf("%d",&num);
printf("\n");
if (num == 1)
{
printf("姓名修改: ");
scanf("%s",newname);
Name(h,LocateElem1(h,f),newname);
}
else if (num == 2)
{
printf("性别修改: ");
scanf("%s",newsex);
Sex(h,LocateElem1(h,f),newsex);
}
else if (num == 3)
{
printf("家庭住址修改: ");
scanf("%s",newhomeaddress);
Homeaddress(h,LocateElem1(h,f),newhomeaddress);
}
else if (num == 4)
{
printf("联系电话修改: ");
scanf("%s",newcellphone);
Cellphone(h,LocateElem1(h,f),newcellphone);
}
else
{
printf("没有其它选项,请重新输入!\n");
}
system("cls");
printf("**正在修改,请稍后......\n");
for(int i=0;i<15;i++)
{
Sleep(100);
printf("■");
}
system("cls");
printf("修改成功!\n");
Menu();
}
/******************************************************************************************
*功能描述:按照姓名查找信息
*输入参数:name—输入姓名进行查找
*输出参数:
*返回值:
*其他说明:消息字段之间用分号(;)分隔
******************************************************************************************/
void NameFound()
{
AddressList r;
AddressList f;
printf("按照姓名进行查找功能\n");
printf("请输入您想要查询的联系人姓名: ");
scanf("%s",f.name);
system("cls");
printf("**正在查询,请稍后......\n");
for(int i=0;i<15;i++)
{
Sleep(100);
printf("■");
}
system("cls");
printf("您要查找的联系人在通信录中的位置是%d\n",LocateElem1(h,f));//有问题没有解决
printf("%s的详细信息如下:\n",f.name);
GetElem(h,LocateElem1(h,f),r);
SecondMenu();
}
/******************************************************************************************
*功能描述:按照联系电话查找信息
*输入参数:cellphone—输入联系电话进行查找
*输出参数:无
*返回值:
*其他说明:消息字段之间用分号(;)分隔
******************************************************************************************/
void CellFound()
{
AddressList r;
AddressList f;
printf("按照手机号进行查找功能\n");
printf("请输入您想要查询的联系人手机号: ");
scanf("%s",f.cellphone);
system("cls");
printf("**正在查询,请稍后......\n");
for(int i=0;i<15;i++)
{
Sleep(100);
printf("■");
}
system("cls");
printf("你要查找的联系人在通信录中的位置是%d\n",LocateElem2(h,f));//有问题没有解决
printf("%s的详细信息如下:\n",f.cellphone);
GetElem(h,LocateElem2(h,f),r);
SecondMenu();
}
/******************************************************************************************
*功能描述:一级菜单
*输入参数:num2—菜单选择代码
*输出参数:
*返回值:
*其他说明:消息字段之间用分号(;)分隔
******************************************************************************************/
void Menu()
{
int num2;
printf("\t ┌─────────────────────────────────┐\n");
printf("\t │ │\n");
printf("\t │ *主菜单* │\n");
printf("\t │ │\n");
printf("\t │ 添加(1) * 删除(2) * 排序(3) * 修改(4) * 显示(5) * 查询(6) │\n");
printf("\t │ │\n");
printf("\t └─────────────────────────────────┘\n");
printf("很高兴为您服务,请输入您的选择(1、2、3、4、5、6): ");
scanf("%d",&num2);
system("cls");
if (num2 < 1 || num2 > 6)
{
printf("输入错误,请查证后再输入!/n");
printf("\t ┌─────────────────────────────────┐\n");
printf("\t │ │\n");
printf("\t │ *主菜单* │\n");
printf("\t │ │\n");
printf("\t │ 添加(1) * 删除(2) * 排序(3) * 修改(4) * 显示(5) * 查询(6) │\n");
printf("\t │ │\n");
printf("\t └─────────────────────────────────┘\n");
printf("很高兴为您服务,请输入您的选择(1、2、3、4、5、6): ");
scanf("%d", &num2);
}
switch (num2)
{
case 1: Input();
break;
case 2: Delete();
break;
case 3: Sort();
break;
case 4: Correct();
break;
case 5: Output();
break;
case 6: SecondMenu();
break;
}
Menu();
}
/******************************************************************************************
*功能描述:二级菜单
*输入参数:num3—菜单选择代码
*输出参数:
*返回值:
*其他说明:消息字段之间用分号(;)分隔
******************************************************************************************/
void SecondMenu() //二级菜单
{
int num3;
printf("\t ┌─────────────────────────────────┐\n");
printf("\t │ │\n");
printf("\t │ │\n");
printf("\t │ 返回主菜单(0) * 姓名查询(1) * 联系电话查询(2) │\n");
printf("\t │ │\n");
printf("\t │ │\n");
printf("\t └─────────────────────────────────┘\n");
printf("主人,请选择您需要的查询方式(0、1、2): ");
scanf("%d", &num3);
system("cls");
if (num3 < 0 || num3 > 2)
{
printf("输入错误,请查证后再输入!/n");
printf("\t ┌─────────────────────────────────┐\n");
printf("\t │ │\n");
printf("\t │ │\n");
printf("\t │ 返回主菜单(0) * 姓名查询(1) * 联系电话查询(2) │\n");
printf("\t │ │\n");
printf("\t │ │\n");
printf("\t └─────────────────────────────────┘\n");
printf("主人,请选择您需要的查询方式(0、1、2): ");
scanf("%d", &num3);
}
switch (num3)
{
case 0: Menu();
break;
case 1: NameFound();
break;
case 2: CellFound();
break;
}
}
/******************************************************************************************
*功能描述:main函数
*输入参数:
*输出参数:
*返回值:
*其他说明:消息字段之间用分号(;)分隔
******************************************************************************************/
void main()
{
InitList(h);
Menu();
DestroyList(h);
}
/******************************************************************************************
*功能描述:创建空的链表
*输入参数:L—指针
*输出参数:
*返回值:
*其他说明:消息字段之间用分号(;)分隔
******************************************************************************************/
void InitList(Address *&L)
{
L=(Address *)malloc(sizeof(Address));
L->next=NULL;
}
/******************************************************************************************
*功能描述:销毁线性表,修改信息
*输入参数:L—指针
*输出参数:
*返回值:
*其他说明:消息字段之间用分号(;)分隔
******************************************************************************************/
void DestroyList(Address *&L)
{
Address *p=L,*q=p->next;
while (q!=NULL)
{
free(p);
p=q;
q=p->next;
}
free(p);
}
/******************************************************************************************
*功能描述:向单链表中插入信息可以模拟成向通信录中添加联系人及其详细信息
*输入参数:L—指针
*输出参数:
*返回值: 0,1—成功 其他—失败
*其他说明:消息字段之间用分号(;)分隔
******************************************************************************************/
int ListInsert(Address *&L,int i,AddressList e)
{
int j=0;
Address *p=L,*s;
while (j<i-1 && p!=NULL)
{
j++;
p=p->next;
}
if (p==NULL) /*未找到第i-1个结点*/
return 0;
else /*找到第i-1个结点*p*/
{
s=(Address *)malloc(sizeof(Address)); /*创建新结点*s*/
//s->data=e;
strcpy(s->data.name , e.name);
strcpy(s->data.sex , e.sex);
strcpy(s->data.homeaddress , e.homeaddress);
strcpy(s->data.cellphone , e.cellphone);
s->next=p->next; /*将*s插入到*p之后*/
p->next=s;
s->next = NULL;//特别加的
//printf("添加完成!\n");
return 1;
}
}
/******************************************************************************************
*功能描述:输出线性表,当线性表不为空时,顺序显示各节点值域
*输入参数:L—指针
*输出参数:
*返回值:
*其他说明:消息字段之间用分号(;)分隔
******************************************************************************************/
void DispList(Address *L)//显示出现了问题
{
Address *p=L->next;
while (p!=NULL)
{
printf("*************************************\n");
printf("*姓 名*:%s\n",p->data.name);
printf("*性 别*:%s\n",p->data.sex);
printf("*家庭住址*:%s\n",p->data.homeaddress);
printf("*联系电话*:%s\n",p->data.cellphone);
printf("\n*************************************\n");
p=p->next;
}
printf("\n");
}
/******************************************************************************************
*功能描述:尾插法建表即建立通讯录
*输入参数:L—指针
a[]—数组
n—联系人个数
*输出参数:
*返回值:
*其他说明:消息字段之间用分号(;)分隔
******************************************************************************************/
void CreateListR(Address *&L, AddressList a[],int n)
{
Address * s, * r;
int i;
L = (Address *)malloc(sizeof(Address));
r = L;
for (i = 0; i < n; i++)
{
s = (Address *)malloc(sizeof(Address));
strcpy(s->data.name , a[i].name);
strcpy(s->data.sex , a[i].sex);
strcpy(s->data.homeaddress , a[i].homeaddress);
strcpy(s->data.cellphone , a[i].cellphone);
r->next = s;
r = s;
}
r->next = NULL;
}
/******************************************************************************************
*功能描述:判断线性表是否为空,即是判断通信录中是否有联系人
*输入参数:L—指针
*输出参数:
*返回值: L->next==NULL—成功 其他—失败
*其他说明:消息字段之间用分号(;)分隔
******************************************************************************************/
int ListEmpty(Address *L)
{
return(L->next==NULL);
}
/******************************************************************************************
*功能描述:显示通讯录所有联系人的姓名
*输入参数:L—指针
*输出参数:
*返回值:
*其他说明:消息字段之间用分号(;)分隔
******************************************************************************************/
void DispName(Address *L)
{
int i=1;
Address *p=L->next;
while (p!=NULL)
{
printf("<%d>.%s\n",i,p->data.name);
p=p->next;
i = i+1;
}
printf("\n");
}
/******************************************************************************************
*功能描述:求线性表的长度即联系人个数
*输入参数:L—指针
*输出参数:
*返回值: —成功 其他—失败
*其他说明:消息字段之间用分号(;)分隔
******************************************************************************************/
int ListLength(Address *L)
{
Address *p=L;int i=0;
while (p->next!=NULL)
{
i++;
p=p->next;
}
return(i);
}
/******************************************************************************************
*功能描述:删除单链表中的数据元素可以模拟成删除通信录中联系人及其所有的详细信息。
*输入参数:L—指针
i—联系人个数
e—指针
*输出参数:
*返回值: 0,1—成功 其他—失败
*其他说明:消息字段之间用分号(;)分隔
******************************************************************************************/
int ListDelete(Address *&L,int i,AddressList &e)
{
int j=0;
Address *p=L,*q;
while (j<i-1 && p!=NULL)
{
j++;
p=p->next;
}
if (p==NULL) /*未找到第i-1个结点*/
return 0;
else /*找到第i-1个结点*p*/
{
q=p->next; /*q指向要删除的结点*/
if (q==NULL)
return 0;
strcpy(e.name , q->data.name);
strcpy(e.sex , q->data.sex);
strcpy(e.homeaddress , q->data.homeaddress);
strcpy(e.cellphone , q->data.cellphone);
p->next=q->next; /*从单链表中删除*q结点*/
free(q); /*释放*q结点*/
n1=n1-1;
return 1;
}
}
/******************************************************************************************
*功能描述:知道数据元素在单链表中的位置,相当于知道通信录中联系人所处的位置。
*输入参数:L—指针
e—指针
*输出参数:
*返回值: n成功 其他—失败
*其他说明:消息字段之间用分号(;)分隔
******************************************************************************************/
int LocateElem1(Address *L,AddressList e)
{
Address *p=L->next;
int n=1;
while (p!=NULL && strcmp(p->data.name,e.name) != 0)
{
p=p->next;
n++;
}
if (p==NULL)
return(0);
else
return(n);
}
/******************************************************************************************
*功能描述:知道数据元素在单链表中的位置,相当于知道通信录中联系人所处的位置。
*输入参数:L—指针
e—指针
*输出参数:
*返回值: 0,n—成功 其他—失败
*其他说明:消息字段之间用分号(;)分隔
******************************************************************************************/
int LocateElem2(Address *L,AddressList e)
{
Address *p=L->next;
int n=1;
while (p!=NULL && strcmp(p->data.cellphone,e.cellphone) != 0)
{
p=p->next;
n++;
}
if (p==NULL)
return(0);
else
return(n);
}
/******************************************************************************************
*功能描述:查找某个位置的数据元素可以模拟成通信录中定位
*输入参数:L—指针
i—联系人个数
e—指针
*输出参数:
*返回值: 0,1—成功 其他—失败
*其他说明:消息字段之间用分号(;)分隔
******************************************************************************************/
int GetElem(Address *L,int i,AddressList &e)
{
int j=0;
Address *p=L;
while (j<i && p!=NULL)
{
j++;
p=p->next;
}
if (p==NULL)
return 0;
else
{
// e=p->data;
printf("******************************\n");
strcpy(e.name , p->data.name);
printf("*姓 名*: %s\n",e.name);
strcpy(e.sex , p->data.sex);
printf("*性 别*: %s\n",e.sex);
strcpy(e.homeaddress , p->data.homeaddress);
printf("*家庭住址*: %s\n",e.homeaddress);
strcpy(e.cellphone , p->data.cellphone);
printf("*联系电话*: %s\n",e.cellphone);
printf("******************************\n");
return 1;
}
}
/******************************************************************************************
*功能描述:按照姓名进行排序
*输入参数:L—指针
n—序号
sout—数组
tmp—数组
*输出参数:
*返回值:
*其他说明:消息字段之间用分号(;)分隔
******************************************************************************************/
void InsertSort(Address *L,int n)
{
AddressList sort[10];
char tmp[10];
//int i=1;
Address *p=L->next;
while (p!=NULL)
{
for (int j = 0; j < n; j++)
{
strcpy(sort[j].name,p->data.name);
// printf("%s",sort[j].name);
p=p->next;
// i = i+1;
}
}
printf("\n");
for (int i1 = 0; i1 < n; i1++)
{
strcpy(tmp,sort[i1].name);
int i2 = i1-1;
while (i2 >= 0 && strcmp(tmp,sort[i2].name)<0)
{
strcpy(sort[i2+1].name,sort[i2].name);
i2--;
}
strcpy(sort[i2+1].name,tmp);
}
printf("按姓名进行排序的结果如下: \n");
for (i1 = 0; i1 < n; i1++)
{
printf("<%d>.%s\n",i1,sort[i1].name);
}
}
/******************************************************************************************
*功能描述:修改联系人的姓名
*输入参数:L—指针
i—联系人个数
*输出参数:newname—修改后的姓名
*返回值: 0,1—成功 其他—失败
*其他说明:消息字段之间用分号(;)分隔
******************************************************************************************/
int Name(Address *&L,int i,char newname[])
{
int j=0;
Address *p=L,*q;
while (j<i-1 && p!=NULL)
{
j++;
p=p->next;
}
if (p==NULL) /*未找到第i-1个结点*/
return 0;
else /*找到第i-1个结点*p*/
{
q=p->next; /*q指向要删除的结点*/
if (q==NULL)
return 0;
strcpy(q->data.name,newname);
return 1;
}
}
/******************************************************************************************
*功能描述:修改联系人的性别
*输入参数:L—指针
i—联系人个数
*输出参数:newsex—修改后的姓名
*返回值: 0,1—成功 其他—失败
*其他说明:消息字段之间用分号(;)分隔
******************************************************************************************/
int Sex(Address *&L,int i,char newsex[])
{
int j=0;
Address *p=L,*q;
while (j<i-1 && p!=NULL)
{
j++;
p=p->next;
}
if (p==NULL) /*未找到第i-1个结点*/
return 0;
else /*找到第i-1个结点*p*/
{
q=p->next; /*q指向要删除的结点*/
if (q==NULL)
return 0;
strcpy(q->data.sex,newsex);
return 1;
}
}
/******************************************************************************************
*功能描述:修改联系人的电话
*输入参数:L—指针
i—联系人个数
*输出参数:newname—修改后的联系电话
*返回值: 0,1—成功 其他—失败
*其他说明:消息字段之间用分号(;)分隔
******************************************************************************************/
int Cellphone(Address *&L,int i,char newcellphone[])
{
int j=0;
Address *p=L,*q;
while (j<i-1 && p!=NULL)
{
j++;
p=p->next;
}
if (p==NULL) /*未找到第i-1个结点*/
return 0;
else /*找到第i-1个结点*p*/
{
q=p->next; /*q指向要删除的结点*/
if (q==NULL)
return 0;
strcpy(q->data.cellphone,newcellphone);
return 1;
}
}
/******************************************************************************************
*功能描述:修改联系人的家庭住址
*输入参数:L—指针
i—联系人个数
*输出参数:newname—修改后的家庭住址
*返回值: 0,1—成功 其他—失败
*其他说明:消息字段之间用分号(;)分隔
******************************************************************************************/
int Homeaddress(Address *&L,int i,char newhomeaddress[])
{
int j=0;
Address *p=L,*q;
while (j<i-1 && p!=NULL)
{
j++;
p=p->next;
}
if (p==NULL) /*未找到第i-1个结点*/
return 0;
else /*找到第i-1个结点*p*/
{
q=p->next; /*q指向要删除的结点*/
if (q==NULL)
return 0;
strcpy(q->data.homeaddress,newhomeaddress);
return 1;
}
}