简易通讯录 0.0.1版本

/*****************************************************
copyright (C), 2014-2015, Lighting Studio. Co.,     Ltd. 
File name:
Author:Jerey_Jobs    Version:0.1    Date: 
Description:
Funcion List: 
*****************************************************/
/******2019/02/27**********/
/******作者:鼬神的迷弟****/

/******通讯录*****/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
/*****光标定位*****/
#define CLEAR() printf("\033[2J")                       //清除屏幕
#define MOVEUP(x)  printf("\033[%dA",(x))               //上移光标
#define MOVEDOWN(x)  printf("\033[%dB",(x))             //下移光标
#define MOVELEFT(y)  printf("\033[%dD",(y))             //左移光标
#define MOVERIGHT(y)  printf("\033[%dC",(y))            //右移光标
#define MOVET0(x,y)  printf("\033[%d;%dH",(x),(y))      //定位光标
#define RESET_CURSOR()  printf("\033[H")                //复位光标
#define HIDE_CURSOR()  printf("\033[?25L")              //隐藏光标
#define SHOW_CURSOR()  printf("\033[?25h")              //显示光标

/********定义链表结构体*****/
typedef struct node
{
    char name[20];
    char telephone[15];
    char homephone[7];
    struct node *prior;    //结点的前驱
    struct node *next;     //结点的后继
}Node,*Link;
int count=0;               //定义全局变量count记录通讯录存储成员的个数
/********通讯录用户界面******/
void interface()
{
    printf("\033[37;32m*********************************************************** \n");
    printf("****************************通讯录***********************************\n");
    printf("***********************************************************************\n");
    printf("***********************************************************************\n");
    printf("*************************** 1.存储用户*********************************\n");
    printf("*************************** 2.查找用户*********************************\n");
    printf("*************************** 3.删除用户*********************************\n");
    printf("*************************** 4.修改用户*********************************\n");
    printf("*************************** 5.显示通讯录*******************************\n");
    printf("*************************** 6.退出通讯录界面***************************\n");
    printf("***********************************************************************\n");
    printf("***********************************************************************\n");
}

/******功能:判断分配空间是否成功函数*******
 ******函数名 malloc_is_ok()函数************
 ******形参 Link new_node (一级指针)********/
int malloc_is_ok(Link new_node)
{
    if(NULL==new_node)
    {
        printf("分 配 不 成 功\n");
        return 0;               //分配不成功返回值为0;
    }
    else
    {
        return 1;               //分配成功返回值为1;
    }
}
/********功能:创建链表的结点*******
 ********函数名 creat_node()函数****
 ********形参 Link *new_node(二级指针)**/

void creat_node(Link *new_node)
{
    int count=10;
    do{
        *new_node=(Link)malloc(sizeof(Node));
        count--;
    }while(!malloc_is_ok(*new_node)&&count);

    //调用malloc_is_ok()函数,结合希望创建结点个数,判断空间是否分配成功;
}
/********功能:创建空链表***********
 ********函数名 creat_link()函数****
 ********形参 Link *head(二级指针)**/
void creat_link(Link * head)
{
    if((*head)==NULL)
    {
        printf("错误");
        exit(-1);
         //判断头指针是否为空,如果为空,则退出;
    }
    creat_node(head);
         //创建表头结点;
    (*head)->prior=(*head)->next=*head;
         //创建双向链表,构成前驱环和后继环;
}

/******************功能:链表的头插***********************************************
 ******************函数名 insert_node_head()函数**********************************
 ******************形参 Link head(一级指针) Link new_node插入的结点(一级指针)*****/
void insert_node_head(Link head,Link new_node)
{

    new_node->prior=head;
    new_node->next=head->next;
    head->next=new_node;
    new_node->next->prior=new_node;
}

/******************功能:链表的尾插************************************************
 ******************函数名 insert_node_tail()函数***********************************
 ******************形参 Link head(一级指针) Link new_node插入的结点(一级指针)******/
