通讯录小项目(C语言动态版本)

来源:互联网 发布:图像处理算法 编辑:程序博客网 时间:2024/05/18 01:23

项目要求:

1、通讯录采用动态分配空间方式存储个人的信息,每个人的信息包括:`姓名、性别、年龄、电话、住址`。2、通讯录基本要求如下:a、添加联系人信息b、删除指定联系人信息c、查找指定联系人信息d、修改指定联系人信息e、显示所有联系人信息f、清空所有联系人g、以名字排序所有联系人

思路框图:

通讯录


test.c:

#include"address_list.h"struct list *address_list()//通讯录主函数{    ADDRESS con;    int input = 0;    init(&con);    do    {        menu2();        printf("请选择:>");        scanf("%d", &input);        switch (input)        {        case EXIT:            break;        case ADD:            system("CLS");            add(&con);            break;        case DELE:            system("CLS");            dele(&con);            break;        case SEARCH:            system("CLS");            search(&con);            break;        case MODIFY:            system("CLS");            modify(&con);            break;        case SHOW:            system("CLS");            show(&con);            break;        case CLEAR:            system("CLS");            clear(&con);            break;        case SORT:            system("CLS");            sort(&con);            break;        default:            printf("输入有误,请重新输入!\n");            break;        }    } while (input);    return con.pcon;//返回动态开辟内存地址}void menu1(){    printf("***********************\n");    printf("**** 0.EXIT 1.OPEN ****\n");    printf("***********************\n");}void test()//测试函数{    int input = 0;    struct list *ret = NULL;//用来接收通讯录主函数返回的动态开辟内存地址    do    {        menu1();        printf("请选择:>");        scanf("%d", &input);        switch (input)        {        case 0:            break;        case 1:            system("CLS");            ret = address_list();//通讯录主函数            break;        default:            printf("输入有误,请重新输入!\n");            break;        }    } while (input);    free(ret);//释放通讯录主函数内部动态开辟的内存空间,当程序没有彻底退出时,第二次进入通讯录主函数时第一次的结果仍保留。}int main(){    test();//测试函数    return 0;}

address_list.h:

#ifndef __ADDRESS_LIST_H__#define __ADDRESS_LIST_H__#define _CRT_SECURE_NO_WARNINGS 1//      功能函数://1.    添加联系人信息//2.    删除指定联系人信息//3.    查找指定联系人信息//4.    修改指定联系人信息//5.    显示所有联系人信息//6.    清空所有联系人//7.    以名字排序所有联系人#include<stdio.h>#include<stdlib.h>#include<string.h>#include<assert.h>#define NAME_MAX 13//最大姓名长度#define SEX_MAX 6//最大性别长度#define PHONE_MAX 12//最大电话位数长度#define ADDRESS_MAX 12//最大地址长度#define INCREASE 10//每次增加元素个数struct list//每个联系人数据结构{    char name[NAME_MAX];    char sex[SEX_MAX];    int age;    char phone[PHONE_MAX];    char address[ADDRESS_MAX];};typedef struct//整个通讯录结构{    struct list *pcon;    int stock;//    stock库存    int depot;//    depot仓库}ADDRESS,*PADDRESS;enum{    EXIT,    ADD,    DELE,    SEARCH,    MODIFY,    SHOW,    CLEAR,    SORT};void menu2();//通讯录功能菜单函数void  init(PADDRESS plist);//初始化函数void add(PADDRESS plist);//添加函数void dele(PADDRESS plist);//删除函数void search(PADDRESS plist);//查找函数void modify(PADDRESS plist);//修改函数void show(PADDRESS plist);//显示函数void clear(PADDRESS plist);//清空函数void sort(PADDRESS plist);//查找函数#endif//__ADDRESS_LIST_H__

address_list.c:

