简单通讯录

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

typedef struct NODE
{
    int id;
    int age;
    char *name;
    char *phone;
    struct NODE *pNext;

}List;
typedef struct 
{
    int count;
    int item;
    int CurrentPage;
    int PageCount;
}Page;
char *GetString();
List *GetNode();
List *GetNodeIn(char *name,int age, char *phone);
int GetID();
void FAdd(List **,List **,List *);
void FDelete(int ,List **,List **);
void FInert(int ,List **,List **,List *);
void FClear(List **,List **);
void FUpdate(int ,List *);
void FPrint(List *);
typedef struct LINK
{
    List *top;
    List *end;
    void (*fp_Add)(List **,List **,List *);
    void (*fp_Delete)(int,List **,List **);
    void (*fp_Clear)(List **,List **);
    void (*fp_Insert)(int ,List **,List **,List *);
    void (*fp_Update)(int ,List *);
}Link;
Link ListUtil={NULL,NULL,FAdd,FDelete,FClear,FInert,FUpdate};

char GetKey();
void Finit();
void PrintMenu(Page );
Page *Tongji(List *);
void FenYe(Page *,List *);
void ShowIn(int begin,int end,List *top);

void HomePage();

void ShowAllContacts(List *top);
void FQuery();
void Delete();
void Update();

//m.h

#include"m.h"
char g_menu_type='1';
char g_key=-1;
int main()
{
 /*   Page *page=NULL;*/
    srand(time(0));
    Finit();
    while (1)
    {
        HomePage();
        switch (GetKey())
        {
        case '1':
            g_menu_type='1';
            ShowAllContacts(ListUtil.top);
            break;
        case '2':
            g_menu_type='2';
            ListUtil.fp_Add(&ListUtil.top,&ListUtil.end,GetNode());
            break;
        case '3':
            g_menu_type='3';
            FQuery();
            break;
        case '4':
            g_menu_type='4';
            Delete();
            break;
        case '5':
            g_menu_type='5';
             Update();
            break;
        case 'q':
            return 0;
            break;
        default:
            printf("输入错误请重新输入!\n");
            break;
        }
    }
    return 0;
}
int GetID()
{
    static int id=1;
    return id++;
}
char *GetString()
{
    size_t size=50;
    size_t count=0;
    char *str=(char *)malloc(size);
    char *jstr=str;
    char *newStr=NULL;
    char c;
    while ((c=getchar())!='\n')
    {
        count++;
        *str++=c;
        if(count+1==size)
        {
            size+=5;
            newStr=(char *)malloc(size);
            *str=0;
            strcpy_s(newStr,size,jstr);
            free(str);
            jstr=str=newStr;
            str+=count;
        }

    }
    *str=0;
    return jstr;
}
List *GetNode()
{
    List *node=(List *)malloc(sizeof(List));
    node->id=GetID();
    printf("请输入姓名:\n");
    node->name=GetString();
    printf("请输入年龄:\n");
    node->age=atoi(GetString());
    printf("请输入手机号:\n");
    node->phone=GetString();

    node->pNext=NULL;
    return node;
}
List *GetNodeIn(char *name,int age, char *phone)
{
    List *node=(List *)malloc(sizeof(List));
    node->id=GetID();
    node->name=name;
    node->age=age;
    node->phone=phone;
    node->pNext=NULL;
    return node;
}

void FAdd(List **pptop,List **ppend,List *node)
{
    if(*pptop==NULL)
    {
        *pptop=node;
    }
    else
    {
        (*ppend)->pNext=node;
    }
    *ppend=node;
}

