数据结构小小小项目:简易通讯录

项目描述:


编写简易通讯录,要求使用“链表”这种存储结构,并附带相关操作。

需要功能:

1、使用链表存储联系人的相关信息,包括姓名、性别、电话号码、注释等,链表形式不限(推荐使用单链表,推荐事先准备一些数据)

2、有输出通讯录全部信息的功能

3、有清空通讯录的功能

4、有用户交互界面

5、有插入新联系人信息的功能

6、有查找联系人的功能,包括“按姓名查找”和“按电话号查找”两种

7、有删除联系人的功能,包括“按姓名删除”和“按电话号删除”两种

8、有按性别筛选联系人信息的功能

具体功能请参考示例程序

评分标准:

60+:独立完成,代码运行无错误,具备功能1~3

70+:独立完成,代码运行无错误,具备功能1~4

80+:独立完成,代码运行无错误,具备功能1~7,程序能针对非法输入报错

90+:独立完成,代码运行无错误,具备全部功能,程序能针对非法输入报错,代码书写规范,可读性强,程序与用户的交互性好

自己写的代码:::

/*************************************************************************
> 文件名称: phnum.c
> 为了梦想 
> 好好学习 
> 创建时间: 2018年07月26日 星期三 9时53分31秒
************************************************************************/

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>

#define OK 1
#define ERR 0

/**************结构体声明******************/
typedef struct phnum
{
    char name[16];
    char sex;
    char num[16];
    char remark[32];
    struct phnum *next;
}LinkList;

/**************创建头节点******************/
LinkList *HeadPoint()
{
    LinkList *ll = NULL;
    ll = (LinkList *)malloc(sizeof(LinkList));
    if(NULL == ll)
    {
        printf("The HeadPoint Create Was Error\n");
        return ERR;
    }
    else
    {
        ll->next = NULL;
        return ll;
    }
}

/**************添加联系人******************/
int AddPoint(LinkList *ll,char *name,char sex, char *num,char *remark,int *sum)
{
    LinkList *nd = NULL;
    if(NULL == ll)
    {
        printf("AddPoint's HeadPoint Create Was Error\n");
        return ERR;
    }
    nd = (LinkList *)malloc(sizeof(LinkList));
    if(NULL == nd)
    {
        printf("This Point Create is Error\n");
        return ERR;
    }
    nd->next = ll->next;
    ll->next = nd;
    strcpy(nd->name,name);
    nd->sex = sex;
    strcpy(nd->num,num);
    strcpy(nd->remark,remark);
    *sum++;
    return OK;
}

/**************遍历联系人******************/
int PrinLink(LinkList *ll)
{
    int i = 1;
    LinkList *run = NULL;
    run = ll;
    if(NULL == ll)
    {
        printf("PrinLink's HeadPoint Create Was Error\n");
        return ERR;
    }
    if(NULL == ll->next)
    {
        printf(" This LinkList is Empty\n");
        return ERR;
    }
    while(run->next)
    {
        run = run->next;
        printf("/*******第%d位联系人*******/\n",i);
        printf("姓名:%s\n",run->name);
        if(run->sex == 'm')
        {
            printf("性别:男\n");
        }
        else if(run->sex == 'f')
        {
            printf("性别:女\n");
        }
        else
        printf("性别:未知\n");
        printf("手机号:%s\n",run->num);
        printf("备注:%s\n",run->remark);
        i++;
    }
    return OK;
}

/**************匹配姓名******************/
int FindName(LinkList *ll,char *name)
{
    LinkList *run = NULL;
    int t = 0;
    if(NULL == ll)
    {
        printf("FindName's Head Point Was Error\n");
        return ERR;
    }
    run = ll;
    while(run->next)
    {
        run = run->next;
        t++;
        if(!strcmp(run->name,name))
        {
            return t;
        }
    }
    if(!run->next)
    {
        printf("没有该联系人\n");
        return ERR;
    }
}

