2 qq 32794157 qq_32794157 于 2016.01.24 23:53 提问

我要写一个通讯录的程序,要有分组的功能,怎么实现比较好。

如题,用户可以自由添加或删除分组,一个人可以属于多个不同组图片说明

5个回答

lyhoo163
lyhoo163   Rxr 2016.01.25 07:56
已采纳

要使用两个表:
表一、字段:排序,分组,姓名,性别,办公电话,移动电话,住宅电话,单位名称,职务.....,ID
表二、分组,各称,备注,ID

这样通过表二的分组,可以查找对应 表一的分组的信息。

编程,用什么语言均可,如果U盘可以使用的话,建议数据库使用ACCESS。

caozhy
caozhy   Ds   Rxr 2016.01.25 05:10
 #include <stdio.h>
#include <malloc.h>  //得到指向大小为Size的内存区域的首字节的指针//
#include <string.h>
#include <stdlib.h>  //标准库函数// 
#define NULL 0
#define LEN sizeof(struct address_list)  //计算字节//
int n;
struct address_list
{
    char name[30];     //名字
    char work[30];     //职业
    char handset[30];  //手机
    char email[30];    //电子邮件
    char address[30];  //通讯地址
    struct address_list *next;
};
struct address_list *shifang(struct address_list *head); // 释放内存函数声明
//创建函数,不带头结点的链表
struct address_list *creat(void)       
{
    struct address_list *head,*p1,*p2;
    char name[20];
    n=0;
    p1=(struct address_list *)malloc(LEN);
    p2=p1;   //强制内存转换
    printf("请输入通讯录的内容!\n姓名输入为0时表示创建完毕!\n");
    printf("请输入姓名:");
    gets(name);
    if(strcmp(name,"0")!=0)
    {
        strcpy(p1->name,name);
        printf("请输入职业:");     gets(p1->work);
        printf("请输入手机:");     gets(p1->handset);
        printf("请输入电子邮件:"); gets(p1->email);
        printf("请输入通讯地址:");  gets(p1->address);
        head=NULL;
        while(1)
        {
            n=n+1;   //记录通讯录人数个数
            if(n==1)
                head=p1;
            else
                p2->next=p1;
            p2=p1;
            printf("请输入姓名:");
            gets(name);
            if(strcmp(name,"0")==0)
            {
                break;
            }
            else
            {
                p1=(struct address_list *)malloc(LEN);
                strcpy(p1->name,name);
                printf("请输入职业:"); gets(p1->work);
                printf("请输入手机:"); gets(p1->handset);
                printf("请输入电子邮件:"); gets(p1->email);
                printf("请输入通讯地址:");  gets(p1->address);
            }
        }
        p2->next=NULL;
        return head;
    }
    else
        return 0;
}
//输出函数
void print(struct address_list *head)   
{
    struct address_list *p;
    if(head!=NULL)
    {
        p=head;
        printf("本通讯录现在共有%d人:\n",n);
        printf("---姓名-------职业--------手机-------Email-------通讯地址\n");
        printf("==================================\n");
        do
        {
            printf("== %s",p->name); printf("       ");
            printf("%s",p->work); printf("       ");
            printf("%s",p->handset); printf("       ");
            printf("%s",p->email); printf("       ");
            printf("%s",p->address); printf("       \n");
            p=p->next;
        }while(p!=NULL);
        printf("==================================\n");
    }
    else
        printf("通讯录为空,无法输出!\n");
}
//增加函数
struct address_list *insert(struct address_list *head) 
{
    struct address_list *p0,*p1,*p2;
    char name[20];
    p1=head;
    printf("请输入增加的内容:\n");
    printf("请输入姓名:"); gets(name);
    if(strcmp(name,"0")==0)
    {
        printf("姓名不能为0,增加失败!\n");
        return(head);
    }
    else
    {
        p0=(struct address_list *)malloc(LEN);
        strcpy(p0->name,name);
        printf("请输入职业:"); gets(p0->work);
        printf("请输入手机:"); gets(p0->handset);
        printf("请输入电子邮件:"); gets(p0->email);
        printf("请输入通讯地址:");  gets(p0->address);
        n=n+1;
        if(head==NULL)
        {
            head=p0;
            p0->next=NULL;
            return head;
        }
        else
        {
            while(strcmp(p0->name,p1->name)>0&&(p1->next!=NULL))
            {
                p2=p1;
                p1=p1->next;
            }
            if(strcmp(p0->name,p1->name)<0 || strcmp(p0->name,p1->name)==0)
            {
                if(head==p1)
                {
                    head=p0;
                }
                else
                {
                    p2->next=p0;
                }
                p0->next=p1;
            }
            else
            {
                p1->next=p0;
                p0->next=NULL;
            }
            return head;
        }
    }
}
struct address_list* delete_txl(struct address_list *head)
{
    struct address_list *p,*q;
    char name[30];
    if(head==NULL)
    {
        printf("通讯录为空,无法显示!\n");
        return head;
    }
    p=head;
    printf("请输入需要删除的人的姓名:");
    gets(name);
    if(strcmp(head->name,name)==0)
    {
        head=head->next;
        free(p);
        printf("删除操作成功!\n");
        return head;
    }
    else
    {
        q=head,p=head->next;
        while(p!=NULL)
        {
            if(strcmp(p->name,name)==0)
            {
                q->next=p->next;
                free(p);
                printf("删除操作成功!\n");
                return head;
            }
            p=p->next;
            q=q->next;
        }
    }
}
//显示函数
struct address_list *display(struct address_list *head)
{
    struct address_list *p1,*p2;
    char name[30];
    int m;
    if(head==NULL)
    {
        printf("通讯录为空,无法显示!\n");
        return head;
    }
    p1=head;
    m=0;
    printf("请输入需要显示人的姓名:");
    gets(name);
    while(p1!=NULL)
    {
        while((strcmp(p1->name,name))!=0 && p1->next!=NULL)
        {
            p2=p1;
            p1=p1->next;
        }
        if(strcmp(p1->name,name)==0)
        {
            m++;
            printf("%s的通讯内容如下:\n",name);
            printf("---姓名--------职业--------手机-------Email------通讯地址\n");
            printf("==================================\n");
            printf("== %s",p1->name);printf("       ");
            printf("%s",p1->work);printf("       ");
            printf("%s",p1->handset);printf("       ");
            printf("%s",p1->email);printf("       ");
            printf("%s",p1->address); printf("       \n");
            printf("==================================\n");
        }
        p1=p1->next;
    }
    if(m==0)
    {
        printf("此人未在本通讯录中!\n");
    }
    return(head);
}