void FDelete(int bh,List **pptop,List **ppend)
{
    List *top=*pptop;
    List *del=NULL;
    if(top->id==bh)
    {
        del=top;
        *pptop=top->pNext;
        free(del);
        return ;
    }
    while (top->pNext!=NULL)
    {
        if(top->pNext->id==bh)
        {
            del=top->pNext;
            top->pNext=top->pNext->pNext;
            free(del);
            if(top->pNext==NULL)
            {
                *ppend=top;
            }
            return ;
        }
        top=top->pNext;
    }

}
void FInert(int bh,List **pptop,List **ppend,List *node)
{
    List *top=*pptop;
    if(top->id >=bh)
    {
        node->pNext=top;
        *pptop=node;
        return ;
    }
    while(top->pNext!=NULL)
    {
        if(top->pNext->id >=bh)
        {
            node->pNext=top->pNext;
            top->pNext=node;
            return ;
        }
        top=top->pNext;
    }
    FAdd(pptop,ppend,node);

}
void FClear(List **pptop,List **ppend)
{
    List *del=NULL;
    List *top=*pptop;
    *pptop=NULL;
    *ppend=NULL;
    while (top!=NULL)
    {
        del=top;
        top=top->pNext;
        free(del);
    }
}
void FUpdate(int bh,List *top)
{
    char *name=NULL;
    char *phone=NULL;
    char *age=NULL;
    if(top!=NULL)
    {
        while (top!=NULL)
        {
            if(bh==top->id)
            {
                printf("输入你要修改的姓名:");
                name=GetString();
                if(name!=NULL&&*name!=0)
                {
                    top->name=name;
                }
                printf("输入你要修改的年龄:");
                age=GetString();
                if(age!=NULL&&*age!=0)
                {
                    top->age=atoi(age);
                }
                printf("输入你要修改的电话:");
                phone=GetString();
                if(phone!=NULL&&*phone!=0)
                {
                    top->phone=phone;
                }
                return ;
            }
            top=top->pNext;
        }
    }
}
char GetKey()
{
    char *str=NULL;
    char c;
    while (str==NULL||*str==0)
    {
        str=GetString();
    }
    c=*str;
    free(str);
    return c;
}
void Finit()
{
    int i,j;
    char *name=NULL;
    char *phone=NULL;
    char *jname;
    int age;
    for(i=0;i<151;i++)
    {
        name=(char *)malloc(6);
        phone=(char *)malloc(12);
        jname=name;
        for(j=0;j<5;j++)
        {
            *name++=rand()%25+97;
        }
        *name=0;
        _itoa_s(rand()%999999999+10000000000,phone,12,10);
        age=rand()%99;
        ListUtil.fp_Add(&ListUtil.top,&ListUtil.end,GetNodeIn(jname,age,phone));
    }
}
Page *Tongji(List *top)
{
    Page *page=(Page *)malloc(sizeof(Page));
    page->count=0;
    page->CurrentPage=0;
    page->PageCount=0;
    page->item=10;
    while (top!=NULL)
    {
        page->count++;
        top=top->pNext;
    }
    page->PageCount=page->count%page->item==0 ? page->count/page->item :page->count/page->item+1;
    return page;
}
void FenYe(Page *page,List *top)
{
    char key ='n';
    int begin=0;
    int end=0;
    while(key=='n'||key=='w')
    {
        if(key=='n')
        {
            if(page->CurrentPage==page->PageCount)
            {
                printf("亲,这已经是最后一页了");
            }
            else
            {
                page->CurrentPage++;
                begin=(page->CurrentPage-1)*page->item+1;
                end=page->CurrentPage*page->item;
                ShowIn(begin,end,top);
            }
        }
        if(key=='w')
        {
            if(page->CurrentPage==1)
            {
                printf("亲,这已经是第一页了");
            }
            else
            {
                page->CurrentPage--;
                begin=(page->CurrentPage-1)*page->item+1;
                end=page->CurrentPage*page->item;
                ShowIn(begin,end,top);
            }
        }
        PrintMenu(*page);
        g_key=key=GetKey();
    }
}
void PrintMenu(Page page)
{
    switch (g_menu_type)
    {
        case '3':
            printf("当前第(%d)页 (w)上一页  (n)下一页 (b)返回菜单 (c)重新查询 共(%d)页 共(%d)条\n",page.CurrentPage,page.PageCount,page.count);
            break;
        case '4':
                printf("当前第(%d)页 (w)上一页  (n)下一页 (b)返回菜单(d)删除 共(%d)页 共(%d)条\n",page.CurrentPage,page.PageCount,page.count);
            break;
        case '5':
            printf("当前第(%d)页 (w)上一页  (n)下一页 (b)返回菜单(u)修改 共(%d)页 共(%d)条\n",page.CurrentPage,page.PageCount,page.count);
            break;
        default:
            printf("当前第(%d)页 (w)上一页  (n)下一页 (b)退出  共(%d)页 共(%d)条\n",page.CurrentPage,page.PageCount,page.count);
            break;      
    }
}
void ShowIn(int begin,int end,List *top)
{
    int count =0;
    printf("id      name        age      phone     \n");
    while(top!=NULL&&count<=end)
    {
        count++;
        if(count>=begin&&count<=end)
        {
            printf("%d      %s        %d      %s     \n",top->id,top->name,top->age,top->phone);
        }
        top=top->pNext;
    }
}
void ShowAllContacts(List *top)
{
    Page *page=NULL;
    page=Tongji(top);
    FenYe(page,top);
}
void FQuery()
{
    List *ptop=NULL;
    List *pend=NULL;
    List *node=NULL;
    List *top=NULL;
    char *word=NULL;
    while (1)
    {
        top=ListUtil.top;//重新查询时,从头开始查
        printf("输入查询关键字:\n");
        word=GetString();
        printf("a 确认查询  c 重新查询 b返回主菜单:\n");
        switch(GetKey())
        {
        case 'a':
            while (top!=NULL)
            {
                if(0==strncmp(top->name,word,strlen(word))||0==strncmp(top->phone,word,strlen(word)))
                {
                    node=(List *)malloc(sizeof(List));
                    node->id=top->id;
                    node->phone=top->phone;
                    node->name=top->name;
                    node->age=top->age;
                    node->pNext=NULL;
                    ListUtil.fp_Add(&ptop,&pend,node);
                }
                top=top->pNext;
            }
            ShowAllContacts(ptop);
            ListUtil.fp_Clear(&ptop,&pend);
            if('b'==g_key||'d'==g_key||'u'==g_key)
            {
                return ;
            }
            break;
        case 'b':
            return ;
            break;
        default:
            break;
        }
    }
}
void Delete()
{
    int bh=-1;
    while(1)
    {
        FQuery();
        if(g_key=='d')
        {
            printf("输入你要删除的编号:");
            bh=atoi(GetString());
            ListUtil.fp_Delete(bh,&ListUtil.top,&ListUtil.end);
            printf("y 继续删除 其他键返回主菜单\n");
            if('y'!=GetKey())
            {
                return ;
            }
        }   
    }
}
void Update()
{
    int bh=1;
    while(1)
    {
        FQuery();
        if(g_key=='u')
        {
            printf("输入你要修改的编号:");
            bh=atoi(GetString());
            ListUtil.fp_Update(bh,ListUtil.top);
            printf("y 继续删除 其他键返回主菜单\n");
            if('y'!=GetKey())
            {
                return ;
            }
        }   
    }
}
void HomePage()
{   
    printf("1.查看通讯录\n");
    printf("2.添加联系人\n");
    printf("3.查询联系人\n");
    printf("4.删除联系人\n");
    printf("5.修改联系人\n");
    printf("q.退出\n");
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值