抽丝剥茧C语言(高阶)静态通讯录(下)

简介: 抽丝剥茧C语言(高阶)静态通讯录

排序通讯录

排序我也按照通讯录中联系人的名字来排序,这就用到了之前的函数,qsort。

contacts.c

int estimate(const void* p1, const void* p2)
{
  return strcmp(((person*)p1)->name, ((person*)p2)->name);//比较的是联系人中姓名的大小
}
void sortcontact(contacts* pc)
{
  assert(pc != NULL);
  qsort(pc->data, pc->count, sizeof(person), estimate);//利用接收estimate函数的返回值然后排序data数组里面的元素
  printf("排序成功\n");
}

看看是否有问题:

没问题。

完整的代码

contacts.h

#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>
#define MAX 100//通讯录最大人数
//定义的结构体
typedef struct person
{
  char name[20];//名字
  int age;//年龄
  char sex[20];//性别
  char phone[20];//电话
  char location[20];//住址
}person;
typedef struct contacts
{
  person data[100];//存放人信息的位置
  int count;//记录通讯录的人数
}contacts;
//函数声明区
void initialize(contacts* pc);//初始化通讯录
void addcontact(contacts* pc);//输入联系人信息
void showcontact(const contacts* pc);//打印通讯录
int delcontact(contacts* pc);//删除联系人
int modifycontact(contacts* pc);//修改联系人信息
int findcontact(contacts* pc);//查找联系人
void sortcontact(contacts* pc);//排序通讯录

contacts.c

#include "contacts.h"
int find_out(char* p1, contacts* p2)
{
  assert(p1 != NULL);
  assert(p2 != NULL);
  int i = 0;
  for (i = 0; i < p2->count; i++)
  {
    if (!strcmp(p1, p2->data[i].name))//如果相等就返回0,前面加了!操作符,所以非零条件不成立
      return i;
  }
  return -1;
}
void initialize(contacts* pc)
{
  assert(pc != NULL);
  pc->count = 0;//将计数的变量初始化为0
  memset(pc->data, 0, sizeof(pc->data));//将数组里面的内容都初始化为0
}
void addcontact(contacts* pc)
{
  assert(pc != NULL);//断言pc指向的位置不是空指针
  if (pc->count == MAX)
  {
    printf("通讯录已满\n");
    return 0;
  }
  printf("姓名:");
  scanf("%s", pc->data[pc->count].name);
  printf("年龄:");
  scanf("%d", &(pc->data[pc->count].age));
  printf("性别:");
  scanf("%s", pc->data[pc->count].sex);
  printf("电话号:");
  scanf("%s", pc->data[pc->count].phone);
  printf("家庭住址:");
  scanf("%s", pc->data[pc->count].location);
  pc->count++;
  printf("增加成功\n");
}
void showcontact(const contacts* pc)
{
  assert(pc != NULL);
  int i = 0;
  printf("%-20s\t%-20s\t%-20s\t%-20s\t%-20\t\n", "姓名", "年龄", "性别", "电话号", "家庭住址");
  for (i = 0; i < pc->count; i++)
  {
    printf("%-20s\t%-20d\t%-20s\t%-20s\t%-20\t\n",
      pc->data[i].name,
      pc->data[i].age,
      pc->data[i].sex,
      pc->data[i].phone,
      pc->data[i].location);
  }
}
int delcontact(contacts* pc)
{
  assert(pc != NULL);
  char name[20] = { 0 };
  printf("输入此人姓名\n");
  scanf("%s", name);
  int i = find_out(name, pc);
  if (i == -1)
  {
    printf("无此人信息\n");
    return 1;
  }
  pc->count = pc->count - 1;
  while (i < pc->count)
  {
    pc->data[i] = pc->data[i + 1];
    i++;
  }
  printf("删除成功\n");
}
int modifycontact(contacts* pc)
{
  assert(pc != NULL);
  printf("输入此人姓名\n");
  char name[20] = { 0 };
  scanf("%s", name);
  int i = find_out(name, pc);
  if (i == -1)
  {
    printf("无此人信息\n");
    return 1;
  }
  printf("请输入要修改的信息\n");
  printf("姓名:");
  scanf("%s", pc->data[i].name);
  printf("年龄:");
  scanf("%d", &(pc->data[i].age));
  printf("性别:");
  scanf("%s", pc->data[i].sex);
  printf("电话号:");
  scanf("%s", pc->data[i].phone);
  printf("家庭住址:");
  scanf("%s", pc->data[i].location);
  printf("修改成功\n");
}
int findcontact(contacts* pc)
{
  assert(pc != NULL);
  printf("输入此人姓名\n");
  char name[20] = { 0 };
  scanf("%s", name);
  int i = find_out(name, pc);
  if (i == -1)
  {
    printf("无此人信息\n");
    return 1;
  }
  printf("%-20s\t%-20s\t%-20s\t%-20s\t%-20\t\n", "姓名", "年龄", "性别", "电话号", "家庭住址");
  printf("%-20s\t%-20d\t%-20s\t%-20s\t%-20\t\n",
    pc->data[i].name,
    pc->data[i].age,
    pc->data[i].sex,
    pc->data[i].phone,
    pc->data[i].location);
}
int estimate(const void* p1, const void* p2)
{
  return strcmp(((person*)p1)->name, ((person*)p2)->name);
}
void sortcontact(contacts* pc)
{
  assert(pc != NULL);
  qsort(pc->data, pc->count, sizeof(person), estimate);
  printf("排序成功\n");
}