void insert_node_tail(Link head,Link new_node)
{
   Link p;
   p=head;
       do                      
       {
          p=p->next;

       }while(p->next!=head);
                
       new_node->prior=p;
       new_node->next=p->next;
       p->next=new_node;
       new_node->next->prior=new_node;
 }

/*****************功能:通讯录已存储所有用户的显示函数******************************
 *****************函数名 int display()函数******************************************
 *****************形参 Link head(一级指针) int num 选择链表显示的长度***************/
void display(Link head)
{
    Link p;
    p=head;
    int i=1;
    if(head==p->next)
    {
    
        printf("通讯录为空\n");
    }
    else
    {
        p=p->next;
        while(p!=head)
        {
            {
                 printf("第%d用户的名字是:%s\n",i,p->name);
                 printf("第%d用户的手机号码是:%s\n",i,p->telephone);
                 printf("第%d用户的家庭号码是:%s\n",i,p->homephone);
                 p=p->next;
                 i++;
            }
        }
    }
}
/******************功能:通讯录删除操作的显示提示*********************************
 ******************函数名 void display_delete()函数*******************************
 ******************形参 Link head(一级指针)***************************************/
void display_delete(Link head)
{
    Link p;
    p=head;
    int i=1;
    if(head==p->next)
    {
    
        printf("通讯录为空\n");
    }
    else
    {
        printf("**************** 通讯录目录*****************:\n");
        p=p->next;
        while(p!=head)
        {
            {
                 printf("        第%d用户的名字是:%s\n",i,p->name);
                 printf("        第%d用户的手机号码是:%s\n",i,p->telephone);
                 printf("        第%d用户的家庭号码是:%s\n",i,p->homephone);
                 p=p->next;
                 i++;
            }
        }
    }
}
/********功能:通讯录查找操作的显示提示******
 ********函数名 void display_look()函数******
 ********形参 Link new_node(一级指针)********/
void display_look(Link new_node)
{
    printf("              用户的名字是:%s\n",(new_node)->name);
    printf("              用户的手机号码是:%s\n",(new_node)->telephone);
    printf("              用户的家庭号码是:%s\n",(new_node)->homephone);
    printf("********************************************\n");
}
/********功能:通讯录存储操作的显示提示******
 ********函数名 void display_insert()函数******
 ********形参 Link new_node(一级指针)********/
void display_insert(Link new_node)
{
    printf("              新用户的名字是:%s\n",(new_node)->name);
    printf("              新用户的手机号码是:%s\n",(new_node)->telephone);
    printf("              新用户的家庭号码是:%s\n",(new_node)->homephone);
}
/********功能:通讯录查找操作的显示提示******
 ********函数名 void display_change()函数******
 ********形参 Link new_node(一级指针)********/
void display_change(Link new_node)
{
    printf("              修改后的用户信息为\n");
    printf("              用户的名字是:%s\n",(new_node)->name);
    printf("              用户的手机号码是:%s\n",(new_node)->telephone);
    printf("              用户的家庭号码是:%s\n",(new_node)->homephone);
}

