用C语言写的一个控制台界面的通讯录管理系统

  RT, 用C写的, 帮别人做的作业~
  主要是用链表实现了基本的插入, 删除, 修改, 访问, 遍历, 保存, 读取等的操作
  以命令的方式操作~
  话说还是我第一次写这类东西, 很不情愿的说, 都已经帮别人做了好几次的作业了
  写了近400行代码, 容错能力还是不是很差, 可以用, 可以交差~
  截图:
用C语言写的一个控制台界面的通讯录管理系统
命令后面的中括号内是该命令需要的参数~

以下是源代码:
  分三个文件:
    contact.c:主程序
    list.c/list.h:链表的操作


//contact.c - 包含了对输入的命令的解释

#include <stdio.h>

#include <stdlib.h>



#include "list.h"



void show_help(void)

{

    printf(

        "**********************\n"

        "欢迎使用通讯录管理系统\n"

        "**********************\n\n"

        "请选择操作命令:\n"

        " h\t\t 查看此帮助信息\n"

        " v\t\t 查看所有联系人信息\n"

        " s\t\t 保存更新联系人信息到文件\n"

        " u\t\t 从文件中加载联系人信息\n"

        " n [姓名]\t 查询姓名对应的电话\n"

        " e [姓名]\t 修改指定联系人\n"

        " d [姓名]\t 删除指定联系人\n"

        " t [电话]\t 查询电话对应的姓名\n"

        " a [姓名] [电话] 新增联系人信息\n"

        " q\t\t 退出程序\n"

        "\n说明:\n"

        "\t第1次操作前请先执行命令 u 加载联系人信息\n"

        "\t退出前记得执行命令 s 保存联系人信息到文件\n"

        );

}



void do_cmd(void)

{

    char cmd[32];

    contact* pc = NULL;

    if(!list_create(&pc)) return;

    for(;;){

        char* pch = NULL;

        printf("命令>");

        fflush(stdin);

        fgets(cmd, sizeof(cmd), stdin);

        if(*cmd == '\n')

            continue;

        else if(*cmd == 'q')

            break;

        pch = strchr(cmd, '\n');

        if(pch) *pch = 0;

        if(cmd[1] && cmd[1]!=0x20) *cmd = 0;

        switch(*cmd)

        {

        case 'u':list_load(pc);break;

        case 's':list_save(pc);break;

        case 'v':list_view_all(pc);break;

        case 'h':show_help();break;

        case 'n':

        case 'e':

        case 'd':

        case 't':

        case 'a':

            {

                pch = cmd+1;

                while(*pch == 0x20 || *pch == '\t')

                    pch++;

                if(!*pch){

                    printf("命令 %c 缺少参数!\n", *cmd);

                    break;

                }

                if     (*cmd == 'n') list_view_name(pc, pch);

                else if(*cmd == 'e') list_edit(pc, pch);

                else if(*cmd == 'd') list_delete(pc, pch);

                else if(*cmd == 't') list_view_tel(pc, pch);

                else if(*cmd == 'a'){

                    //pch -> name

                    char* tel = NULL;

                    for(tel=pch; *tel && *tel!=0x20 && *tel!='\t'; tel++)

                        ;

                    if(*tel) *tel = 0;

                    tel++;

                    while(*tel && (*tel==0x20||*tel=='\t'))

                        tel++;

                    if(!*tel){

                        printf("没有电话号码, 参数不足!\n");

                        break;

                    }

                    list_add(pc, pch, tel);

                }

                break;

            }//case

        default:

            printf("未知命令!\n");

            break;

        }//switch

    }//for

    list_free(&pc);

    return;

}



int main(void)

{

    show_help();

    do_cmd();

    return 0;

}
//list.h - 链接操作的前向声明

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <ctype.h>

#include <errno.h>



typedef struct _contact{

    char name[16];

    char tel[12];

    struct _contact* next;

}contact;



int list_load(contact* phead);

void list_save(contact* pContact);

void list_edit(contact* pContact, char* name);

void list_delete(contact* pContact, char* name);

void list_view_tel(contact* pContact, char* tel);

void list_view_name(contact* pContact, char* name);

void list_view_all(contact* pContact);

int  list_create(contact** ppContact);

void list_free(contact** pp);

void list_add(contact* p, char* name, char* tel);
//list.c - 链表的具体操作部分的实现

#include "list.h"



int list_create(contact** ppContact)

{

    contact* p = NULL;

    p = (contact*)malloc(sizeof(contact));

    if(!p){

        perror("内存分配错误");

        *ppContact = NULL;

        return 0;

    }

    memset(p, 0, sizeof(contact));

    *ppContact = p;

    return 1;

}



void list_view_all(contact* pContact)

{

    if(!pContact) return;

    pContact = pContact->next;

    while(pContact){

        printf(

            "姓名:%s\n"

            "电话:%s\n"

            "\n",

            pContact->name,

            pContact->tel

            );

        pContact = pContact->next;

    }

}



void list_view_name(contact* pContact, char* name)

{

    if(!pContact) return;

    pContact = pContact->next;

    while(pContact){

        if(!strcmp(pContact->name, name)){

            printf(

                "姓名:%s\n"

                "电话:%s\n"

                "\n",

                pContact->name,

                pContact->tel

            );

            break;

        }

        pContact = pContact->next;

    }

    if(!pContact){

        printf("没有找到该联系人!\n");

    }

}



void list_view_tel(contact* pContact, char* tel)