test.c

#include "contacts.h"
enum list
{
  EXIT,
  ADD,
  DEL,
  MODIFY,
  FIND,
  SHOW,
  SORT
};
void catalogue()
{
  printf("*********************************\n");
  printf("***   1.add        2.del      ***\n");
  printf("***   3.modify     4.find     ***\n");
  printf("***   5.show       6.sort     ***\n");
  printf("***   0.exit                  ***\n");
  printf("*********************************\n");
}
int main()
{
  int n = 0;
  contacts con;//通讯录
  initialize(&con);//初始换通讯录
  do
  {
    catalogue();//通讯录菜单
    printf("请选择>");
    scanf("%d", &n);//选择要做什么
    switch (n)
    {
    case EXIT://退出程序
      printf("退出通讯录\n");
      break;
    case ADD://添加联系人
      addcontact(&con);
      break;
    case DEL://删除联系人
      delcontact(&con);
      break;
    case FIND://查找联系人
      findcontact(&con);
      break;
    case MODIFY://修改联系人信息
      modifycontact(&con);
      break;
    case SHOW://展示联系人
      showcontact(&con);
      break;
    case SORT://排序通讯录
      sortcontact(&con);
      break;
    default:
      printf("输入错误请重新输入\n");
    }
  } while (n);
  return 0;
}


相关文章
|
3月前
|
存储 C语言
探索C语言数据结构:利用顺序表完成通讯录的实现
本文介绍了如何使用C语言中的顺序表数据结构实现一个简单的通讯录,包括初始化、添加、删除、查找和保存联系人信息的操作,以及自定义结构体用于存储联系人详细信息。
45 2
|
3月前
|
存储 C语言
手把手教你用C语言实现通讯录管理系统
手把手教你用C语言实现通讯录管理系统
|
5月前
|
存储 搜索推荐 算法
【C语言】C语言—通讯录管理系统(源码)【独一无二】
【C语言】C语言—通讯录管理系统(源码)【独一无二】
|
5月前
|
存储 数据可视化 C语言
【C语言】C语言 手机通讯录系统的设计 (源码+数据+论文)【独一无二】
【C语言】C语言 手机通讯录系统的设计 (源码+数据+论文)【独一无二】
|
7月前
|
机器学习/深度学习 搜索推荐 程序员
C语言实现个人通讯录(功能优化)-2
C语言实现个人通讯录(功能优化)
|
7月前
|
存储 C语言 索引
C语言实现个人通讯录(功能优化)-1
C语言实现个人通讯录(功能优化)
C语言实现个人通讯录(功能优化)-1
|
7月前
|
存储 人机交互 C语言
【C语言项目实战】使用单链表实现通讯录
【C语言项目实战】使用单链表实现通讯录
|
1天前
|
算法 C语言
【C语言程序设计——函数】利用函数求解最大公约数和最小公倍数(头歌实践教学平台习题)【合集】
本文档介绍了如何编写两个子函数,分别求任意两个整数的最大公约数和最小公倍数。内容涵盖循环控制与跳转语句的使用、最大公约数的求法(包括辗转相除法和更相减损术),以及基于最大公约数求最小公倍数的方法。通过示例代码和测试说明,帮助读者理解和实现相关算法。最终提供了完整的通关代码及测试结果,确保编程任务的成功完成。
25 15
|
1天前
|
C语言
【C语言程序设计——函数】亲密数判定(头歌实践教学平台习题)【合集】
本文介绍了通过编程实现打印3000以内的全部亲密数的任务。主要内容包括: 1. **任务描述**:实现函数打印3000以内的全部亲密数。 2. **相关知识**: - 循环控制和跳转语句(for、while循环,break、continue语句)的使用。 - 亲密数的概念及历史背景。 - 判断亲密数的方法:计算数A的因子和存于B,再计算B的因子和存于sum,最后比较sum与A是否相等。 3. **编程要求**:根据提示在指定区域内补充代码。 4. **测试说明**:平台对代码进行测试,预期输出如220和284是一组亲密数。 5. **通关代码**:提供了完整的C语言代码实现
36 24
|
1天前
|
存储 算法 C语言
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
36 23