/**********************************************************/
/************功能:通讯录主界面输入保护函数****************/
/************函数名:int input_protect()函数****************/
/************形参:字符型数字str[],输入字符长度len**********/
int input_protect(char str[],int len)
{
    int i;
    for(i = 0;i<(len+1) && str[i-1]!='\n';i++ )
    {
       str[i]=getchar();
    }
    if(i == 1)
    {
     return 0;
    }
    if(i == (len+1) && str[i-1]!='\n')
    {
        while( getchar() !='\n');
        return 0;
    }
    str[i-1]='\0';
    return 1;
}
/************功能:通讯录子菜单界面输入保护函数************/
/************函数名:int input_protect_caidan()函数*********/
/************形参:字符型数字str[],输入字符长度len**********/
int input_protect_caidan(char str[],int len)
{
    int i;
    for(i = 0;i<(len+1) && str[i-1]!='\n';i++ )
    {
       str[i]=getchar();
    }
    if(i == (len+1) && str[i-1]!='\n')
    {
        while( getchar() !='\n');
        return 0;
    }
    str[i-1]='\0';
    return 1;
}
/************功能:通讯录字符输入合法性函数*****************/
/************函数名:int input_name()函数******存储模式下****/
/************函数名:int input_phone()函数*****存储模式下****/
/************函数名:int delete_phone()函数****删除模式下****/
/************函数名:int change_phone()函数****修改模式下****/
/************函数名:int main_menu()函数*****主菜单模式下****/
/************函数名:int  clean_phone()函数****清空模式下****/
/************形参:字符型数字str[]***************************/
int main_menu(char str[])
{
    int i=0;
    while(str[i]!='\0')
    {
        if(str[i]>='1'|| str[i]<='6')
        {
            i++;
        }
        else
        {
            printf("输入错误字符\n");
            return 0;
        }
    }
    return 1;
}
int input_name(char str[])                  
{
    int i=0;
    while(str[i]!='\0')
    {
        if(str[i]>='a'&&str[i]<='z')    //姓名只能由小写字母组成
        {
            i++;
        }
        else
        {
            printf("输入错误字符\n");
            return 0;
        }
    }
    return 1;
}
int input_phone(char str[])
{
    int i=0;
    while(str[i]!='\0')
    {
        if(str[i]>='0'&&str[i]<='9')     //电话号码0-9位数字组成
        {
            i++;
        }
        else
        {
            printf("输入错误字符\n");
            return 0;
        }
    }
    return 1;
}
int delete_phone(char str[])
{
    int i=0;
    while(str[i]!='\0')
    {
        if(str[i]=='0'||str[i]=='1')         //删除选项子菜单只能输入字符'0','1'
        {
            return 1;
        }
        else
        {
            printf("输入错误字符\n");
            return 0;
        }
        i++;
    }
}
int change_phone(char str[])
{
    int i=0;
    while(str[i]!='\0')
    {
      if(str[i]=='1'|| str[i]=='2'||str[i]=='3')    //修改选项子菜单只能输入字符'1','2','3'
        {
            return 1;
        }
        else
        {
            printf("输入错误字符\n");
            return 0;
        }
        i++;
    }
}
int clean_phone(char str[])
{
    int i=0;
    while(str[i]!='\0')
    {
        if(str[i]=='1'||str[i]=='2')                 //清空选项子菜单只能输入字符'1','2'
        {
            return 1;
        }
        else
        {
            printf("输入错误字符\n");
            return 0;
        }
        i++;
    }
}
/************************************************************************/
/************功能:通讯录存储功能函数模块********************************/
/************函数名:char *case_1_name()函数******************************/
/************函数名:char *case_1_telephone()函数*************************/
/************函数名:char *case_1_homephone()函数*************************/
/************函数名:void insert_ok()函数*********************************/
/************形参:***(*name,*telephone,*homephone*指向字符数组的指针 )**/
/************形参:**(Link*head,*new_node表头结点与存储插入的新的结点 )*****/
int tihuan(Link head,char *name ,char*telephone,char *homephone)
{
        Link p=head;
        int i;
        scanf("%d",&i);
        switch(i)
        {
            case 1:
                     p=p->next;
                     while(p!=head)
                    {
                        if(strcmp(p->name,name)==0)       
                    {
                        strcpy(p->telephone,telephone);
                        strcpy(p->homephone,homephone);
                        return 1;
                    }
                        p=p->next;
                    }
                    break;
             
            case 2: break;
        }
        return 0;
}
int chongming(Link head,char *name )
{
    Link p;
    p =head->next;
    while(p!=head)
    {
           if(strcmp(p->name,name)==0 )
           {
                  printf("存储用户已经存在,是否替换信息\n");
                                                         //存储发生用户姓名重名时会做判断
                  return 1;
           }
        p=p->next;
    }
    return 0;
}
char * case_1_name(char * name)                          //姓名存储
{
    int i,length=20,flag=0;
    char b[100];
     while(flag!=1)
    {
         if(input_protect(b,length))
        {
             if(input_name(b))
            {
                strcpy(name,b);
                flag=1;
            }
        }
        else
        {
            printf("对不起输入错误请重新输入\n");
            flag=0;
        }
    }
    return name;
}
char * case_1_telephone(char *telephone)                  //手机号码存储
{
    int i,length=11,flag=0;
    char b[100];
    while(flag!=1)
   {
    if(input_protect(b,length)&&strlen(b)==11)
    {
        if(input_phone(b))
        {
            strcpy(telephone,b);
            flag=1;
        }
    }
        else 
        {
            printf("对不起输入错误请重新输入\n");
            flag=0;
        }
   }
    return telephone;
}
char * case_1_homephone(char *homephone)                   //家庭电话号码存储
{
    int i,length=7,flag=0;
    char b[100];
    while(flag!=1)
   {
    if(input_protect(b,length)&&strlen(b)==7)
    {
        if(input_phone(b))
        {
            strcpy(homephone,b);
            flag=1;
        }
    }
        else 
        {
            printf("对不起输入错误请重新输入\n");
            flag=0;
        }
   }
    return homephone;
}
void insert_ok(Link *head,Link*new_node,char *name,char*telephone,char *homephone)   //上述输入信息正确后,存储信息
{
      Link p,q;
      p=*head;
      strcpy((*new_node)->name,name);
      strcpy((*new_node)->telephone,telephone);
      strcpy((*new_node)->homephone,homephone);
      if(chongming(*head,name))
      {
          printf("1.替换 2.取消\n");                         //如果发生输入重名时,提示是否覆盖已有用户信息
          tihuan(*head,name,telephone,homephone);
          return;
      }
      else
      {
          if(p->next==(*head))
          {
               insert_node_head(*head,*new_node);
               display_insert(*new_node);    
          }
          else
          {
                p=p->next;
                while(p!=(*head))                       //存储用户按姓名大小排序(边存边排)
            {
                if(strcmp(p->name,name)==1)
                {
                     (*new_node)->prior=p->prior;
                     (*new_node)->next=p;
                     p->prior->next=(*new_node);
                     (*new_node)->next->prior=(*new_node);
                      display_insert(*new_node);
                      break;
                }
                if(strcmp(p->name,name)==-1)
                {
                     (*new_node)->prior=p;
                     (*new_node)->next=p->next;
                      p->next=(*new_node);
                     (*new_node)->next->prior=(*new_node);
                      display_insert(*new_node); 
                      break;
                }
             }
           }
       }
}
/************************************************************************/
/************功能:通讯录查找功能函数模块********************************/
/************函数名:int look_name()函数**********************************/
/************函数名:int look_telephone()函数*****************************/
/************函数名:int look_homephone()函数*****************************/
/************函数名:int case_2_look()函数********************************/
/************形参:***(*name,*telephone,*homephone*指向字符数组的指针 )***/
/************形参:***(*head,*new_node表头结点与存储插入的新的结点 )******/
/************************************************************************/
int look_name(Link head,char *name)                 //按姓名查找
{
    int flag;
    Link p;
    p=head->next;
    while(p!=head)
    {
        if(strcmp(name,p->name)==0)
        {
            flag=1;                                //找到后显示出来用户信息
            display_look(p); 
            break;
        }
        else
        {
            flag=0;
        }
        p=p->next;
    }
    if(flag==1)
    {
        return 1;
    }
    else if(flag==0)
    {
        printf("未找到该用户*\n");
        return 0;
    }
}
int look_telephone(Link head,char *telephone)      //按手机号码查找
{
    int flag;
    Link p;
    p=head->next;
    while(p!=head)
    {
        if(strcmp(telephone,p->telephone)==0)
        {
            flag=1;
            display_look(p);
            break;
        }
        else
        {
            flag = 0;
        }
        p=p->next;
    }
    if(flag==1)
    {
          return 1;
    }
    else if(flag==0)
    {
          printf("未找到该用户*\n");
          return 0;
    }
}
int look_homephone(Link head,char *homephone)      //按家庭号码查找
{ 
    int flag;
    Link p;
    p=head->next;
    while(p!=head)
    {
        if(strcmp(homephone,p->homephone)==0)
        {
            flag=1;
            display_look(p);
            break;
        }
        else
        {
            flag=0;
        }
        p=p->next;
    }
    if(flag==1)
    {
        return 1;
    }
    else if(flag==0)
    {
        printf("未找到该用户*\n");
        return 0;
    }
}

