C语言通讯录详解(进阶版)

时间:2025-03-09 08:23:47
  • #include""
  • //静态版本
  • //void InitContact(Contact* pc)
  • //{
  • // assert(pc);
  • // memset(pc->data, 0, sizeof(pc->data));
  • // pc->num = 0;
  • //}
  • //动态版本初始化
  • void InitContact(Contact* pc)
  • {
  • assert(pc);
  • pc->data = (PeoInfo*)malloc(DEFAULT_SZ * sizeof(PeoInfo));
  • if (pc->data == NULL)
  • {
  • perror("InitContact");
  • return;
  • }
  • pc->num = 0;
  • pc->capacity = DEFAULT_SZ;
  • }
  • //静态版本
  • //void AddContact(Contact* pc)
  • //{
  • // assert(pc);
  • // if (pc->num == MAX)
  • // {
  • // printf("通讯录已满\n");
  • // return;
  • // }
  • //
  • // printf("请输入名字:");
  • // scanf("%s", pc->data[pc->num].name);
  • // printf("请输入年龄:");
  • // scanf("%d", &(pc->data[pc->num].age));
  • // printf("请输入性别:");
  • // scanf("%s", pc->data[pc->num].sex);
  • // printf("请输入电话:");
  • // scanf("%s", pc->data[pc->num].tele);
  • // printf("请输入住址:");
  • // scanf("%s", pc->data[pc->num].addr);
  • //
  • // pc->num++;
  • // printf("添加成功\n");
  • //}
  • int CheckCapacity(Contact* pc)
  • {
  • if (pc->num == pc->capacity)
  • {
  • PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capacity + INC_SZ) * sizeof(PeoInfo));
  • if (ptr == NULL)
  • {
  • perror("CheckCapacity");
  • return 0;
  • }
  • else
  • {
  • pc->data = ptr;
  • pc->capacity += INC_SZ;
  • printf("增容成功\n");
  • return 1;
  • }
  • }
  • return 1;
  • }
  • //动态的版本
  • void AddContact(Contact* pc)
  • {
  • assert(pc);
  • if (0 == CheckCapacity(pc))
  • {
  • return;
  • }
  • printf("请输入名字:>");
  • scanf("%s", pc->data[pc->num].name);
  • printf("请输入年龄:>");
  • scanf("%d", &(pc->data[pc->num].age));
  • printf("请输入性别:>");
  • scanf("%s", pc->data[pc->num].sex);
  • printf("请输入电话:>");
  • scanf("%s", pc->data[pc->num].tele);
  • printf("请输入地址:>");
  • scanf("%s", pc->data[pc->num].addr);
  • pc->num++;
  • printf("成功增加联系人\n");
  • }
  • int FindName(const Contact* pc, char name[])
  • {
  • int i = 0;
  • for (i = 0; i < pc->num; i++)
  • {
  • if (strcmp(pc->data[i].name, name) == 0)
  • {
  • return i;
  • }
  • return -1;
  • }
  • }
  • void DleContact(Contact* pc)
  • {
  • assert(pc);
  • if (pc->num == 0)
  • {
  • printf("通讯录为空,无法删除\n");
  • return;
  • }
  • char name[Max_name] = { 0 };
  • printf("请输入要删除的联系人:");
  • scanf("%s", &name);
  • int del = FindName(pc,name);
  • if (del == -1)
  • {
  • printf("要删除的联系人不存在\n");
  • return;
  • }
  • int i = 0;
  • for (i = del; i < pc->num - 1; i++)
  • {
  • pc->data[i] = pc->data[i + 1];
  • }
  • pc->num--;
  • printf("成功删除联系人\n");
  • }
  • void SerchContact(const Contact* pc)
  • {
  • assert(pc);
  • char name[Max_name] = { 0 };
  • printf("请输入要查找的联系人:");
  • scanf("%s", &name);
  • int pos = FindName(pc, name);
  • if (pos == -1)
  • printf("要查找的联系人不存在\n");
  • else
  • {
  • printf("%-10s\t%-4s\t%-5s\t%-15s\t%-30s\n", "姓名", "年龄", "性别", "电话", "住址");
  • printf("%-10s\t%-4s\t%-5s\t%-15s\t%-30s\n",
  • pc->data[pos].name,
  • pc->data[pos].age,
  • pc->data[pos].sex,
  • pc->data[pos].tele,
  • pc->data[pos].addr);
  • }
  • }
  • void ModifyContact(Contact* pc)
  • {
  • assert(pc);
  • char name[Max_name] = { 0 };
  • printf("请输入要查找的联系人:");
  • scanf("%s", &name);
  • int pos = FindName(pc, name);
  • if (pos == -1)
  • printf("要修改的联系人不存在\n");
  • else
  • {
  • printf("请输入名字:");
  • scanf("%s", pc->data[pc->num].name);
  • printf("请输入年龄:");
  • scanf("%d",&(pc->data[pc->num].age));
  • printf("请输入性别:");
  • scanf("%s", pc->data[pc->num].sex);
  • printf("请输入电话:");
  • scanf("%s", pc->data[pc->num].tele);
  • printf("请输入住址:");
  • scanf("%s", pc->data[pc->num].addr);
  • printf("修改成功\n");
  • }
  • }
  • void ShowContact(const Contact* pc)
  • {
  • assert(pc);
  • int i = 0;
  • printf("%-10s\t%-4s\t%-5s\t%-15s\t%-30s\n", "姓名", "年龄", "性别", "电话", "住址");
  • for (i = 0; i < pc->num; i++)
  • {
  • printf("%-10s\t%-4s\t%-5s\t%-15s\t%-30s\n",
  • pc->data[i].name,
  • pc->data[i].age,
  • pc->data[i].sex,
  • pc->data[i].tele,
  • pc->data[i].addr);
  • }
  • }
  • int name_sort(const void* str1, const void* str2)
  • {
  • return(strcmp(((Contact*)str1)->data->name, ((Contact*)str2)->data->name));
  • }
  • void SortContact(Contact* pc)
  • {
  • assert(pc);
  • qsort(pc->data, pc->num, sizeof(pc->data[0]), name_sort);
  • printf("排序完成\n");
  • ShowContact(pc);
  • }
  • void DestroyContact(Contact* pc)
  • {
  • free(pc->data);
  • pc->data = NULL;
  • pc->capacity = 0;
  • pc->num = 0;
  • }