通讯录3.0 (包含文件保存与读取)

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <string.h>
#define BLACK                "\e[0;30m"
#define L_BLACK              "\e[1;30m"
#define RED                  "\e[0;31m"
#define L_RED                "\e[1;31m"
#define GREEN                "\e[0;32m"
#define L_GREEN              "\e[1;32m"
#define BROWN                "\e[0;33m"
#define YELLOW               "\e[1;33m"
#define BLUE                 "\e[0;34m"
#define L_BLUE               "\e[1;34m"
#define PURPLE               "\e[0;35m"
#define L_PURPLE             "\e[1;35m"
#define CYAN                 "\e[0;36m"
#define L_CYAN               "\e[1;36m"
#define GRAY                 "\e[0;37m"
#define WHITE                "\e[1;37m"
#define NONE                 "\e[0m"
# define size 1000

#define  failure  10000
#define  success  10001
#define  FALSE    10002
#define  TRUE     10003
int count = 0;
int number = -1;
char sort = '0';
struct person 
{
    int no;
    char name[20];
    int age;
    char sex[10];
    char tel[20];
    struct person *next;
};
typedef struct person Person;

void CutInfo(Person *ps)
{
    Person *q = NULL;
    int i, j;
    char quit = 'a',C_flag;
    char name[20];
aa: printf("按任意键继续删除操作,按0结束\n");
    scanf(" %c",&quit);
    system("clear");
    while(quit != '0')
    {
        if(count == 0)
        {   
            printf("您还没有联系人快去添加吧!");
            goto aa;
        }
        else if(count == 1)
        {
            Person *q = ps->next;
            
            printf("\n您只有一位联系人\n");   
            printf("姓名:%s 年龄:%d 性别:%s 联系方式:%s\n",
                    q->name,q->age,q->sex,q->tel);
bb:         printf("确定删除吗?确定请按1,返回请按0;\n");
            scanf(" %c",&C_flag);
                if(C_flag == '1')
                {
                    free(q);
                    ps->next = NULL;
                    count--;
                    printf("已删除!\n");
                    goto aa;
                }
                else if(C_flag == '0')
                    goto aa;
                else
                {
                    printf("输入有误,请尝试重新输入\n");
                    goto bb;
                }
            }
        
        else
        {
            system("clear");
            printf("\n请输入要删除的联系人姓名:\n");
            scanf("%s",name);
            while(ps->next)
            {   q = ps;
                ps = ps->next;
                if(strcmp(ps->name,name) == 0)
                {
cc:                 printf("确定要删除序号:%d  姓名:%s 年龄:%d 性别:%s 电话号码:%s\n",
                            ps->no,ps->name,ps->age,ps->sex,ps->tel);
                    printf("确认请按1,返回请按0\n");
                    scanf(" %c",&C_flag);
                    if(C_flag == '0')
                        goto aa;
                    else if(C_flag == '1')
                    {   
                        q->next = ps->next;
                        free(ps);
                        printf("删除成功!\n");
                        count--;
                        //Display(ps);
                        goto aa;
                    }
                    else
                    {
                        printf("请检查输入是否有误\n");
                        goto cc;
                    }
                }
            }
            
            if(i == count)
            {
                printf("没有找到相关联系人,请检查输入是否有误\n");
                goto aa;
            }
        }
    }
}
void hello()
{
    system("clear");
    printf(L_BLUE"\n********************************************"NONE);
    printf(L_BLUE"\n          欢迎进入通讯录"NONE);
    printf(L_BLUE"\n********************************************\n");
    printf("请选择功能>>                                    \n\n");                             
    printf(L_BLUE"*  1、添加联系人           *    2、删除联系人     \n"NONE);
    printf(L_BLUE"*  3、显示联系人           *    4、修改信息       \n"NONE);
    printf(L_BLUE"*  5、排序选择             *    6、查找联系人     \n"NONE);
    printf(L_BLUE"*  7、退出\n"NONE);
    printf(L_BLUE"\n********************************************\n"NONE);
    sleep(0.5);
}

int PersonInit(Person **ps)
{
    *ps = (Person *)malloc(sizeof(Person));
    if(NULL == *ps)
        return failure;
    (*ps)->next = NULL;
  //  (*ps)->name[] = {0};
    (*ps)->age = 0;
   // (*ps)->tel = NULL;
   // (*ps)->sex = NULL;
    return success;
}
int Large(char *str, char *ptr)
{
    return (strcmp(str, ptr) < 0) ? TRUE : FALSE;
}