int case_2_look(Link *head,Link *new_node,char * name ,char *telephone,char*homephone)     //查找功能的主程序
{
    int a;
    printf("通过什么查找\n");
    printf("1.姓名\n");
    printf("2.手机号码\n");
    printf("3.家庭号码\n");
    scanf("%d",&a);
    getchar();
    switch(a)                                               //查找模式的选择
        {   
            case 1:
                {
                    printf("请输入姓名:\n");
                    creat_node(new_node);
                    case_1_name(name);
                    if(look_name(*head,name)==1)
                    {
                        return 1;
                    }
                }
               break;
            case 2:
               {
                   printf("请输入手机号码:\n");
                   creat_node(new_node);
                   case_1_telephone(telephone);
                   if(look_telephone(*head,telephone)==1)
                   {
                       return 1;
                   }
               }
               break;
            case 3:
               {
                   printf("请输入家庭号码:\n"); 
                   creat_node(new_node);
                   case_1_homephone(homephone);
                   if(look_homephone(*head,homephone)==1)
                   {
                       return 1;
                   }
               }
               break;
        }
}
/************************************************************************/
/************功能:通讯录删除功能函数模块********************************/
/************函数名:int case_delete_protect()函数************************/
/************函数名:int case_delete_input()函数**************************/
/************函数名:void case_3_delete ()函数****************************/
/************d形参:***(*name指向字符数组的指针 )**************************/
/************形参:***(head,new_node表头结点与存储插入的新的结点 )********/
/************************************************************************/
int case_delete_protect()                       //删除子菜单选项的输入保护
{
    int i,length=1,flag=0;
    int j,k;
    char b[100];
    while(flag!=1)
   {
    if(input_protect_caidan(b,length))          //输入的字符长度保护
    {                                           //输入的字符类型保护
        if(delete_phone(b))
        {
            flag=1;
        }
    }
    else 
        {
            printf("对不起输入错误请重新输入\n");
            flag=0;
           return 0;
        }
   }
    return 1;
}
int case_delete_input()                          //输入命令,输入不合法重新输入
{
    int flag=0;
    int m,n;
    while(flag!=1)
    {
        scanf("%d",&m);
        n=case_delete_protect();
        if(n==1)
        {
            flag=1;
        }
        else 
        {
            flag=0;
        }
    }
    return m;
}