#include"address_list.h"void menu2()//功能菜单函数实现{    printf("*********************************\n");    printf("****  0.EXIT      1.ADD     *****\n");    printf("****  2.DELETE    3.SEARCH  *****\n");    printf("****  4.MODIFY    5.SHOW    *****\n");    printf("****  6.CLEAR     7.SORT    *****\n");    printf("*********************************\n");}void  init(PADDRESS plist)//初始化函数实现{    plist->pcon = (struct list *)malloc(sizeof(struct list)*INCREASE);    assert(plist->pcon != NULL);    plist->stock = 0;    plist->depot = INCREASE;}static int hunt(PADDRESS plist,const char *pname)//各功能函数公用搜索模块{    int i = 0;    for (i = 0; i < plist->stock; i++)    {        if (strcmp((plist->pcon+i)->name,pname) == 0)        {            return i;        }    }    return -1;}void add(PADDRESS plist)//添加函数实现{    if (plist->stock == plist->depot)    {        struct list *tmp = (struct list *)realloc(plist->pcon, (plist->depot + INCREASE)*sizeof(struct list));        if (tmp == NULL)        {            printf("Memory allot flunk!\n");            return;        }        else        {            plist->pcon = tmp;            plist->depot += INCREASE;            goto flag;        }    }    else    {    flag:        printf("请输入姓名:>");        scanf("%s", (plist->pcon + plist->stock)->name);        printf("请输入性别:>");        scanf("%s", (plist->pcon + plist->stock)->sex);        printf("请输入年龄:>");        scanf("%d", &((plist->pcon + plist->stock)->age));        printf("请输入电话:>");        scanf("%s", (plist->pcon + plist->stock)->phone);        printf("请输入地址:>");        scanf("%s", (plist->pcon + plist->stock)->address);        plist->stock++;        printf("添加成功!\n");    }}void dele(PADDRESS plist)//删除函数实现{    char tmp[NAME_MAX] = { 0 };    int ret = 0;    printf("请输入要删除联系人姓名:>");    scanf("%s", tmp);    ret = hunt(plist, tmp);    if (ret == -1)    {        printf("未找到所要删除联系人!\n");    }    else    {        for (; ret < plist->stock-1; ret++)        {            *(plist->pcon + ret) = *(plist->pcon + ret + 1);        }        plist->stock--;        printf("删除成功!\n");    }}void search(PADDRESS plist)//查找函数实现{    char tmp[NAME_MAX] = { 0 };    int ret = 0;    printf("请输入要查找联系人姓名:>");    scanf("%s", tmp);    ret = hunt(plist, tmp);    if (ret == -1)    {        printf("Not find contact!\n");    }    else    {        printf("Contact subscript is: %d\n", ret + 1);    }}void modify(PADDRESS plist)//修改函数实现{    char tmp[NAME_MAX] = { 0 };    int ret = 0;    printf("请输入要修改联系人姓名:>");    scanf("%s", tmp);    ret = hunt(plist, tmp);    if (ret == -1)    {        printf("未找到此联系人!\n");    }    else    {        printf("请输入姓名:>");        scanf("%s", (plist->pcon + ret)->name);        printf("请输入性别:>");        scanf("%s", (plist->pcon + ret)->sex);        printf("请输入年龄:>");        scanf("%d", &((plist->pcon + ret)->age));        printf("请输入电话:>");        scanf("%s", (plist->pcon + ret)->phone);        printf("请输入地址:>");        scanf("%s", (plist->pcon + ret)->address);        printf("修改成功!\n");    }}void show(PADDRESS plist)//显示函数实现{    int i = 0;    printf("%-13s %-6s %-3s %-12s %-12s\n", "NAME", "SEX", "AGE", "PHONE", "ADDRESS");    for (i = 0; i < plist->stock; i++)    {        printf("%-13s %-6s %-3d %-12s %-12s\n", (plist->pcon + i)->name, (plist->pcon + i)->sex, (plist->pcon + i)->age, (plist->pcon + i)->phone, (plist->pcon + i)->address);    }}void clear(PADDRESS plist)//清空函数实现{    plist->pcon = NULL;    plist->depot = 0;    plist->stock = 0;}void sort(PADDRESS plist)//排序函数实现(冒泡排序){    struct list tmp = { 0 };    int i = 0;    for (i = 0; i < plist->stock - 1; i++)    {        int j = 0;        for (j = 0; j < plist->stock - 1 - i; j++)        {            if (strcmp((plist->pcon + j)->name, (plist->pcon + j + 1)->name) > 0)            {                tmp = *(plist->pcon + j);                *(plist->pcon + j) = *(plist->pcon + j + 1);                *(plist->pcon + j + 1) = tmp;            }        }    }}

说明:

动态版本与上一篇静态版本格式基本相同,仅有代码方面不同,望读者在阅读两篇文章时,切记要擦亮眼睛:)。