用C语言实现一个通讯录的基本功能(无文件操作版)

64 篇文章 2 订阅
4 篇文章 0 订阅

通讯录结构体

// 通讯录个人信息    
typedef struct infor{    
  char name[256];    
  char num[256];    
}infor;    
// 通讯录信息    
typedef struct {    
  // 通讯录人数    
  infor mem[50];    
  // 通讯录索引    
  int mem_index;    
}member;    

菜单

// 菜单                                                                                                                                 
int Menu();
// 初始化通讯录
void Init(member* m);
// 添加联系人
void Insert(member* m);
// 删除联系人
void Delete(member* m);
// 显示联系人
void Display(member* m);
// 查找联系人
void Find(member* m);
// 修改联系人
void Modify(member* m);
// 清空联系人
void Clear(member* m);
// 给联系人按姓名排序
void Swap(infor* m1, infor* m2);
void Sort(member* m);

菜单

int Menu() {
  int choice;
  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请输入选项\n");
  scanf("%d", &choice);
  return choice;
}

初始化联系人

void Init(member* m) {
  if (m == NULL) {
    return;
  }
  m->mem_index = 0;
}

添加联系人

void Insert(member* m) {
  if (m == NULL) {
    return;
  }
  printf("请输入新的联系人的姓名:");
  infor* p = &m->mem[m->mem_index];
  scanf("%s", p->name);
  printf("请输入新的联系人的电话:");
  scanf("%s", p->num);
  ++m->mem_index;
  printf("添加成功\n");
}

删除联系人

void Delete(member* m) {
  int serial_number;
  if (m == NULL) {
    return;
  }
  printf("请输入你要删除的联系人的序号:");
  scanf("%d", &serial_number);
  if (serial_number < 0 || serial_number >= m->mem_index) {
    printf("所输序号有误!\n");
    return;
  }
  if (serial_number == m->mem_index - 1) {
    --m->mem_index;
    printf("删除联系人成功\n");
    return;
  }
  // 将所删除的联系人编号与最后一个联系人编号交换
  m->mem[serial_number] = m->mem[m->mem_index - 1];
  --m->mem_index;                                                                                                                       
  printf("删除联系人成功!\n");
}

显示联系人

void Display(member* m) {
  int i;
  if (m == NULL) {
    return;
  }
  for (i = 0; i < m->mem_index; ++i) {
    printf("%d.姓名: %s\t电话:%s\n", i, m->mem[i].name, m->mem[i].num);
  }
}

查找联系人

void Find(member* m) {
  int index;
  if (m == NULL) {
    return;
  }
  printf("请输入你要查找的联系人的序号:");
  scanf("%d", &index);
  if (index < 0 || index > m->mem_index - 1) {
    printf("输入序号有误\n");
    return;
  }
  printf("%d.姓名:%s\t电话:%s\n", index, m->mem[index].name, m->mem[index].num);
  printf("查找成功!\n");
}

修改联系人

 void Modify(member* m) {
  int index;
  int type; 
  if (m == NULL) {
    return;
  }
  printf("请输入你要修改的联系人的序号:");
  scanf("%d", &index);
  if (index < 0 || index > m->mem_index - 1) {
    printf("输入有误!\n");
    return;
  }
  infor* p = &m->mem[index];
  printf("1. 姓名\n");
  printf("2. 电话\n");
  printf("请输入你要修改的类型:");
  scanf("%d", &type);
  if (type < 1 || type > 2) {
    printf("输入有误!\n");
    return;
  }
  if (type == 1) {
    char new_name[256] = {0};
    printf("请输入联系人的姓名:");
    scanf("%s", new_name); 
    strcpy(p->name, new_name);
  } else {
    char new_num[256] = {0};                                                                                                            
    printf("请输入联系人的电话:");
    scanf("%s", new_num);
    strcpy(p->num, new_num);
  }
  printf("修改成功\n");
}

清空联系人

void Clear(member* m) {
  if (m == NULL) {
    return;
  }
  m->mem_index = 0;
  printf("通讯录已经清空!\n");
}

对联系人进行排序

void Swap(infor* m1, infor* m2) {
  char name_tmp[256] = {0};
  char num_tmp[256] = {0};
  strcpy(name_tmp, m1->name);
  strcpy(m1->name, m2->name);
  strcpy(m2->name, name_tmp);
  strcpy(num_tmp, m1->num);
  strcpy(m1->num, m2->num);
  strcpy(m2->num, num_tmp);
}
void Sort(member* m){{
  int i;
  int j;
  if (m == NULL) {
    return;
  }
  for (i = 0; i < m->mem_index - 1; ++i) {
    for (j = 0; j < m->mem_index - 1 - i; ++j) {
      if (strcmp(m->mem[j].name, m->mem[j + 1].name) > 0) {
        Swap(&m->mem[j], &m->mem[j + 1]);
      }
    }
  }
  printf("排序成功\n");                                                                                                                 
}

测试(主函数)

int main() {
  member m;                                                                                                                             
  Init(&m);
  // 通过表驱动的形式来减少代码的圈复杂度
  typedef void (*T) (member* m);
  T menu[] =  {
    Insert,
    Delete,
    Display,
    Find,
    Modify,
    Clear,
    Sort
  };
  int choice = Menu();
  while (1) {
    if (choice == 0) {
      printf("Goodbye!\n");
      break;
    }
    menu[choice - 1](&m);
    printf("\n请输入接下来的操作选项\n");
    scanf("%d", &choice);
  }
  return 0;
}

效果图

在这里插入图片描述

有文件版

https://blog.csdn.net/qq_42957923/article/details/88372551

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值