C语言大作业——通讯录

c语言大作业 通讯录

                                                   BY CJ
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<process.h>  

struct person{
 char name[100];//姓名 
 char num[100];//电话 
 char qq[100];//QQ号 
 char C[20];//是否为常用联系人
 struct person *next;//指针 
};
struct person *file_load(void);//1.读取原文件内容
void interface(void); //2.界面函数 
struct person *file_new_build(struct person *head); //3.新建联系人 
struct person *file_search(struct person *head);//4.查询 (返回一个指针) 用于其他功能 
struct person* file_modification(struct person *head);//5.修改 
struct person* file_delete(struct person *head);//6.删除 
void file_printall(struct person*head);//7.打印所有人
void file_print(struct person*head);//8.导出常用联系人 
void file_save(struct person*head);//9.在一系列操作后存储数据 
void file_sort(struct person*head);//10.排序 
struct person *file_search1(struct person *head);//4.5 查询用____main函数中的查询 

main (void){
 system("color  F0");//调节界面,F0 白底黑字
 int f;//代表8个功能的号码 
 FILE *fp,*fp1;  
 struct person *head=NULL;//创建头指针 
 
 if((fp=fopen("通讯录","r"))==NULL){//打开通讯录,没有的话就创建一个 
  if((fp=fopen("通讯录","w"))==NULL){
   printf("无法创建通讯录"); //检验
      exit (0);
  }
  fclose(fp);   
 }
 head=file_load();//load读取通讯录文件中的内容
 while(1){
  interface();
  scanf("%d",&f);
  switch(f){
   case 1:head=file_new_build(head);break;
   case 2:file_search1(head);break; 
   case 3:head=file_modification(head);break; 
   case 4:head=file_delete(head);break;
   case 5:file_printall(head);break;
   case 6:file_print(head);break;
   case 7:file_save(head);break;
   case 8:exit(0);break;
   case 9:file_sort(head);break;
   default :printf("Enter error!!");getchar();
  } 
  printf("\n请按ENTER返回菜单");
  getchar();
        fflush(stdin);
  printf("\a");//按键声 
  system("CLS");
 } 
}

struct person *file_load(void){//1.载入先前通讯录的数据 
        FILE *fp;
        char c; //读入数据库(通讯录)里的内容,下次开机时仍可用 
        struct person *head=NULL,*p=NULL,*q=NULL;
        int i;
        fp=fopen("通讯录","r");
        for(i=1;(c=fgetc(fp))!=-1;i++)
        {
         fseek(fp,-1,SEEK_CUR); 
            p=(struct person*)malloc(sizeof(struct person)); 
            fscanf(fp,"%s%s%s",p->name,p->num,p->qq);//读入数据 
            fscanf(fp,"%s\n",p->C); 
            if(i==1)
            {head=p;q=p;}//一边读入一边创造链表 
            else
            {q->next=p;q=p;}
        }
        if(p==NULL)
        {head=NULL;fclose(fp);return(head);}
        q->next=NULL;
        fclose(fp);
        return(head);
}

void interface(void){//2.界面 
 printf("\t\t\t通讯录( ̄~ ̄)\n"); 
 printf("========================================================"); 
 printf("\n\t\t选择你需要操作的功能:\n\n");
 printf("\t\t\t1)新建联系人\n");
 printf("\t\t\t2)查询\n");
 printf("\t\t\t3)修改\n");
 printf("\t\t\t4)删除\n");
 printf("\t\t\t5)浏览\n");
 printf("\t\t\t6)导出常用联系人\n");
 printf("\t\t\t7)存储本次的所有操作\n"); 
 printf("\t\t\t8)不保存直接退出\n"); 
 printf("\t\t\t9)排序"); 
 printf("\n********************************************************");
 printf("\n选择你要进行的操作号码:"); 
}

struct person* file_new_build(struct person *head){//3.新建联系人(在输入时就已经排过序了) 
    struct person *p,*q,*f;
    p=head;
 q=head;
    f=(struct person*)malloc(sizeof(struct person));
    system("CLS");//清屏操作,从主界面到副界面 
 printf("\t\t你可以在此处新建联系人\n");
 printf("=======================================================\n");
 getchar(); 
 printf("输入姓名:");
 gets(f->name);
 printf("输入手机号:"); 
 scanf("%s",f->num);
 printf("输入QQ号:");
 scanf("%s",f->qq);
 printf("是否为常用联系人 是输入CONSTANT 否输入NO:");
 while(1){//输入常用联系人 
  scanf("%s",f->C);
  if(strcmp(f->C,"CONSTANT")==0||strcmp(f->C,"NO")==0) break;
        else printf("请重输");
 }
 
    if(head==NULL){//开头,按首字母排序,添加位置 
     head=f;f->next=NULL;
 }
 else{
  while(strcmp(p->name,f->name)<=0&&p->next!=NULL){
   q=p; 
   p=p->next;
  }
  if(strcmp(p->name,f->name)>0){//中间
   q->next=f; 
   f->next=p; 
  }
  else{//结尾 
   p->next=f;
   f->next=NULL;
  } 
 }
 printf("添加成功<( ̄︶ ̄)>"); 
 printf("\n********************************************************"); 
 getchar();
 return (head); 
}