//排序函数
struct address_list *paixu(struct address_list *head)
{
    struct address_list *p1,*p2;
    int i,j;
    struct address_list1
    {
        char name[30];
        char work[30];
        char handset[30];
        char email[30];
        char address[30];
    };
    struct address_list1 px[200];
    struct address_list1 temp;
    if(head==NULL)
    {
        printf("通讯录为空,无法排序!\n");
        return(head);
    }
    p1=head;
    for(i=0;i<n,p1!=NULL;i++)
    {
        strcpy(px[i].name,p1->name);
        strcpy(px[i].work,p1->work);
        strcpy(px[i].handset,p1->handset);
        strcpy(px[i].email,p1->email);
        strcpy(px[i].address,p1->address);
        p2=p1;
        p1=p1->next;
    }
    head=shifang(head);
    for(j=0;j<n-1;j++)
    {
        for(i=j+1;i<n;i++)
        {
            if(strcmp(px[i].name,px[j].name)<0)
            {
                temp=px[i];
                px[i]=px[j];
                px[j]=temp;
            }
        }
    }
    p1=(struct address_list *)malloc(LEN);
    p2=p1;
    strcpy(p1->name,px[0].name);
    strcpy(p1->work,px[0].work);
    strcpy(p1->handset,px[0].handset);
    strcpy(p1->email,px[0].email);
    strcpy(p1->address,px[0].address);

    head=p1;
    for(i=1;i<n;i++)
    {
        p1=(struct address_list *)malloc(LEN);
        strcpy(p1->name,px[i].name);
        strcpy(p1->work,px[i].work);
        strcpy(p1->handset,px[i].handset);
        strcpy(p1->email,px[i].email);
        strcpy(p1->address,px[i].address);
        p2->next=p1;
        p2=p1;
    }
    p2->next=NULL;
    printf("按姓名排序后为:\n");
    print(head);
    return(head);
}
//姓名查找函数
struct address_list *search(struct address_list *head)
{
    struct address_list *p1,*p2;
    int m;
    char name[30];
    if(head==NULL)
    {
        printf("通讯录为空,无法分类查找!\n");
        return(head);
    }
    p1=head;
    printf("********************\n");
    printf("**  请输入需要查找的姓名  **\n");
    printf("********************\n");
    m=0;
    gets(name);
    while(p1!=NULL)
    {
        while(strcmp(p1->name,name)!=0&&p1->next!=NULL)
        {
            p2=p1;
            p1=p1->next;
        }
        if(strcmp(p1->name,name)==0)
        {
            m++;
            printf("你查找的内容是:\n");
            printf("+++++++++++++++++++++++++++++++++++\n");
            printf("++ %s        %s       %s       %s        %s\n",p1->name,p1->work,p1->handset,p1->email,p1->address);
            printf("+++++++++++++++++++++++++++++++++++\n");
        }
        p1=p1->next;

        if(m==0)
        {
            printf("此人未在本通讯录中!\n");
        }
        break;
    }

