【练习】制作简易通讯录

  通讯录中可管理多人的联系信息,由于不能预知系统中需要管理多少联系人的信息,因此使用链表将是一种好方案。下面实现一个简易的通讯录,其包括添加联系人、查找联系人、删除联系人和显示联系人四个功能。


这里写图片描述

  • 定义通讯录结构
      在DATA结构中,必须定义一个名为key 的字符串,作为查找的关键字,其他字段可根据需要进行增删。
      仍然使用上述链表实现的头文件和函数文件。
#include <stdio.h>
typedef struct
{
    char key[15];   //关键字(设置姓名为关键字)
    char addr[20];
    char telephone[15];
    char mobile[12];
}DATA;  //数据结点类型 
  • 链式线性表
typedef struct Node
{
    DATA data;
    struct Node *next;
}ChainListType;
ChainListType *ChainListAddFirst(ChainListType *head,DATA data)
{
    ChainListType *node,*h;
    if(!(node=(ChainListType *)malloc(sizeof(ChainListType))))
    {
        printf("为保存结点数据申请内存失败!\n");
        return NULL;  //分配内存失败
    }
    node->data=data; //保存数据
    node->next=head;  //指向头指针所指结点
    head=node;        //头指针指向新增结点
    return head;
}

ChainListType *ChainListFind(ChainListType *head,char *key) //按关键字在链表中查找内容
{
    ChainListType *h;
    h=head;       //保存链表头指针
    while(h)      //若结点有效,则进行查找
    {
        if(strcmp(h->data.key,key)==0) //若结点关键字与传入关键字相同
            return h;  //返回该结点指针
        h=h->next; //处理下一结点
    }
    return NULL; //返回空指针
}

int ChainListDelete(ChainListType *head,char *key)
{
    ChainListType *node,*h;
    node=head;   //node保存删除结点的前一结点
    h=head;    //h为移动指针
    while(h)
    {
        if(strcmp(h->data.key,key)==0) //找到关键字,执行删除操作
        {
            node->next=h->next;  //使前一结点指向当前结点的下一结点
            free(h);  //释放内存
            return 1;
        }else{
            node=h;  //指向当前结点
            h=h->next; //指向下一结点
        }
     }
     return 0;//未删除
}
  • 显示联系人信息
void ChainListAll(ChainListType *head) //遍历链表 
{
    ChainListType *h;
    DATA data;
    h=head;
    printf("链表所有数据如下:\n"); 
    while(h) //循环处理链表每个结点 
    {
        data=h->data;//获取结点数据 
        printf("姓名:%s\n",data.key);
        printf("地址:%s\n",data.addr);
        printf("电话:%s\n",data.telephone);
        printf("手机:%s\n",data.mobile);
        h=h->next;//处理下一结点 
    }
    return;
}
  • 添加联系人
ChainListType *input(ChainListType *head) //向通讯录中输入的信息
{
    DATA data;
    printf("请输入联系人信息\n");
    printf("姓名:");
    scanf("%s",data.key);
    printf("地址:");
    scanf("%s",data.addr);
    printf("电话:");
    scanf("%s",data.telephone);
    printf("手机:");
    scanf("%s",data.mobile);
    return ChainListAddFirst(head,data); //调用添加函数 
}
  • 查找联系人
void find(ChainListType *head)
{
    ChainListType *h;
    DATA data;
    char name[15];
    printf("请输入查找姓名:");
    scanf("%s",name);
    h=ChainListFind(head,name);
    if(h)//查找结点指针有效
    { 
        data=h->data;//获取结点数据 
        printf("姓名:%s\n",data.key);
        printf("地址:%s\n",data.addr);
        printf("电话:%s\n",data.telephone);
        printf("手机:%s\n",data.mobile);    
    }
}
  • 删除联系人
void delete(ChainListType *head)
{
    ChainListType *h=head;
    char name[15];
    printf("请输入要删除的姓名:");
    scanf("%s",name);
    ChainListDelete(head,name); 
}
  • 主函数
int main()
{
    ChainListType *node, *head=NULL;
    int select;//选择菜单的序号 
    do{
        printf("\n_____________________\n");
        printf("1.添加联系人\n");
        printf("2.查找联系人\n");
        printf("3.删除联系人\n"); 
        printf("4.显示所有联系人\n"); 
        printf("0.退出\n");
        printf("_____________________\n");
        select=getch();
        switch(select) 
        {
            case '1':
                printf("\n添加联系人\n"); 
                head=input(head);
                break;
            case '2':
                 printf("\n查找联系人\n"); 
                 find(head);
                 break;
           case '3':
                printf("\n删除联系人\n"); 
                delete(head);
                break;
           case '4':
                printf("\n显示联系人\n"); 
                ChainListAll(head);
                break;
           case '0':
                return 0;
        }
    }while(select != '0');
}
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值