void case_3_delete(Link head,Link new_node,char *name)         //删除功能主程序
{
    Link p;
    p = head;
    if( p->next == head)
    { 
        printf("通讯录为空\n");   
          free(new_node);
    }
    else
    {
        p=p->next;
        while(p!=head)
        {
            if(strcmp(p->name,name)==0)
            {
                p->prior->next=p->next;
                p->next->prior=p->prior;
                free(p); 
                printf("删除成功\n");
                free(new_node);
                return;
            }
            p=p->next;
        }
    }
}
/************************************************************************/
/************功能:通讯录修改功能函数模块********************************/
/************函数名:int case_change_protect()函数************************/
/************函数名:int case_change_input()函数**************************/
/************函数名:void case_name_ok ()函数*****************************/
/************函数名:void case_telephone_ok ()函数************************/
/************函数名:void case_homephone_ok ()函数************************/
/************函数名:void case_4_change ()函数****************************/
/************函数名:int change_yes_no  ()函数****************************/
/************形参:***(*name,*telephone,*homephone指向字符数组的指针 )****/
/************形参:***(*change_name,*change_telephone,*change_homephone指向字符数组的指针 )****/
/************形参:***(*head,head,new_node表头结点与存储插入的新的结点 )********/
/************************************************************************/
int case_change_protect()                                 //修改子菜单选项的保护
{
    int i,length=1,flag=0;
    char b[100];
    while(flag!=1)
   {
    if(input_protect_caidan(b,length))
    {
        if(change_phone(b)==1)
        {
            flag=1;
        }
    }
    else 
        {
            printf("对不起输入错误请重新输入\n");
            flag=0;
            return 0;
        }
   }
    return 1;
}
int case_change_input()                                    //输入合法性检测,不合法重新输入
{
    int flag=0;
    int m,n;
    while(flag!=1)
    {
        scanf("%d",&m);
        n=case_change_protect();
        if(n==1)
        {
            flag=1;
        }
        else 
        {
            flag=0;
        }
    }
    return m;
}
void change_name_ok(Link head,char *name,char*change_name)          //姓名修改函数
{
     Link p,q;
     p=head;
     if(p->next==head)
     {
         printf("无法修改\n");
     }
     else
     {
         p=p->next;
         while(p!=head)
        {
            if(strcmp(p->name,name)==0)
            {
                strcpy(p->name,change_name);
                display_change(p);
                return;
            }
            else
            {
                p=p->next;
            }
        }
     }
}
void change_telephone_ok(Link head,char *telephone,char *change_telephone)   
                                                               //手机电话修改函数
{
     Link p,q;
     p=head;
     if(p->next==head)
     {
         printf("无法插入\n");
     }
     else
     {
         p=p->next;
         while(p!=head)
        {
            if(strcmp(p->telephone,telephone)==0)
            {
                strcpy(p->telephone,change_telephone);
                display_change(p);
                return;
            }
            else
            {
                p=p->next;
            }
        }
     }
}
void change_homephone_ok(Link head,char *homephone,char *change_homephone)     
                                                              //家庭电话修改函数
{
     Link p,q;
     p=head;
     if(p->next==head)
     {
         printf("无法插入\n");
     }
     else
     {
         p=p->next;
         while(p!=head)
        {
            if(strcmp(p->homephone,homephone)==0)
            {
                strcpy(p->homephone,change_homephone);
                display_change(p);
                return;
            }
            else
            {
                 p=p->next;
            }
        }
     }
}
int change_yes_no(char *change_name,Link head)
{
    Link p;
    int i=0;
    p=head->next;
    while(p!=head)
    {
        if(strcmp(p->name,change_name)==0)
        {
            i++;
        }
        p=p->next;
    }
    if(i!=0)
    {
        printf("新命名与已存用户重名,修改无效\n");
        return 0;
    }
    else 
    {
        return 1;
    }
}