    return(head);
}

//释放内存函数
struct address_list *shifang(struct address_list *head)
{
    struct address_list *p1;
    while(head!=NULL)
    {
        p1=head;
        head=head->next;
        free(p1);
    }
    return(head);
}

//文件写入函数
void save(struct address_list *head)
{
    FILE *fp;
    struct address_list *p1;
    char tong[30];
    if(head==NULL)
    {
        printf("通讯录为空,无法存储!\n");
        return;
    }
    printf("请输入保存后的文件名:");
    gets(tong);
    fp=fopen("(tong).txt","w");
    if(fp==NULL)
    {
        printf("cannot open file\n");
        return;
    }
    p1=head;
    fprintf(fp,"姓名    职业      手机     Email     通讯地址\n");
    for(;p1!=NULL;) 
    {
        fprintf(fp,"%s       %s       %s        %s       %s\n",p1->name,p1->work,p1->handset,p1->email,p1->address);
        p1=p1->next;
    }
    printf("保存完毕!\n");
    fclose(fp);
}

//文件读出函数
struct address_list *load(struct address_list *head)
{
    FILE *fp;
    char tong[30];
    struct address_list *p1,*p2;
    printf("请输入要输出的文件名:");
    gets(tong);
    fp=fopen("(tong).txt","r");
    if(fp==NULL)
    {
        printf("此通讯录名不存在,无法输出!\n");
        return(head);
    }
    else
    {
        head=shifang(head);
    }
    p1=(struct address_list *)malloc(LEN);
    fscanf(fp,"%s%s%s%s%s",&p1->name,&p1->work,&p1->handset,&p1->email,&p1->address);
    if(feof(fp)!=0)
    {
        printf("文件为空,无法打开!\n");
        return(head);
    }
    else
    {
        rewind(fp);
        p2=p1;
        head=p1;
        n=0;
        while(feof(fp)==0)
        {
            fscanf(fp,"%s%s%s%s%s",&p1->name,&p1->work,&p1->handset,&p1->email,&p1->address);
            if(feof(fp)!=0)
                break;
            p2->next=p1;
            p2=p1;
            p1=(struct address_list *)malloc(LEN);
            n=n+1;
        }
        p2->next=NULL;
        p1=head;
        head=head->next;
        n=n-1;
        free(p1);
        print(head);
        printf("打开完毕!\n");
        return(head);
    }
    fclose(fp);
}

//综合操作函数
struct address_list *menu(struct address_list *head)
{
    char num[10];
    while(1)
    {
        printf("*********************\n");
        printf("*** 1 姓名查找      ****\n");
        printf("*** 2 单个显示      ****\n");
        printf("*** 3 增加          ****\n");
        printf("*** 4 退出          ****\n");
        printf("*********************\n");
        printf("请输入您选择的操作:");
        gets(num);
        switch(*num)
        {
        case '1':
            {
                head=search(head);                          //姓名查找
                print(head);
            }
            break;
        case '2':
            {
                head=display(head);                          //显示
            }
            break;
        case '3':
            {
                head=insert(head);                           //增加
                print(head);
            }
            break;
        case '4':
            return head;
        default:
            printf("操作错误,此项不存在!\n");
            break;
        }
        if(strcmp(num,"6")==0)
            break;
    }
    return head;
}
//主函数
void main()
{
    struct address_list *head=NULL;
    char num[10];
    printf("*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*\n");
    printf("*=*               程序说明                *=*\n");
    printf("*=*    请及时保存创建完毕的通讯录内容!    *=*\n");
    printf("*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*\n");
    while(1)
    {
        printf("************************\n");
        printf("***     1 创建通讯录      ****\n");
        printf("***     2 按名字排序      ****\n");
        printf("***     3 综合操作        ****\n");
        printf("***     4 保存            ****\n");
        printf("***     5 打开            ****\n"); 
        printf("***     6 删除            ****\n");
        printf("***     7 退出            ****\n");
        printf("************************\n");
        printf("请输入您选择的操作:");
        gets(num);
        switch(*num)
        {
        case '1':
            {
                if(head==NULL)
                {
                    head=creat();                                //创建
                    print(head);
                }
                else
                {
                    head=shifang(head);
                    head=creat();                                //重新创建
                    print(head);
                }
            }
            break;
        case '2':
            {
                head=paixu(head);                               //排序
            }
            break;
        case '3':
            {
                head=menu(head);                              //综合操作
            }
            break;
        case '4':
            {
                save(head);                                   //文件保存
                print(head);
            }
            break;
        case '5':
            {
                head=load(head);                              //文件输出
            }
            break;
        case '6':
            {
                head=delete_txl(head);                           //删除
                print(head);
            }
            break;
        case '7':
            head=shifang(head);
            break;
        default:
            printf("操作错误,此项不存在!\n");
            break;
        }
        if(strcmp(num,"7")==0)
            break;
    }
}
qq_27183003
qq_27183003   Ds   Rxr 2016.01.25 00:01