struct person* file_search(struct person *head){//4.查询 
    char name[100];//姓名 
 char num[100];//电话 
 char qq[100];//QQ号 
 char C[20]; //常用 
 int i,j;//功能 
 system("CLS");
 struct person *p,*t;
 p=head;
 while(1){//while(switch)用了goto跳出,否则无法跳出,可以一直循环直到用户输入合法数据 
  printf("单一条件查询请按1 组合条件查询请按2:_\b");
     scanf("%d",&i); 
        if(i==1)break;
        if(i==2)break; 
 }
 if(i==1){
  printf("\n单一条件请选择1.姓名 2.电话 3.qq\n");
  while(1){
  scanf("%d",&i);
  switch(i){
   case 1:{
    printf("\n输入姓名:");
    scanf("%s",name); 
    while(p!=NULL){
     if(strcmp(p->name,name)==0){
      printf("姓名:%s\n电话:%s\nqq:%s\n是否常用:%s",p->name,p->num ,p->qq ,p->C);j++;
      printf("\n********************************************************\n");
      getchar();
            return(p);
     }
     p=p->next;
    }
    if(j==0) {printf("未找到此联系人");goto add;}
   }
   case 2:{
    printf("\n输入电话:");
    scanf("%s",num);
    while(p!=NULL){
     if(strcmp(p->num,num)==0){
      printf("姓名:%s\n电话:%s\nqq:%s\n是否常用:%s",p->name,p->num ,p->qq ,p->C);j++;
      printf("\n********************************************************");
                     getchar();
      return(p);
     }
     p=p->next;
    }
    if(j==0) printf("未找到此联系人"); 
    goto add;
   } 
      case 3:{
       printf("\n输入QQ:");
    scanf("%s",qq);
    while(p!=NULL){
     if(strcmp(p->qq ,qq)==0){
      printf("姓名:%s\n电话:%s\nqq:%s\n是否常用:%s",p->name,p->num ,p->qq ,p->C);j++;
      printf("\n********************************************************");
                     getchar();
      return(p);
     }
     p=p->next;
    }
    if(j==0) printf("未找到此联系人"); 
    goto add;
   }
      default:printf("enter error\n"); 
  } 
     }  
 } 
 if(i==2){
 printf("\n输入姓名");scanf("%s",name); 
 printf("\n输入电话");scanf("%s",num);
 while(p!=NULL){
     if(strcmp(p->name,name)==0&&strcmp(p->num,num)==0){
      printf("姓名:%s\n电话:%s\nqq:%s\n是否常用:%s",p->name,p->num ,p->qq ,p->C);j++;
      printf("\n********************************************************");
                     getchar();
      return(p);
     }
     p=p->next;
    }
    if(j==0) printf("未找到此联系人");
    goto add;
 } 
 add:printf("\n********************************************************");//结束跳出的goto 
 getchar();
 return (NULL); 
} 

struct person *file_modification(struct person *head){//5.修改
 system("CLS");
 struct person *t; 
 t=file_search(head);
 if(t==NULL){
  goto add; 
 }  
 printf("若要修改重名联系人的信息 ,请使用组合查询\n");
 printf("========================================================"); 
 printf("\n请问要修改什么信息  名字   电话   qq   是否常用\n");
 printf("\n%s---->",t->name); 
    scanf("%s",t->name);
 printf("\n%s---->",t->num); 
    scanf("%s",t->num);
 printf("\n%s---->",t->qq); 
 scanf("%s",t->qq); 
 while(1){//输入常用联系人 
 printf("\n%s---->",t->C); 
 scanf("%s",t->C);
 if(strcmp(t->C,"CONSTANT")==0||strcmp(t->C,"NO")==0) goto add;
    else printf("请重输");}
 add: 
 printf("\n<( ̄︶ ̄)>修改成功********************************************************");
 getchar();
 return(head);
}

void file_sort(struct person*head){//10.排序 
 system("CLS");
 struct person *p1,*p2,temp;
 p2=head;
 if(head==NULL){
  printf("不需要排序\n");
  return;
 }
 if(p2->next==NULL){
  printf("不需要排序\n");
  return;
 }
 while(p2->next!=NULL)//冒泡排序 
 {
  p1=p2->next;
  while(p1!=NULL){
   if((strcmp(p1->name,p2->name))<0){
    temp=*p2;//先换所有内容 
    *p2=*p1;
    *p1=temp;
    temp.next=p2->next;//指针不变 
    p2->next=p1->next;
    p1->next=temp.next;
   }p1=p1->next;
  }p2=p2->next;
 }
 getchar();
 printf("\n<( ̄︶ ̄)>排序成功");
}