void case_4_change(Link *head,Link *new_node,char *name ,char *telephone,char *homephone)   //修改功能主程序
{
    int i;
    char change_telephone[100];
    char change_homephone[100];
    char change_name[100];
    printf("你想要修改什么 1.用户姓名 2.用户手机号码 3.用户家庭号码\n");
    i=case_change_input();                                                    //模式选择
    switch(i)
    {
        case 1:
               printf("请输入新姓名\n");
               case_1_name(change_name);
               printf("%s\n",change_name);
               if(change_yes_no(change_name,*head))
               {
               change_name_ok(*head,name,change_name);
               }
               break;
        case 2:
               printf("请输入新手机号码\n");
               case_1_telephone(change_telephone);
               change_telephone_ok(*head,telephone,change_telephone);
               break;

        case 3:
               printf("请输入新家庭号码\n");
               case_1_homephone(change_homephone);
               change_homephone_ok(*head,homephone,change_homephone);
               break;
    }
}
/**************************************************************************/
/************功能:通讯录清空用户功能函数模块******************************/
/************函数名:int clean_phone_protect()函数*主菜单输入字符合法性检查*/
/************函数名:int clean_phone_input()函数**输入错误,等待继续输入****/
/************函数名:void clean ()通讯录主菜单函数**************************/
/************形参: (Link *head)二级指针************************************/
/**************************************************************************/
int clean_phone_protect()                                     //清空功能子菜单输入合法性保护
{
    int i,length=1,flag=0;
    int m;
    char b[100];
    while(flag!=1)
   {
    if(input_protect_caidan(b,length))
    {
        if(clean_phone(b))
        {
            flag=1;
        }
    }
    else 
        {
            printf("对不起输入错误请重新输入\n");
            flag=0;
           return 0;
        }
   }
    return 1;
}
int clean_phone_input()                           //输入不合法字符,重新输入,直到输对为止
{
    int flag=0;
    int m,n;
    while(flag!=1)
    {
        scanf("%d",&m);
        n=clean_phone_protect();
        if(n==1)
        {
            flag=1;
        }
        else 
        {
            flag=0;
        }
    }
    return m;
}
void clean(Link *head )                                    //清空功能主程序
{
    int i;
    Link p;
    printf("确定清空通讯录? 1.确定 2.取消\n");
    i=clean_phone_protect();
    switch(i)
    {
        case 1: 
                 while((*head)->next!=*head)
                {
                    p=(*head)->next;
                    (*head)->next=(*head)->next->next;
                    free(p);
                }
                printf("通 讯 录 已 清 空\n"); 
                break;
        case 2: return;
     }
}
/************************************************************************/
/************功能:通讯录主菜单功能函数模块********************************/
/************函数名:int main_menu_protect()函数*主菜单输入字符合法性检查*/
/************函数名:int main_menu_input()函数**输入错误,等待继续输入****/
/************函数名:void choice ()通讯录主菜单函数***********************/
/************************************************************************/
int main_menu_protect()                                 //通讯录主菜单输入合法性保护
{
    int i,length=1,flag=0;
    int m;
    char b[100];
    while(flag!=1)
   {
    if(input_protect_caidan(b,length))
    {
        if(main_menu(b))
        {
            flag=1;
        }
    }
    else 
        {
            printf("对不起输入错误请重新输入\n");
            flag=0;
           return 0;
        }
   }
    return 1;
}
int main_menu_input()                                   //输入错误字符或长度,继续输入
{
    int flag=0;
    int m,n;
    while(flag!=1)
    {
        scanf("%d",&m);
        n=main_menu_protect();
        if(n==1)
        {
            flag=1;
        }
        else 
        {
            flag=0;
        }
    }
    return m;
}

