通讯录系统设计(带文件保存)

语言:c语言

格式: 编号 姓 名 住址 电话 住宅电话
201701 * xxxx 183****5668

要求:使用结构体形式对数据存储

功能:使用链表实现增加(在增加人员的过程中有一个自动排序功能,比如按姓名排序)、删除、修改、查找(比如:工号查找、电话查找)的功能;
(1)添加用户信息(号码长度 号码是否重复)
(2)列出好友信息(按姓名排序)
(3)查找好友信息(按姓名查找)
(4)删除好友
(5)退出

头文件: AddressBook.h

#ifndef _ADDRESSBOOK_H_
#define _ADDRESSBOOK_H_

#define FAILURE 10000
#define SUCCESS 20000
#define FALSE   30000


typedef struct node     //定义一个结构体,保存结点信息
{
    char name[20];
    char number[20];
    char ID[20];
    char address[20];
    char homephone[20];
    struct node *next;
}Node;

typedef Node *LinkList;


#endif

接口函数: AddressBook.c

#include 
#include 
#include "AddressBook.h"
#include 
#include 
#include 
#include 
#include 

/*  初始化模块   */

int ListInit(LinkList *L)
{
    (*L) = (LinkList)malloc(sizeof(Node));  //为链表分配空间
    (*L)->next = NULL;
}

/*  插入模块(并按姓名排序)*/
int InsertInfo(LinkList *L)
{
    LinkList p = *L;
    LinkList s;

    printf("请输入好友信息(姓名 工号 手机号 住址 家庭电话):\n");

    s = (LinkList)malloc(sizeof(Node));
    scanf("%s%s%s%s%s",s->name, s->ID, s->number, s->address, s->homephone);

    if(strlen(s->number) != 11)     //手机号长度不为11
    {
        printf("输入手机号码错误!\n");
        return FALSE;
    }
    if(strlen(s->homephone) != 8)   //家庭电话长度不为8
    {
        printf("输入家庭电话错误!\n");
        return FALSE;
    }
    /* 此部分还需完善,对重名的处理还有其他很多方式,此处可以检测到重名,但是并未替换 */
    int flag;
    while(p->next != NULL)
    {
        if(strcmp((p->next)->name,s->name) == 0)    //判断重名
        {
            printf("该名字已存在,是否替换?\n");
            printf("1.是       2 . 否\n" );
            scanf("%d", &flag);

            if(1 == flag)
            {
                p  = s ;
                break;
            }
            if(2 == flag)
            {
                PrintInfo();
            }
        }

        if(strcmp((p->next)->number,s->number) == 0)    //判断重号
        {
            printf("已存在相同手机号码!\n"); //家庭号码可以重复,无需考虑
            return FALSE;
        }
        p = p->next;
    }

    p = *L;
    if(p -> next == NULL)
    {
        s->next = p->next;
        p->next = s;
    }
    else
    {
    /* 对输入的信息按人名排序 */
        while(p->next)
        {
            if(strcmp((p -> next)->name, s -> name) > 0)    
            {
                s->next = p->next;
                p->next = s;
                break;
            }
            p = p -> next;
        }
        if(NULL == p->next)
        {
            s->next = p->next;
            p->next = s;

        }
    }
    printf("是否继续输入联系人?\n");
    printf("1.是      2.否\n");
    scanf("%d",&flag);

    if( 1 == flag)
    {
        InsertInfo(L);  //继续输入
    }
    else if( 2 == flag)
    {
        return 0;
    }
    else 
    {
        printf("输入错误!\n");
    }
}


/*  显示模块    */

int ShowInfo(LinkList L)
{
    if(L->next == NULL)
    {
        printf("通讯录为空!\n");
    }
    else
    {
        LinkList p = L->next;       

        while(p)
        {
            printf("Name: %s  Id: %s  number: %s  homephone: %s  Address: %s\n",p->name,p->ID,p->number,p->homephone,p->address);
            p=p->next;
        }
    }
}


/*  查询模块    */

