编程思路:使用链表编写,使用文件保存数据;
程序流程:
- 建立或打开一个通讯录
- 进入通讯录界面,在通讯录界面里进行通讯录功能的选择和通讯录的退出
具体过程:
通讯录的创建:
变量设置:头指针(用于指向链表的头结点)
typedef struct //定义头指针
{
Node *Lptr; //指向头结点
int len; //链表长度即联系人个数
}Ltop;
联系人结构体(用于保存联系人的信息)
typedef struct Node //定义联系人的结构体
{
char name[lenthofname]; //保存联系人姓名
char number[lenthofnumber]; //保存联系人号码
cahr addr[lenthofaddr]; //保存联系人地址
struct Node *next; //指向下一个联系人
}Node;
通讯录初始化函数建立:
//通讯录初始化函数
Status Initcontact(Ltop *L)
{
Node *p=(Node *)malloc(sizeof(Node));//申请一个头结点
L->Lptr=p; //头指针指向头结点
FILE *file; //打开通讯录数据文件
Node buf[1024];
file=fopen("contact.txt","r");
if(file==NULL)
{
perror("fopen");
return 1;
}
int count=fread(buf,sizeof(Node),1024,file);//把数据读取到缓存区里,count为读到联系人个数
if(count==EOF)
{
perror("fread");
fclose(file);
return 3;
}
fclose(file); //关闭文件
int i;
for(i=0;i<count;i++) //由头节点开始建立链表
{
p->next=&buf[i];
p=p->next;
}
p->next=NULL;
L->len=count; //保存联系人个数
printf("初始化通讯录成功!\n");
return OK;
}
对通讯录的操作:
添加联系人:
//添加联系人
Status Add(Ltop *L,Elemtype *name,Elemtype *number,Elemtype *addr)//传入通讯录的头指针,新建联系人的姓名,号码,地址
{
Node *p=(Node *)malloc(sizeof(Node));//为新建联系人申请空间
if(p==NULL)
{
printf("添加联系人失败!\n");
return ERROR;
}
int i;
for(i=0;i<lenthofname;i++) //清空姓名
{
p->name[i]='\0';
}
for(i=0;i<lenthofnumber;i++) //清空号码
{
p->number[i]='\0';
}
for(i=0;i<lenthofaddr;i++) //清空地址
{
p->addr[i]='\0';
}
for(i=0;i<lenthofname&&name[i]!='\0';i++) //新建联系人的姓名
{
p->name[i]=name[i];
}
for(i=0;i<lenthofnumber&&number[i]!='\0';i++) //新建联系人的号码
{
p->number[i]=number[i];
}
for(i=0;i<lenthofaddr&&addr[i]!='\0';i++) //新建联系人的地址
{
p->addr[i]=addr[i];
}
Node *tmp=L->Lptr;
while(tmp->next!=NULL) //将tmp指针移到通讯录最后面
{
tmp=tmp->next;
}
tmp->next=p; //将新建联系人添加到通讯录最后面
p->next=NULL;
L->len++; //通讯录长度加一
return OK;
}
删除联系人 :
//删除联系人
Status Delete(Ltop *L,Elemtype *name)
{
if(L->len==0)
{
printf("当前通讯录为空,删除失败!\n");
return ERROR;
}
Node *tmp=L->Lptr ; //tmp指向头结点
while(strcmp(tmp->next->name,name)!=0)
{
tmp=tmp->next;
if(tmp->next==NULL)
{
printf("无该联系人,删除失败!\n");
return ERROR;
}
} //tmp指向待删除联系人的前一个联系人或头结点
int i;
Node *tmp1;
tmp1=tmp->next; //tmp1指向待删除联系人
strcpy(name,tmp1->name); //获取待删除联系人的姓名
tmp->next=tmp1->next; //删除待删除联系人
//free(tmp1);
L->len--;
printf("已经删除联系人:%s",name);
return OK;
}
根据姓名查找号码:
扫描二维码关注公众号,回复:
2228073 查看本文章
//根据姓名查找号码
Status Getnumber(Ltop *L,Elemtype *name)
{
if(L->len==0)
{
printf("当前通讯录为空,查找失败!\n");
return ERROR;
}
Node *tmp=L->Lptr ; //tmp指向头结点
while(strcmp(tmp->next->name,name)!=0)
{
tmp=tmp->next;
if(tmp->next==NULL)
{
printf("无该联系人,查找失败!\n");
return ERROR;
}
} //tmp指向所查找联系人的前一个联系人或头结点
printf("该联系人号码:%s\n",tmp->next->number);
return OK;
}
按联系人姓名首字母排序显示联系人 :
//选择排序函数
void swap(Node * a[],int i,int j)
{
Node * tmp;
tmp=a[i];
a[i]=a[j];
a[j]=tmp;
}
void Selsct_sort(Node * a[],int len)
{
int i,j,min;
for(i=1;i<=len-1;i++)
{
min=i-1;
for(j=i;j<len;j++)
{
if(strcmp(a[min]->name,a[j]->name)>0)
{
min=j;
}
}
if(min!=i-1)
{
swap(a,min,i-1);
}
}
}
//按联系人姓名首字母排序显示联系人
Status Selsct_sort_linkman(Ltop *L)
{
if(L->len==0)
{
printf("当前通讯录为空!\n");
return ERROR;
}
Node *tmp=L->Lptr->next; //tmp指向第一个联系人
Node * address[MAXSIZE]={NULL}; //定义联系人首地址数组,并初始化
int i;
for(i=0;i<L->len&&i<MAXSIZE;i++) //对联系人首地址数组赋值
{
address[i]=tmp;
tmp=tmp->next;
}
Selsct_sort(address,i); //排序
printf("联系人个数:%d\n",L->len); //显示联系人
for(i=0;i<L->len;i++)
{
printf("\n");
printf("姓名:");
puts(address[i]->name);
printf("号码:");
puts(address[i]->number);
printf("地址:");
puts(address[i]->addr);
}
return OK;
}
显示全部联系人:
//显示全部联系人
Status Display(Ltop *L) //传入通讯录的头指针
{
printf("联系人个数:%d\n",L->len);
if(L->len==0)
{
printf("当前通讯录为空!\n");
return ERROR;
}
int i;
Node *tmp=L->Lptr->next ; //指向第一个联系人
for(i=1;i<=L->len;i++)
{
printf("\n");
printf("姓名:");
puts(tmp->name);
printf("号码:");
puts(tmp->number);
printf("地址:");
puts(tmp->addr);
tmp=tmp->next; //指向下一个联系人
}
return OK;
}
退出通讯录:
Status Exitcontact(Ltop *L)
{
Node buf[1024];
Node *tmp=L->Lptr->next;
int i;
for(i=0;tmp!=NULL&&i<1024;i++)
{
strcpy(buf[i].name,tmp->name);
strcpy(buf[i].number,tmp->number);
strcpy(buf[i].addr,tmp->addr);
tmp=tmp->next;
}
FILE *file;
file=fopen("contact.txt","w+");
if(file==NULL)
{
perror("fopen");
return 1;
}
int count=fwrite(buf,sizeof(Node),L->len,file);
if(EOF==count)
{
error("fwrite");
fclose(file);
return 2;
}
fclose(file);
return OK;
}
运行结果部分截图 :