/**************匹配手机号******************/
int FindNum(LinkList *ll,char *num)
{
    LinkList *run = NULL;
    int t = 0;
    if(NULL == ll)
    {
        printf("FindNum's Head Point Was Error\n");
        return ERR;
    }
    run = ll;
    while(run->next)
    {
        run = run->next;
        t++;
        if(!strcmp(run->num,num))
        {
            return t;
        }
    }
    if(!run->next)
    {
        printf("没有该联系人\n");
        return ERR;
    }
}

/**************打印节点信息******************/
int PrintPoint(LinkList *ll,int t)
{
    LinkList *run = NULL;
    int i = 1;
    //int i = 0;    //或者
    run = ll;
    while(run && i<t)
    //while(run && i<t-1)   //或者
    {
        run = run->next;
        i++;
    }
    run = run->next;
    printf("/*******第%d位联系人*******/\n",i);
    printf("姓名:%s\n",run->name);
    if(run->sex == 'm')
    {
        printf("性别:男\n");
    }
    else if(run->sex == 'f')
    {
        printf("性别:女\n");
    }
    else
    printf("性别:未知\n");
    printf("手机号:%s\n",run->num);
    printf("备注:%s\n",run->remark);
    return OK;
}

/**************删除联系人******************/
int DeletePoint(LinkList *ll,int t,int *sum)
{
    LinkList *run = NULL;
    LinkList *p = NULL;
    char count;
    int i = 1;
    //int i = 0;    //或者
    if(NULL == ll)
    {
        printf("The HeadPoint Create Was Error\n");
        return ERR;
    }
    run = ll;
    if(NULL == ll->next)
    {
        printf("This LinkList is Empty\n");
        return ERR;
    }
    while(run && i<t)
    //while(run && i<t-1)   //或者
    {
        run = run->next;
        i++;
    }
    if(!run->next)
    {
        printf("Delete This Point Wasn't found\n");
        return ERR;
    }
    p = run->next;
    run->next = p->next;
    printf("/*******第%d位联系人*******/\n",t);
    printf("姓名:%s\n",p->name);
    if(p->sex == 'm')
    {
        printf("性别:男\n");
    }
    else if(p->sex == 'f')
    {
        printf("性别:女\n");
    }
    else
    printf("性别:未知\n");
    printf("手机号:%s\n",p->num);
    printf("备注:%s\n",p->remark);
    free(p);
    p = NULL;
    *sum--;
    return OK;
}

/**************清空联系人******************/
int CleanLink(LinkList *ll,int *sum)
{
    LinkList *run = NULL;
    LinkList *p = NULL;
    if(NULL == ll)
    {
        printf("The CleanLink's Head Was Error\n");
        return ERR;
    }
    if(NULL == ll->next)
    {
        printf("这是一个空表\n");
        return OK;
    }
    run = ll->next;
    while(run->next)
    {
        p = run;
        run = run->next;
        free(p);
        *sum--;
        p = NULL;
    }
    if(!run->next)
    {
        ll->next = NULL;
        return OK;
    }
    return ERR;
}

/**************遍历男性联系人******************/
int PrinMs(LinkList *ll)
{
    int i = 1;
    LinkList *run = NULL;
    run = ll;
    if(NULL == ll)
    {
        printf("PrinLink's HeadPoint Create Was Error\n");
        return ERR;
    }
    if(NULL == ll->next)
    {
        printf(" This LinkList is Empty\n");
        return ERR;
    }
    while(run->next)
    {
        run = run->next;
        if(run->sex == 'm')
        {
            printf("/*******第%d位男性联系人*******/\n",i);
            printf("姓名:%s\n",run->name);
            printf("性别:男\n");
            printf("手机号:%s\n",run->num);
            printf("备注:%s\n",run->remark);
            i++; 
        }
    }
    if(1 == i)
    {
        printf("无男性联系人\n");
        return OK;
    }
    return OK;
}

/**************遍历女性联系人******************/
int PrinFs(LinkList *ll)
{
    int i = 1;
    LinkList *run = NULL;
    run = ll;
    if(NULL == ll)
    {
        printf("PrinLink's HeadPoint Create Was Error\n");
        return ERR;
    }
    if(NULL == ll->next)
    {
        printf(" This LinkList is Empty\n");
        return ERR;
    }
    while(run->next)
    {
        run = run->next;
        if(run->sex == 'f')
        {
            printf("/*******第%d位女性联系人*******/\n",i);
            printf("姓名:%s\n",run->name);
            printf("性别:女\n");
            printf("手机号:%s\n",run->num);
            printf("备注:%s\n",run->remark);
            i++; 
        }
    }
    if(1 == i)
    {
        printf("无男性联系人\n");
        return OK;
    }
    return OK;
}