int PersonInsert(Person *ps, int i, int (*cmp)(char *, char *))
{
    Person *p = (Person *)malloc(sizeof(Person));
    Person *q = ps;
    if(NULL == ps || p == NULL)
    {
        return failure;
    }
    printf(BLUE"请按照:姓名、年龄、性别、电话号码的顺序来输入中间输入空格或回车\n"NONE);    
    scanf("%s%d %s%s",p->name,&p->age,p->sex,p->tel);
    printf(BLUE"姓名为:%s\t年龄为:%d\n性别为: %s\t联系方式为:%s\n"NONE,
            p->name,p->age,p->sex,p->tel);
    ps->no = i + 1;
    while(ps->next)
    {
        q = ps;
        ps = ps->next;
        if(cmp(p->name, ps->name) == TRUE)
        {
            p->next = ps;
            q->next = p;
            return success;
        }
    }
    ps->next = p;
    p->next = NULL;
    return success;
}

void AddInfo(Person *ps)
{
    int ret;
    int i, clear = 0;
    char A_flag = 'a', flag;
    system("clear");
A:  printf("如需退出请按0,任意键继续\n");
    sleep(1);
    scanf(" %c",&A_flag);
    while(A_flag != '0')
    {
        printf(BLUE"\n*****************************请输入联系人********************************\n"NONE);
        for(i = count; i < 1000; i++)
        {
            ret = PersonInsert(ps, i, Large);
            if(ret == failure)
            {
                printf("build failure!\n");
                goto A;
            }
            count++;
            clear++;
            printf(BLUE"是否需要继续输入?任意键继续,退出请按0\n"NONE);
            scanf(" %c",&flag);
            if(flag == '0')
                goto A;
            if(clear == 2)
            {
                system("clear");
                clear = 0;
            }
        }
    }
}

int Traverse(Person *ps)
{
    int i = 1;
    if(NULL == ps)
        return failure;
    while(ps->next)
    {

        ps = ps->next;
        ps->no = i;
        printf("NO:%d\tName: %s\t\tage: %d\n\tSex: %s\t\ttel: %s\n",ps->no, ps->name, ps->age, ps->sex, ps->tel);
        i++;
    }
    return success;
}
void Display(Person *ps)
{
    system("clear");
    printf("\n");
    int i = 1;
    char D_flag = 'a';
    int flag = 0;
    int way;

    while(D_flag != '0')
    {
        if(count == 0)
        {
            printf(L_BLUE"联系人为空,快去添加吧 \n"NONE);
            goto D;
        }
        else
        {
            printf("按姓名升序请按0,任意键降序!\n");
            scanf(" %c",&sort);
            if(sort == '0')
            {
                printf("*********************************************************************\n");
                Person *q = ps;
                way = Traverse(q);
                if(way == failure)
                {
                    printf("display failure!\n");
                    goto D;
                }
                else
                {
                    printf("display success!\n");
                }
            }
            else
            {
                if(flag == 0)
                {
                    Person *p = ps->next;
                    ps->next = NULL;
                    Person *q = NULL;
                    while(p)
                    {
                        q = p;
                        p = p->next;
                        q->next = ps->next;
                        ps->next = q;
                    }
                    flag++;
                }
                while(ps->next)
                {
                    ps = ps->next;
                    ps->no = i;
                    printf("NO:%d\tName: %s\t\tage: %d\n\tSex: %s\t\ttel: %s\n",ps->no, ps->name, ps->age, ps->sex, ps->tel);
                    i++;
                }
            }
        }
D:              printf(L_BLUE"返回上一级请按0\n"NONE);
                scanf(" %c",&D_flag);
                i = 1;
    }
}

void FindInfo(Person *ps)
{
    char name[20];
    int i;
    char F_flag = 'a';
dd: printf(L_PURPLE"退出查找请按0,任意键继续\n"NONE);
    scanf(" %c",&F_flag);
    system("clear");
    if(count == 0)
    {
        F_flag = '0';
        Display(ps);
    }
    while(F_flag != '0')
    {
        printf(L_PURPLE"请输入要查找的联系人姓名:\n"NONE);
        scanf("%s",name);
        while(ps->next)
        {
            ps = ps->next;
            if(strcmp(ps->name,name) == 0)
            {
                printf(L_PURPLE"已找到!\n"NONE);
                printf(L_PURPLE"编号:%d 姓名:%s 年龄:%d 性别:%s 联系方式:%s\n"NONE,
                        ps->no, ps->name, ps->age, ps->sex, ps->tel);
               number = ps->no; 
                goto dd;
            }
        }
        if(ps->next == NULL)
        {
            printf(L_PURPLE"没有相关联系人,请检查输入是否有误\n"NONE);
            goto dd;
        }
    }
}

