C语言程序设计之通讯录

时间: 2023-07-10 admin IT培训

C语言程序设计之通讯录

C语言程序设计之通讯录

在C语言的学习过程中,经常会让我们自己编写一个小项目,其中,通讯录的编写就是其中的一个经典作业。下面我就献上自己编写的通讯录代码。

注:本程个人亲测有效,没有任何问题,可以实现以下的基本的功能。

      1:添加个人信息;

      2:查询个人信息,可供两种选择方法,一种按姓名查询,一种按电话号码查询;

      3:删除个人信息;

      4:修改个人信息;

      5:实现信息排序;

      6:输出全部信息;

      7:采用文件形式对通讯录进行操作,包括  写入文件 和  读取文件  ,从而保证能对添加的联系人进行保存。即在下一次打开vim编辑器的时候,依旧能看到上次添加的联系人的相关信息。

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#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:都是本人一个一个码的,希望能够相关学习的小伙伴提供一些参考,而不是照抄照搬,代码的能力培养永远与自己敲代码的行数成正相关。

     最后,希望走过路过的给个赞呗,哈哈(标准式吆喝!)