int main()
{
    /**************数据定义******************/
    LinkList *ll = NULL;
    int sum = 0;        //联系人总数
    int sign;           //操作是否成功的标志位
    char name[16];      //联系人的姓名
    char sex;           //性别
    char num[16];       //手机号
    char remark[32];    //备注
    int dt;             //要删除的位置
    int act1;            //操作命令 
    int act2;
    int act3;

    /**************数据操作******************/
    //初始化
    ll = HeadPoint();
    AddPoint(ll,"Jiang",'m',"123456789","shuai",&sum);
    AddPoint(ll,"Yang",'f',"98765432100","mei",&sum);
    AddPoint(ll,"Liu",'f',"123456654321","hao",&sum);
    AddPoint(ll,"Zhang",'x',"12345123450","huai",&sum);
    //更新数据
    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("0:退出\n");
        printf("*****************************/\n");
        printf("请输入命令:");
        while(1)
        {
            scanf("%d",&act1);
            if(act1<0 || act1>7)
            {
                printf("无效指令,请重新输入:");
                continue;
            }
            else
            break;
        }
        printf("\n");
        switch(act1)
        {
            //功能1
            case 1:
            PrinLink(ll);
            break;
            //功能2
            case 2:
            printf("请输入联系人姓名:");
            scanf("%s",name);
            printf("请输入联系人性别m(男)/f(女):");
            setbuf(stdin,NULL);
            while(1)
            {
                scanf("%c",&sex);
                if(sex =='m' || sex == 'f')
                break;
                else
                {
                    printf("输入错误,请重新输入:");
                    continue;
                }
            }
            printf("请输入联系人手机号:");
            scanf("%s",num);
            printf("请输入联系人备注:");
            scanf("%s",remark);
            AddPoint(ll,name,sex,num,remark,&sum);
            break;
            //功能3
            case 3:
            printf("1:按姓名删除\n");
            printf("2:按手机号删除\n");
            printf("请输入命令:");
            scanf("%d",&act2);
            switch(act2)
            {
                case 1:
                printf("请输入联系人姓名:");
                scanf("%s",name);
                dt = FindName(ll,name);
                if(dt == 0)
                break;
                DeletePoint(ll,dt,&sum);
                break;
                case 2:
                printf("请输入联系人手机号:");
                scanf("%s",num);
                dt = FindNum(ll,num);
                if(dt == 0)
                break;
                DeletePoint(ll,dt,&sum);
                break;
            }
            break;
            //功能4
            case 4:
            printf("1:按姓名查询\n");
            printf("2:按手机号查询\n");
            printf("请输入命令:");
            scanf("%d",&act3);
            switch(act3)
            {
                case 1:
                printf("请输入联系人姓名:");
                scanf("%s",name);
                dt = FindName(ll,name);
                if(dt == 0)
                break;
                PrintPoint(ll,dt);
                break;
                case 2:
                printf("请输入联系人手机号:");
                scanf("%s",num);
                dt = FindNum(ll,num);
                if(dt == 0)
                break;
                PrintPoint(ll,dt);
                break;
            }
            break;
            //功能5
            case 5:
                PrinMs(ll);
                break;
            //功能6
            case 6:
                PrinFs(ll);
                break;
            //功能7
            case 7:
                sign = CleanLink(ll,&sum);
                if(1 == sign)
                printf("清空完毕!\n");
                else
                printf("清空失败!\n");
                break;
            //退出
            case 0:
                break;
        }
        if(0 == act1)
        {
            printf("欢迎下次使用!\n");
            break;
        }
        else
        continue;
    }
    printf("\n");
    return 0;
}

数据结构小项目:简易通讯录

猜你喜欢

转载自blog.csdn.net/nan_lei/article/details/81435385