C语言程序设计之通讯录

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

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



你可能感兴趣的:(C语言程序设计之通讯录)