int SearchInfo (LinkList L)
{
    LinkList p = L -> next;
    char n[10];
    printf("输入想要查询的好友的姓名:\n");
    scanf("%s",n);

    while(p)
    {
        if(strcmp(p->name,n) == 0)  //查询到此人
        {
            printf("ID: %s Tele: %s Mobile: %s Address: %s\n",p->ID,p->homephone,p->number,p->address);
            break;
        }
        else
        {
            p =p->next;
        }
    }
    if(NULL == p)
        printf("查无此人!\n");
}

/*  删除模块    */

int DeleteInfo(LinkList L)

{
    LinkList p = L;
    LinkList tmp;
    char n[10];
    printf("输入想要删除的好友的姓名:\n");
    scanf("%s",n);

    if(p -> next == NULL)
    {
        printf("通讯录为空!\n");
        return FALSE;
    }   
    else
    {
        while(p -> next)

        {   
            if(strcmp((p->next)->name,n) == 0)      //找到这个人
            {
                tmp = p->next;
                p->next = tmp->next;
                free(tmp);
                printf("删除好友信息成功!\n");
                return SUCCESS;
            }

            p =p->next;
        }

        if(p -> next == NULL)
        {
            printf("查无此人!\n");
            return FALSE;
        }   

    }
}
/*  修改模块    */

int ChangeInfo(LinkList *L)
{
    LinkList t;
    LinkList p = (*L)->next;
    LinkList s ;
    char n[10];
    char a[10];
    char b[10];
    char c[10];
    char d[10];
    char e[10];

    printf("输入想要修改的好友的姓名:\n");
    scanf("%s",n);

    int flag;
    while(p)
    {
        if(strcmp(p->name,n) == 0)
        {
            printf("请输入您要修改的信息:1.姓名 2.编号 3.电话 4.家庭电话 5.住址\n");  //5个选项是输入分别对应上面的abcde
            scanf("%d",&flag);

            t = p;

            switch(flag)
            {
                /* 修改姓名 */
                case 1:
                    printf("Please input a new name:\n");   
                    scanf("%s",a );

                    p = (*L)->next;

                    while(p)
                    {
                        if(strcmp(p->name,a) == 0)
                        {
                            printf("此名字已在通讯录中!\n"); 
                            return FAILURE;
                        }
                        p = p->next;
                    }
                    if( NULL == p)
                    {
                        strcpy(p->name , a);
                        printf("修改姓名成功!\n");
                        return SUCCESS;
                    }

                    p = (*L)->next;
                    while(p->next)
                    {
                        if(strcmp((p -> next)->name, a) > 0)
                        {
                            s->next = p->next;
                            p->next = s;
                            break;
                        }
                            p = p -> next;
                    }

                    /* 修改工号 */
                    case 2:

                    printf("%s 的工号为:%s\n",p->name, p->ID);
                    printf("Please input a new ID:\n");
                    scanf("%s",b );

                    p = (*L)->next;
                    while(p)
                    {
                        if(strcmp(p->ID,b) == 0)
                        {
                            printf("此工号已在通讯录中!\n");
                            break;
                        }
                        p = p->next;

                    }
                        strcpy(t->ID , b);
                        printf("修改工号成功!\n");
                        return SUCCESS;

                    /* 修改电话 */
                    case 3:

                    p = (*L)->next;
                    printf("%s 的电话为:%s\n",p->name, p->number);
                    printf("Please input a new number:\n");
                    scanf("%s",c );

                    while(p)
                    {
                        if(strlen(p->number) != 11)
                        {
                            printf("无效手机号码!\n");
                            return FAILURE;
                        }
                        if(strcmp(p->ID,c) == 0)
                        {
                            printf("此号码已在通讯录中!\n");
                            return FAILURE;
                        }
                        p = p->next;
                    }
                    if( NULL == p)
                    {
                        strcpy(t->ID , b);
                        printf("修改号码成功!\n");
                        return SUCCESS;
                    }

                /* 修改家庭电话 */
                case 4:
                    printf("%s 的家庭电话为:%s\n",p->name, p->homephone);     
                    printf("Please input a new homephone:\n");
                    scanf("%s",d );

                    p = (*L)->next;
                    while(p)
                    {
                        if(strlen(p->homephone) != 8)
                        {
                            printf("无效家庭电话号码!\n");
                            return FAILURE;
                        }
                        p = p->next;
                    }
                    if( NULL == p)
                    {
                        strcpy(t->homephone , d);
                        printf("修改家庭电话成功!\n");
                        return SUCCESS;
                    }

                /* 修改家庭住址 */
                case 5:
                    printf("%s 的家庭住址为:%s\n",p->name, p->address);       
                    printf("Please input a new address:\n");
                    scanf("%s",e );

                    strcpy(t->address , e);
                    printf("修改地址成功!\n");
                    return SUCCESS;

                default :
                    printf("输入错误!\n");
            }
        }
        p = p->next;

        if(p == NULL)
        {
            printf("查无此人!\n");
            return FAILURE;
        }
    }
        printf("是否继续修改:\n");
        printf("1.是      2.否\n");
        scanf("%d",&flag);

        if(1 == flag)
        {       
            ChangeInfo(L);
        }
        else if(2 == flag)
        {
            PrintInfo();
        }
        else
        {
            printf("输入错误!\n");
            return FAILURE;
        }
}

