在C语言的学习过程中,经常会让我们自己编写一个小项目,其中,通讯录的编写就是其中的一个经典作业。下面我就献上自己编写的通讯录代码。
注:本程个人亲测有效,没有任何问题,可以实现以下的基本的功能。
1:添加个人信息;
2:查询个人信息,可供两种选择方法,一种按姓名查询,一种按电话号码查询;
3:删除个人信息;
4:修改个人信息;
5:实现信息排序;
6:输出全部信息;
7:采用文件形式对通讯录进行操作,包括 写入文件 和 读取文件 ,从而保证能对添加的联系人进行保存。即在下一次打开vim编辑器的时候,依旧能看到上次添加的联系人的相关信息。
#include
#include
#include
#define FALSE 0
#define TRUE 1
#define MAXSIZE 20
typedef int Status;
typedef char Elemtype;
typedef struct Node
{
Elemtype name[MAXSIZE];
Elemtype number[MAXSIZE];
Elemtype sex[MAXSIZE];
struct Node *next;
}Node;
typedef Node *Linklist;
Status Inserlist(Linklist *Lp); //插入联系人
void Initlist(Linklist *Lp);//对链表进行初始化
void mydisplay(Linklist *Lp); //显示通讯录
void Deletelist(); //删除联系人
Status Findlist(Linklist *Lp); //查找联系人
void Reviselist(); //修改联系人
Status Sortlist();//对通讯录进行排序
Status Length();//判断文件字符个数
void savelinkman();//保存链表中的结点到文件
void loadlinkman(Linklist Lp);//加载联系人
int main()
{
printf("*************************\n");
Linklist Lp;
Initlist(&Lp);
loadlinkman(Lp);//调用加载联系人到链表的函数,确保显示联系人的时候,链表不为空
int sel;
Elemtype a[MAXSIZE],b[MAXSIZE];
while(1)
{
printf("\t\tmenu: \n");
printf("\t\t1:添加联系人\n");
printf("\t\t2:查找联系人\n");
printf("\t\t3:删除联系人\n");
printf("\t\t4:修改联系人\n");
printf("\t\t5:显示联系人\n");
printf("\t\t6:对通讯录进行排序\n");
printf("\t\t7:保存并退出通讯录\n");
printf("请输入要执行的功能所对应的序号,以回车键结束!\n");
scanf("%d",&sel);
getchar();
switch(sel)
{
case 1:
Inserlist(&Lp);
printf("*************************\n");//无实际意义,仅为输出界面美化
break;
case 2:
Findlist(&Lp);
printf("*************************\n");
break;
case 3:
Deletelist(&Lp);
printf("*************************\n");
break;
case 4:
Reviselist(&Lp);
printf("************************\n");
break;
case 5:
mydisplay(&Lp);
printf("*************************\n");
break;
case 6:
Sortlist(&Lp);
printf("**************************\n");
break;
case 7:
printf("*************************\n");
savelinkman(Lp);
system("clear");
printf("成功退出!\n联系人已保存!\n");
return;
default:
break;
}
}
return 0;
}
/***********初始化***********/
void Initlist(Linklist *Lp)
{
Node *p=(Node *)malloc(sizeof(Node));
if (p==NULL)
{
printf("申请失败");
return;
}
else
{
*Lp=p;
p->next==NULL;
}
}
/************添加联系人***********/
Status Inserlist(Linklist *Lp)//添加联系人
{
Node *p=(Node *)malloc(sizeof (Node));
if(p==NULL)
{
printf("申请失败");
return FALSE;
}
else
{
Elemtype a[MAXSIZE];
Elemtype b[MAXSIZE];
Elemtype c[MAXSIZE];
printf("请输入要保存的联系人名字:\n");
scanf("%s",a);
printf("请输入要保存的联系人号码:\n");
scanf("%s",b);
printf("请输入要保持的联系人性别:\n");
scanf("%s",c);
Linklist L=*Lp;
while(L!=NULL && L->next!=NULL)
{
L=L->next;
}
strcpy(p->name,a);
strcpy(p->number,b);
strcpy(p->sex,c);
L->next=p;
p->next=NULL;
}
}
/***********显示通讯录*********/
void mydisplay(Linklist *Lp)//显示通讯录
{
printf("姓名 号码 性别 \n");
Linklist l=(*Lp)->next;
while(l!=NULL)
{
printf("%-15s%-15s%-15s\n",l->name,l->number,l->sex);
l=l->next;
}
}
/************查找联系人***********/
Status Findlist(Linklist *Lp)//查找联系人
{
printf("请输入查询方式:\n 1:按姓名查询\n 2:按电话号码查询\n");
int c=0;
int sel;
Elemtype a[MAXSIZE];
Elemtype b[MAXSIZE];
while(1)
{
scanf("%d",&sel);
getchar();
switch(sel)
{
case 1 :
printf("请输入要查询的联系人姓名:\n");
scanf("%s",a);
Linklist p=(*Lp)->next;
while(p!=NULL)
{
if(strcmp(p->name,a)==0)
{
printf("姓名 号码 性别\n");
printf("%-15s%-15s%-15s\n",p->name,p->number,p->sex);
c=1;
}
p=p->next;
}
if(c==0)
{
printf("该联系人不存在的哟!\n");
}
return;
case 2 :
printf("请输入要查询人的电话号码:\n");
scanf("%s",b);
Linklist q=(*Lp)->next;
while(q!=NULL)
{
if(strcmp(q->number,b)==0)
{
printf("姓名 号码 性别\n");
printf("%-15s%-15s%-15s\n",q->name,q->number,q->sex);
c=1;
}
q=q->next;
}
if(c==0)
{
printf("该电话号码不存在的哟!\n");
}
return;
default :
printf("无此查询方式\n");
return;
}
}
}
/*************删除联系人**************/
void Deletelist(Linklist *Lp)//删除联系人
{
if( (*Lp)->next==NULL )
{
printf("当前通讯录为空,无法执行!\n");
}
else
{
int b=0;
Elemtype a[MAXSIZE];
printf("请输入要删除的联系人\n");
scanf("%s",a);
Linklist q;
Linklist p=*Lp;
while(p!=NULL && p->next!=NULL)
{
if(strcmp(p->next->name,a)==0)
{
q=p->next;
p->next=p->next->next;
free(q);
b=1;
}
p=p->next;
}
if(b==0)//判断循环是否执行,没执行的话,说明该联系人不存在。
printf("该联系人不存在的哟!\n");
}
}
/***********修改联系人***********/
void Reviselist(Linklist *Lp)//修改联系人
{
Node *q=(Node *)malloc(sizeof (Node));
if(q==NULL)
{
printf("申请失败");
}
if((*Lp)->next==NULL)
{
printf("当前通讯录为空,无法执行!\n");
}
else
{
int i=0;
Elemtype a[MAXSIZE];
Elemtype b[MAXSIZE];
Elemtype c[MAXSIZE];
Elemtype d[MAXSIZE];
printf("请输入要修改的联系人姓名:\n");
scanf("%s",a);
Linklist h;
Linklist p=*Lp;
while(p!=NULL && p->next!=NULL)
{
if(strcmp(p->next->name,a)==0)
{
printf("请输入修改后的联系人姓名:\n");
scanf("%s",b);
printf("请输入修改后的联系人号码:\n");
scanf("%s",c);
printf("请输入修改后的联系人性别:\n");
scanf("%s",d);
strcpy(q->name,b);
strcpy(q->number,c);
strcpy(q->sex,d);
h=p->next;
q->next=p->next->next;
p->next=q;
free(h);
i=1;
}
p=p->next;
}
if(i==0)
printf("你要修改的联系人不存在的哟!\n");
}
}
/**********对联系人进行排序***********/
Status Sortlist(Linklist *Lp)//使用冒泡排序对通讯录进行排序
{
if(*Lp==NULL)
{
printf("当前通讯录为空!\n");
return FALSE;
}
char name[20];
Node tmp,*r,*p,*q;
r=(*Lp)->next;
while(r)
{
p=r;
q=r->next;
while(q)
{
if(( strcmp(p->name,q->name)>0 ))
{
strcpy(tmp.name,q->name);
strcpy(q->name,p->name);
strcpy(p->name,tmp.name);
strcpy(tmp.number,q->number);
strcpy(q->number,p->number);
strcpy(p->number,tmp.number);
strcpy(tmp.sex,q->sex);
strcpy(q->sex,p->sex);
strcpy(p->sex,tmp.sex);
}
q=q->next;
}
r=r->next;
}
printf("姓名 号码 性别\n");
Linklist l=(*Lp)->next;
while(l!=NULL)
{
printf(" %-15s%-15s%-15s\n",l->name,l->number,l->sex);
l=l->next;
}
return TRUE;
}
Status Length(FILE *f) //文件字符个数
{
int length;
fseek(f,0,2);
length = ftell(f);
rewind(f);
return length;
}
void savelinkman(Linklist Lp) //保存链表中的各节点到文件
{
FILE *file=fopen("通讯录","w+");
if(file==NULL)
{
perror("fopen1");
exit(1);
}
char name[MAXSIZE]={0};
char number[MAXSIZE]={0};
char sex[MAXSIZE]={0};
Linklist temp = Lp;
while(temp->next!=NULL)
{
strcpy(name,temp->next->name);
strcpy(number,temp->next->number);
strcpy(sex,temp->next->sex);
if(fwrite(name,sizeof(char),20,file)==EOF)
{
perror("fwrite1");
fclose(file);
exit(2);
}
if(fwrite(number,sizeof(char),20,file)==EOF)
{
perror("fwrite2");
fclose(file);
exit(3);
}
if(fwrite(sex,sizeof(char),20,file)==EOF)
{
perror("fwrite3");
fclose(file);
exit(4);
}
memset(name,0,20);
memset(number,0,20);
memset(sex,0,20);
temp=temp->next;
}
fclose(file);
}
void loadlinkman(Linklist Lp) //加载文件中的联系人到链表中
{
FILE *file=fopen("通讯录","a+");
if(file==NULL)
{
perror("fopen2");
fclose(file);
exit(5);
}
char buffer1[MAXSIZE]={0};
char buffer2[MAXSIZE]={0};
char buffer3[MAXSIZE]={0};
int len=Length(file);
int i=0;
while(i<( len/(3*MAXSIZE) ) )
{
if(fread(buffer1,sizeof(char),20,file)==EOF)
{
perror("fread1");
fclose(file);
exit(6);
}
if(fread(buffer2,sizeof(char),20,file)==EOF)
{
perror("fread2");
fclose(file);
exit(7);
}
if(fread(buffer3,sizeof(char),20,file)==EOF)
{
perror("fread3");
fclose(file);
exit(8);
}
Linklist p=(Linklist)malloc(sizeof(Node));
if(p==NULL)
{
return;
}
else
{
strcpy(p->name,buffer1);
strcpy(p->number,buffer2);
strcpy(p->sex,buffer3);
memset(buffer1,0,20);
memset(buffer2,0,20);
memset(buffer3,0,20);
Linklist temp=Lp;
while(temp->next!=NULL)
{
temp=temp->next;
}
temp->next=p;
p->next=NULL;
}
i++;
}
}
ps:都是本人一个一个码的,希望能够相关学习的小伙伴提供一些参考,而不是照抄照搬,代码的能力培养永远与自己敲代码的行数成正相关。
最后,希望走过路过的给个赞呗,哈哈(标准式吆喝!)