void choice(Link *head,Link *new_node)               //主菜单模块
{
    int choice_num;                         //定义一个模式选择的变量(1-7)个选项
    char b[100];                            //用作输入长度合法性判断
    char name[100];                         //暂时存放存储用户姓名的字符型数组
    char telephone[100];                    //暂时存放存储用户手机号码的字符型数组
    char homephone[100];                    //暂时存放存储用户家庭号码的字符型数组
    int j,m,n;                              //n:执行查找功能时接受函数返回值来判断是否找到
                             //j: 执行删除功能时先进行查找操作时接受函数返回值判断用户是否存在
                                            //m:接受用户输入值,判断是否进行删除操作
    int flag=1;                             // flag=0 退出主菜单函数 flag!=0,循环执行
    int flag2;                              //有用户插入 flag2=0 ; 有用户删除 flag2=1;
    while(flag!=0)
{
    printf("请输入你想操作的选项:1.存储 2.查找 3.删除 4.修改 5.显示 6.清空 7.清屏 8.退出\n");
    choice_num=main_menu_input();
    switch(choice_num)
    {
        case 1:
                   printf("请输入用户的姓名:\n");
                   case_1_name(name);
                   printf("请输入11位用户的手机号码:\n");
                   case_1_telephone(telephone);
                   printf("请输入7位用户的家庭号码:\n");
                   case_1_homephone(homephone);
                   creat_node(new_node);
                   insert_ok(head,new_node,name,telephone,homephone);
                   count++;
                   sleep(3);                               //休眠后自动清屏
                   system("clear");
                   interface();
                break;
         case 2:
                case_2_look(head,new_node,name ,telephone,homephone);
                   sleep(3);
                   system("clear");
                   interface();
                break;
         case 3: 
                 display_delete(*head);
                 if(count==0)
                 {
                    break;
                 }
                 if(count!=0)
                 {
                 creat_node(new_node);
                 printf("你要删除的成员\n");
                 printf("请输入姓名:\n");
                 case_1_name(name);
                 n=look_name(*head,name);
                 if(n==0)
                 {
                    break;
                 }
                 else if(n==1)
                 {
                     printf("%s\n",name);
                     printf("你确定要删除\n");
                     printf("0.是  1.否\n");
                     m=case_delete_input();
                 }
                 switch(m)
                        {
                            case 0:printf("%s\n",name);
                                   case_3_delete(*head,*new_node,name);
                                   count--;
                                   break;
                                
                            case 1:break;
                        }       
                 }
                   sleep(3);
                   system("clear");  
                   interface();
                 break;
          case 4: 
                 display_delete(*head);
                   if(count==0)
                 {
                   printf("无法修改\n");
                   break;
                 }
                   if(count!=0 )
                 {
                    j=case_2_look(head,new_node,name ,telephone,homephone);
                    if(j==0)
                    {
                        break;
                    }
                    if(j==1)
                    {
                      case_4_change(head,new_node,name ,telephone,homephone);
                    }
                  }
                   sleep(3);
                   system("clear");
                   interface();
                break;
        case 5:
                display(*head);
                printf("输入0退出清屏\n");
                scanf("%d",&n);
                if(n==0)
                {
                   system("clear");
                   interface();
                }
                else
                {
                   interface();
                }
                break;
        case 6: clean(head);
                break;
        case 7: 
                   system("clear");            //输入清屏
                   interface();
                   break;
        case 8: printf("退出使用\n");
                flag=0;
    }
  }
}