/* 保存模块 */
int SaveInfo(LinkList L)
{
    printf("保存中,请稍等...\n");
    sleep(2);
    printf("正在退出...\n");
    sleep(2);
    LinkList p = L->next;
    FILE *fp;

    fp = fopen("address.txt","w");      //以只写方式打开这个文件(会在当前目录创建一个address.txt的文件)
    if (NULL == fp)
    {
        perror("fopen");
        exit(1);
    }
    while(p)
    {
        fwrite(p, sizeof(Node), 1, fp);
        p = p->next;
    }
    fclose(fp);
}

/* 打开文件 */
void ReadInfo(LinkList L)
{
    FILE *fp;
    LinkList p;
    p = L->next; 
    size_t ret;

    p = NULL;
    LinkList x = L;

    fp = fopen("address.txt", "r");     //以只读方式打开这个文件
    if (NULL == fp)
    {
        perror("fopen");
        exit(1);
    }
    while(!feof(fp))
    {
        p = (LinkList)malloc(sizeof(Node));
        if(NULL == p)
        {
            printf("malloc failure!\n");
            return; 
        }
        if(fread(p, sizeof(Node), 1, fp) != 1)
        {
            break;
        }
        else
        {
            p->next = NULL;
            x->next = p;
            x = p;
        }
    }
    fclose(fp);
}

主函数:main.c

#include 
#include 
#include "AddressBook.h"

void show() 
{ 
    system("clear"); 
    printf("**************************************\n\n"); 
    printf("**********欢迎来到華仔通讯录**********\n\n");
    printf("**************************************\n\n");
    sleep(0.5); 
//  system("clear");
}

void PrintInfo()
{
    printf("*-------------------------------------------*\n");
    printf("|   1.添加用户信息         2.列出好友信息   |\n");
    printf("|   3.查找好友信息         4.删除好友       |\n");
    printf("|   5.修改好友信息         6.保存并退出     |\n");
    printf("*-------------------------------------------*\n\n");
    printf("***********请输入你的选择***********\n");
}


int main()
{   
    LinkList txl;
    int choice;

    show();

    ListInit(&txl);     //初始化,将链表置空

    ReadInfo(txl);      //每次打开都从.txt文件中读出上次保存后的信息,读到链表中

    while(1)
    {
        PrintInfo();
        scanf("%d",&choice);

        switch (choice)
        {
            case 1:
                InsertInfo(&txl);   
                break;
            case 2:
                ShowInfo(txl);
                break;
            case 3:
                SearchInfo(txl);
                break;
            case 4:
                DeleteInfo(txl);
                break;
            case 5:
                ChangeInfo(&txl);
                break;
            case 6:
                SaveInfo(txl);
                exit(1);
            default:
                printf("Unknown Input!\n");
                break;
        }   
    }


    return 0;
}

你可能感兴趣的:(程序)