博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用C语言写的一个控制台界面的通讯录管理系统
阅读量:6540 次
发布时间:2019-06-24

本文共 9375 字,大约阅读时间需要 31 分钟。

  RT, 用C写的, 帮别人做的作业~

  主要是用链表实现了基本的插入, 删除, 修改, 访问, 遍历, 保存, 读取等的操作
  以命令的方式操作~
  话说还是我第一次写这类东西, 很不情愿的说, 都已经帮别人做了好几次的作业了
  写了近400行代码, 容错能力还是不是很差, 可以用, 可以交差~
  截图:
命令后面的中括号内是该命令需要的参数~
以下是源代码:
  分三个文件:
    contact.c:主程序
    list.c/list.h:链表的操作

//contact.c - 包含了对输入的命令的解释#include 
#include
#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 
#include
#include
#include
#include
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://mysdo.baihongyu.com/

你可能感兴趣的文章
C#语法——泛型的多种应用 C#语法——await与async的正确打开方式 C#线程安全使用(五) C#语法——元组类型 好好耕耘 redis和memcached的区别...
查看>>
Eclipse更新慢、插件安装慢解决方案zz
查看>>
备份链中断导致差异备份报错案例
查看>>
基于matplotlib的数据可视化 - 柱状图bar
查看>>
Apple公司Darwin流式服务器源代码分析
查看>>
IIS运行一段时间不响应的解决方法
查看>>
android自定义控件添加自定义属性
查看>>
用RegularJS开发小程序 — mpregular解析
查看>>
05 吸收应用-会整理还不够?教你吸收、联想、输出、应用
查看>>
mysql重置密码和mysql error 1044(42000)错误
查看>>
【docker】常用命令
查看>>
使用redis-stat来监控redis实例
查看>>
webstorm的个性化设置settings
查看>>
.NET开发微信公众号之创建自定义菜单
查看>>
“There's no Qt version assigned to this project for platform ” - visual studio plugin for Qt
查看>>
如何在 Windows 上 使用 ONLYOFFICE 协作编辑文档
查看>>
【织梦dedecms安全设置】dedecms如何防止被黑?dedecms被黑了怎么办?
查看>>
[引]ionic framework 相关网站
查看>>
go 学习笔记(4) ---项目结构
查看>>
GitLab目录迁移方法
查看>>