{

    char* pch = NULL;

    if(!pContact) return;

    pContact = pContact->next;

    for(pch=tel; *pch; pch++){

        if(!isdigit(*pch)){

            printf("电话号码格式不正确!\n");

            return;

        }

        if(*pch==0x20){

            *pch = 0;

            break;

        }

    }

    while(pContact){

        if(!strcmp(pContact->tel, tel)){

            printf(

                "姓名:%s\n"

                "电话:%s\n"

                "\n",

                pContact->name,

                pContact->tel

                );

            break;

        }

        pContact = pContact->next;

    }

    if(!pContact){

        printf("无此电话号码!\n");

    }

}



void list_delete(contact* pContact, char* name)

{

    contact* last = NULL;

    if(!pContact) return;

    last = pContact;

    for(; pContact && strcmp(pContact->name, name);){

        last = pContact;

        pContact = pContact->next;

    }

    if(!pContact){

        printf("没有此联系人:%s\n", name);

        return;

    }else{

        last->next = pContact->next;

        free(pContact);

        printf("已删除联系人:%s\n", name);

        return;

    }

}



void list_edit(contact* pContact, char* name)

{

    if(!pContact) return;

    pContact = pContact->next;

    while(pContact && strcmp(pContact->name, name))

        pContact = pContact->next;

    if(!pContact){

        printf("没有此联系人:%s\n", name);

        return;

    }else{

        char* pch = NULL;

        contact dummy;

        dummy.next = NULL;

        for(;;){

            printf("新姓名:");

            fflush(stdin);

            fgets(pContact->name, sizeof(dummy.name), stdin);

            if(*pContact->name != '\n'){

                pch = strchr(pContact->name, '\n');

                if(pch) *pch = 0;

                break;

            }else{

                continue;

            }

        }

        for(;;){

            printf("新电话:");

            fflush(stdin);

            fgets(pContact->tel, sizeof(dummy.tel), stdin);

            if(*pContact->tel == '\n'){

                continue;

            }else{

                for(pch=pContact->tel; *pch; pch++){

                    if(!isdigit(*pch)){

                        printf("联系人电话无效:%s\n", pContact->tel);

                        break;

                    }

                }

                if(!*pch) break;

                else continue;

            }



        }

        printf("修改成功!\n");

        return;

    }

}



void list_save(contact* pContact)

{

    FILE* fp = NULL;

    if(!pContact || ( pContact&&!pContact->next)){

        printf("没有数据需要保存!\n");

        return;

    }

    fp = fopen("contact.dat", "wb");

    if(!fp){

        perror("无法保存通讯录");

        return;

    }

    pContact = pContact->next;

    while(pContact){

        fwrite(pContact, 1, sizeof(contact), fp);

        pContact = pContact->next;

    }

    printf("所有联系人信息均已保存更新!\n");

    fclose(fp);

    return;

}



void list_add(contact* p, char* name, char* tel)

{

    contact dummy;

    char* pch = NULL;

    dummy.next = NULL;

    if(!p) list_create(&p);

    if(!p) return;

    while(p->next)

        p = p->next;

    list_create(&p->next);

    if(!p->next) return;

    strncpy(p->next->name, name, sizeof(dummy.name));

    for(pch=tel; *pch; pch++){

        if(!isdigit(*pch)){

            printf("电话号码格式不正确!\n");

            break;

        }

    }

    if(*pch){

        free(p->next);

        p->next = NULL;

        return;

    }

    strncpy(p->next->tel, tel, sizeof(dummy.tel));

    printf(

        "新增联系人:\n"

        "   姓名:%s\n"

        "   电话:%s\n",

        p->next->name, p->next->tel

        );

    p->next->next = NULL;

    return;

}



int list_load(contact* phead)

{

    FILE* fp = NULL;

    size_t file_size = 0;

    int count = 0;

    contact dummy = {0};

    if(!phead){

        printf("请先初始化!\n");

        return 0;

    }

    if(phead->next){

        printf("请不要重复初始化/加载文件!\n");

        return 0;

    }

    fp = fopen("contact.dat", "rb");

    if(!fp){

        if(errno == ENOENT){

            printf("没有找到任何联系人信息!\n");

            phead->next = NULL;

            return 1;

        }else{

            perror("读取联系人信息时错误");

            return 0;

        }

    }

    fseek(fp, 0, SEEK_END);

    file_size = ftell(fp);

    if(file_size%sizeof(contact)){

        printf("通讯录文件格式不正确!\n");

        fclose(fp);

        return 0;

    }

    rewind(fp);

    while(fread(&dummy, 1, sizeof(dummy), fp) == sizeof(dummy)){

        phead->next = (contact*)malloc(sizeof(contact));

        if(!phead->next){

            perror("分配内存出错");

            continue;

        }

        memcpy(phead->next, &dummy, sizeof(contact));

        phead->next->name[sizeof(dummy.name)-1] = 0;

        phead->next->tel[sizeof(dummy.tel)-1] = 0;

        phead = phead->next;

        phead->next = NULL;

        ++count;

    }

    fclose(fp);

    printf("共找到 %d 条联系人信息!\n\n", count);

    return 1;

}



void list_free(contact** pp)

{

    contact* q = NULL;

    contact* p = *pp;

    while(p){

        q = p->next;

        free(p);

        p = q;

    }

    *pp = NULL;

    return;

}

女孩不哭(QQ:191035066)@2012-12-27 00:04:45 http://www.cnblogs.com/nbsofer

你可能感兴趣的:(C语言)