可以用单向链表来实现,每一个人是一个节点,一个节点用一个结构体表示;
结构体成员可以包括姓名、手机、组属性1、组属性2。。。
实现链表功能:创建、增加、删除、查找、排序、列表显示等等。

John_ToStr
John_ToStr   Rxr 2016.01.25 17:38

如果要带界面的话,建议使用c#+sqlserver

91program
91program   Ds   Rxr 2016.01.25 08:27

先管理分组信息
以分组信息为基础,再完成人的管理

建议为分组设定一个最大值,如:有 20 个不同的分组,这样编程实现会方便很多。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
实现通讯录分组排序的一个方法
在APP开发中,我们经常会去做一个通讯录。所有做iOS开发的都知道这玩意儿应该用UITableView来做。但是,如何将数据分组排序总是一个比较麻烦的问题,这里提供我个人的解决方法供大家参考。 排序的目标 因为要是用UITableView,所以我们的数据源应该是这样一个数组:数组dataArray拥有27个子数组subArray,前26个subArray存储以A到Z开头的联系人,第27个数
通讯录管理系统 实现显示添加、删除、查询、显示分组和联系人
本人做的不很好,希望大家多多指导。 实现显示添加、删除分组和联系人,并可查找和显示联系人,并且可以通过报表打印。
通讯录的常用功能保存
1. 新增联系人 新增app联系人:(app中和系统中均有)。  先将联系人保存到系统的通讯录中。保存新添加的通讯录联系人到数据库 联系人表和电话表   LNPhone   LNContact LNNewContactController   #pragma mark - 添加联系人 - (NSString *)addAddress 新增系统
实现微信通讯录的前端动效
最近公司要是实现一个类似于微信通信录的品牌列表,于是自己动手实现了这个功能,这里主要讲的是如何通过手指滑动,来实现列表页面的滚动。 如果是通过点击给实现页面的滚动,大家基本上都能实现,甚至不用js就可完成,所以这里就不细讲了。重点将如何通过touch事件完成这个功能。首先你得了解touch事件,有touchstart,touchmove,touchend…具体怎么用大家google一下就明白了,
类似通讯录的A-Z字母分组实现
直接贴代码:package com.bsd.join.utils;import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; im
OC实现简单通讯录
1、定义联系人类AddressContact。实例变量:姓名、性别、电话号码、住址、分组名称。方法:自定义初始化方法(姓名、电话号码)、显示联系人信息     2、在main.m中定义可变数组,管理所有联系人。可以添加新联系人对象,如果姓名或电话号码为空,打印添加失败。     3、获取某个分组下的所有联系人。     4、根据电话号码搜索联系人。     5、获取所有女性
最近实现一个类似于微信通讯录的功能//
首先,这个功能是根据大写首字母来分组的,这就来了,汉字是不好分组的,只能使用拼音,那么怎么将汉字转换成拼音呢?下面就有一个方法 例如: //初始化代码     NSString * str = @"中华人民共和国万岁";    NSString * PYStr  = [self transform:str];     NSLog(@"拼音%@",PYStr);
java图形化界面实现的个人通讯录管理系统
使用java图形化界面实现个人通讯录管理系统,具有个人信息管理,通讯录心里添加,删除,修改,查询等功能。 登陆功能及管理员权限设置。
Android 使用ListView的A-Z字母排序功能实现联系人模块
在上一篇文章当中,主要学习了ListView的A-Z字母排序功能以及根据输入框的输入值改变来过滤搜索结果,如果输入框里面的值为空,更新为原来的列表,否则为过滤数据列表,包括汉字转成拼音的功能,如果你还没看过的话上一篇文章的话,可以点击:Android 仿美团网,探索ListView的A-Z字母排序功能实现选择城市。其实对联系人和城市列表等实现A-Z的排序的实现原理都差不多。我只是在上一篇文章的基础上
文档要怎么写?
题记:今天立秋了,明天永远是美好的一天 场景 最近给运维人员写了一份部署三个项目的文档,由于系统需要和其他两个系统交互,所以在配置方面复杂了些,尤其是对xml文件地址配置这块,经常出问题。当基本功能实现的时候,给运维人员去部署的时候,写文档不单单是给别人写,更多的是给自己写。写的过程中思路清晰了,一切都会变得明朗起来,有一种山穷水复疑无路,柳暗花明又一村的感觉,并且一下子把需要大脑中记忆的这些事情全部转移到了文字上,一个字,舒服~,就像清理了电脑中的垃圾空间一样。 不过当我把写好的文档实