struct person* file_delete(struct person *head){//6.删除 
 system("CLS");
 struct person *p,*q;
 p=file_search(head);//返回指针 
 q=head;
 if(p==head){head=p->next;free(p);return (head);}
 while(1){
  if(q->next==p)break;
  q=q->next;
 }
 q->next=p->next;
 free(p);
 getchar();
 return (head);
}

void file_printall(struct person *head){//7.打印全部,浏览 
 system("CLS");
 struct person *p;
 p=head;
 while(1){
  printf("================================================\n"); 
  printf("\t\t姓名:%s\n\t\t电话:%s\n\t\tqq:%s\n\t\t是否常用:%s\n",p->name,p->num,p->qq,p->C); 
  p=p->next;
  if(p==NULL) break;
 }
 printf("\n<( ̄︶ ̄)>打印成功"); 
 getchar();
}

void file_print(struct person *head){//8.导出部分,创造一个新文件 
    system("CLS");
 FILE *fp;
    struct person *p;
    p=head;
    fp=fopen("常用联系人.txt","w");
    fprintf(fp,"=========================常用联系人<( ̄︶ ̄)>===========================");
    while(p!=NULL){
     if(strcmp(p->C,"CONSTANT")==0){
      fprintf(fp,"========================================================\n");  
         fprintf(fp,"姓名%s\n",p->name);
         fprintf(fp,"电话:%s\n",p->num);
      fprintf(fp,"qq:%s\n",p->qq);} 
      p=p->next; 
 }  
 printf("\n<( ̄︶ ̄)>导出成功********************************************************"); 
 getchar();
} 

void file_save(struct person *head){//9.储存这次的所有操作,可以将链表save进通讯录 
 system("CLS");
 struct person *p;
 FILE *fp; 
 fp=fopen("通讯录","w");
 p=head; 
 while(1)
    {
        fprintf(fp,"\n%s %s %s %s\n",p->name,p->num,p->qq,p->C);
        p=p->next;
  if(p==NULL)break;} 
    fclose(fp);
    printf("\n\n存储成功<( ̄︶ ̄)>(当前目录下 通讯录.txt)"); 
    printf("PRESS ANY KEY TO EXIT.\n\n");
    getchar();
    exit(1);
} 

struct person* file_search1(struct person *head){//4.5查询 
    char name[100];//姓名 
 char num[100];//电话 
 char qq[100];//QQ号 
 char C[20]; //常用 
 int i,j;//功能 
 system("CLS");
 struct person *p,*t;
 p=head;
 while(1){
  printf("单一条件查询请按1 组合条件查询请按2:_\b");
     scanf("%d",&i); 
        if(i==1)break;
        if(i==2)break; 
 }
 if(i==1){
  printf("\n单一条件请选择1.姓名 2.电话 3.qq\n");
  while(1){
  scanf("%d",&i);
  switch(i){
   case 1:{
    printf("\n输入姓名:");
    scanf("%s",name); 
    while(p!=NULL){
     if(strcmp(p->name,name)==0){
      printf("姓名:%s\n电话:%s\nqq:%s\n是否常用:%s",p->name,p->num ,p->qq ,p->C);j++;
      printf("\n********************************************************\n");
     }
     p=p->next;
    }
    if(j==0) {printf("未找到此联系人");goto add;}
    getchar();
    return(p);
   }
   case 2:{
    printf("\n输入电话:");
    scanf("%s",num);
    while(p!=NULL){
     if(strcmp(p->num,num)==0){
      printf("姓名:%s\n电话:%s\nqq:%s\n是否常用:%s",p->name,p->num ,p->qq ,p->C);j++;
      printf("\n********************************************************");
                     getchar();
      return(p);
     }
     p=p->next;
    }
    if(j==0) printf("未找到此联系人"); 
    goto add;
   } 
      case 3:{
       printf("\n输入QQ:");
    scanf("%s",qq);
    while(p!=NULL){
     if(strcmp(p->qq ,qq)==0){
      printf("姓名:%s\n电话:%s\nqq:%s\n是否常用:%s",p->name,p->num ,p->qq ,p->C);j++;
      printf("\n********************************************************");
                     getchar();
      return(p);
     }
     p=p->next;
    }
    if(j==0) printf("未找到此联系人"); 
    goto add;
   }
      default:printf("enter error\n"); 
  } 
     }  
 } 
 if(i==2){
 printf("\n输入姓名");scanf("%s",name); 
 printf("\n输入电话");scanf("%s",num);
 while(p!=NULL){
     if(strcmp(p->name,name)==0&&strcmp(p->num,num)==0){
      printf("姓名:%s\n电话:%s\nqq:%s\n是否常用:%s",p->name,p->num ,p->qq ,p->C);j++;
      printf("\n********************************************************");
                     getchar();
      return(p);
     }
     p=p->next;
    }
    if(j==0) printf("未找到此联系人");
    goto add;
 } 
 add:printf("\n********************************************************");
 getchar();
 return (NULL); 
} 


因为之前看到网上的通讯录功能不是很全,所以大作业写完后就发出来了,如果有什么可改进的东西,欢迎交流@ustc @1235(之前发现了一些小错误,又修改了一下)

  • 26
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值