/********功能:链表的释放**********************
 ********函数名 release()函数******************
 ********形参 link head(一级指针) *************/
void release(Link *head )
{
    Link p;
    p=(*head)->next;
    while((*head)->next!=*head)
    {
        p=(*head)->next;
        (*head)->next=(*head)->next->next;
         free(p);
         printf("*");                       //判断是否释放完毕
    }
    free(*head);
    printf("链 表 已 释 放\n");  
}
/*******主函数********/
int main()
{
    Link head;
    Link new_node;
    interface();
    creat_link(&head);
    creat_node(&new_node);
    choice(&head,&new_node);
    release(&head);
    return 0;
}

通讯录项目 0.0.1 版本基本完成,一直拖了很久,感觉写这种项目的东西很有兴趣,总是希望尽可能的实现多的功能,尽可能清除多的bug。拖了一段时间。但终于把目前自己想实现的功能尽可能的完善好了,最开始写这个项目的时候一直考虑如何实现生活中手机通讯的各种功能,在进行了许多尝试之后发现就目前链表结构实现很局限,最根本的是连数据都无法真正的保存下来,每次调试结果都需要重新输入,效率很低。同时还有自己写代码时间短,对好多东西都是皮毛的见识,有想法但不知道如何实践,所以就定义为0.0.1版本吧,以后会慢慢拓展,优化吧。

目前自己感觉的不足: 1.代码量太多,不简洁,有些函数模块可以集成在一个大函数里,并且应当尝试用多种思路方法实现。 2.有些代码写的不是很规范,需要再对编程规范进行更细致的学习。而且有些功能实现用一句话将就是很呆。还是自己对c的应用和一些算法的理解还是很有欠缺的  3.有些功能方面的不足吧,例如修改操作后应当再加一个按姓名排序通讯录联系人,我只在存储里加了边插边排。这里没考虑到,写博客的时候才想起来自己的bug,以后还是要提前考虑好整个程序功能框架后,再慢慢添加东西。以后在0.0.2版本里会慢慢去优化的。

菜鸟级代码,如有大神愿批评指导写个评论,小生感激不尽!!!

 

 

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值