void Modify(Person *ps)
{
    char c;
    int i = 0;
    char M_flag = 'a';
    if(count == 0)
    {
        system("clear");
        printf("\n\n还没有联系人,快去添加吧!\n");
        M_flag = '0';
    }
M2: printf("如需退出修改请按0,任意键继续\n");
    scanf(" %c",&M_flag);
    while(M_flag != '0')
    {
        FindInfo(ps);
        if(number != -1)
        {
            while(i < number && ps)
            {
                ps = ps->next;
                i++;
            }
M1:         system("clear");
            printf("序号为:%d\t姓名为:%s\t\t 年龄为:%d\n\t\t\t性别为: %s\t联系方式为:%s\n",
                    ps->no,ps->name,ps->age,ps->sex,ps->tel);
            printf("请选择需要修改项:1、姓名 2、年龄 3、性别 4、联系方式\t 按0键返回\n");
            scanf(" %c",&c);
            if(c == '1')
            {
                printf("请输入姓名:\n");
                scanf("%s",ps->name);
                printf("修改成功!");
                goto M1;
            }
            else if(c == '2')
            {
                printf("请输入年龄:\n");
                scanf("%d",&ps->age);
                printf("修改成功!\n");
                goto M1;
            }
            else if(c == '3')
            {
                printf("请输入性别:\n");
                scanf("%s",ps->sex);
                printf("修改成功!\n");
                goto M1;
            }
            else if(c == '4')
            {
                printf("请输入联系号码:\n");
                scanf("%s",ps->tel);
                printf("修改成功!\n");
                goto M1; 
            }
            else if(c == '0')
            {   
                goto M2;
            }
            else
            {
                printf("输入不符合规范请重试\n");
                goto M1;
            }
        }
        if(number == -1)
        {
            printf("没有相关联系人\n");
            goto M2;
        }
    }
}

int Insert(Person *ps, Person *tmp)
{
    if(ps == NULL)
    {
        return 0;
    }
    Person *n = (Person *)malloc(sizeof(Person));
    while(ps->next)
    {
        ps = ps->next;
    }
    *n = *tmp;
    ps->next = n;
    n->next = NULL;
    return 1;
}



int main()
{
    FILE * fp_read, *fp_write;
    char choice;
    int test;
    int ret;
    Person *ps = NULL;
    
    /*fd_write = open("tongxunlu.txt", O_RDWR | O_CREAT, S_IRWXU);
    if (-1 == fd_read)
    {
        perror("open1");
        exit(1);
    }*/
    fp_read = fopen("tongxunlu.txt", "r");
    if (NULL == fp_read)
    {
        perror("fopen");
        exit(1);
    }
    test = PersonInit(&ps);
    if(test == failure)
    {
        system("clear");
        printf("初始化失败!\n");
        sleep(1);
    }
    else
    {
        system("clear");
        printf("初始化成功!\n");
        sleep(1);
    }
    Person *tmp2 = (Person *)malloc(sizeof(Person));
    while(fread(tmp2, 1, sizeof(Person), fp_read))
    {
        ret = Insert(ps, tmp2);
        if(ret == 0)
        {
            printf("文件读取失败!\n");
            sleep(1);
            exit(1);
        }
        count++;
    }
    printf("文件读取成功!\n");
    sleep(1);
    free(tmp2);
    fclose(fp_read);
    while(1)
    {
        hello();
        printf("请输入你的选择:\n");
        scanf(" %c",&choice);
          
        switch (choice)
        {
            case '1' :
                AddInfo(ps);
                break;
            case '2':
               CutInfo(ps);
                break;
            case '3':
                Display(ps);
                break;
            case '4':
                Modify(ps);
                break;
            case '6':
                FindInfo(ps);
                break;
            case '7':
                system("clear");
                Person *tmp = ps->next;
                fp_write = fopen("tongxunlu.txt", "w");
                while(tmp)
                {
                    ret = fwrite(tmp, 1, sizeof(Person), fp_write);
                    if(ret == -1)
                    {
                        perror("fwrite");
                        exit(1);
                    }
                    tmp = tmp->next;
                }
                fclose(fp_write);
                sleep(1);
                exit (0);
                break;
            default:
                printf("输入有误,重新输入!\n");
                break;

        }
    }
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值