通讯录的动态版本

简介: 通讯录的动态版本

一. 增加需求


在学习了动态开辟内存之后 我们对于通讯录产生了新的需求


要求我们做出一个动态增长的版本


即 随着我们储存联系人的增加 储存的空间增加


要求 :


1 初始空间为3

2 每次达到上限之后 扩容两个内存


二. 动手实施


我们首先要创建一个结构体


结构体的代码暂定为这样子


struct contact
{
  struct address* date;
    int sz;
  int max;
};

d4a1f06da86b456990a3c307b799884e.png

既然结构体改变了 那么我们的初始化也需要改变一下


void inicontact(struct contact* pc)
{
  pc->sz = 0;
  pc-> max = 3;
  pc->date = (struct address*)calloc(3,sizeof(struct address));
}


这样我们就初始化出来了 一块新的空间


那么这个时候我们开始设计增加联系人的功能


主要思路就是 如果联系人到了上线的话 那么realloc增容上线+2


另外 上线也加上2


代码表示如下


 void addpeople(struct contact* pc)
{
  if ((pc->sz)>=(pc->max))
  {
    pc=(struct address*)realloc(pc->date, (pc->max + 2)*sizeof(struct address));
    printf("扩容成功\n");
    pc->max += 2;
  }
  printf("请输入姓名\n");
  scanf("%s", &(pc->date[pc->sz].name));
  printf("请输入性别\n");
  scanf("%s", &(pc->date[pc->sz].sex));
  printf("请输入年龄\n");
  scanf("%d", &(pc->date[pc->sz].age));
  printf("请输入电话\n");
  scanf("%s", &(pc->date[pc->sz].tel));
  printf("请输入住址\n");
  scanf("%s", &(pc->date[pc->sz].address));
  printf("添加联系人完毕\n");
  pc->sz++;
}


代码显示效果如下


4dbf37ec87d849afa2f7800a9ce4f76b.png


三. 回收空间


其他要修改的地方只是一个回收动态开辟的空间 防止内存泄漏


void killpeople(struct contact* pc)
{
  free(pc->date);
  pc->date = NULL;
  pc->max = 0;
  pc->sz = 0;
}


代码很简单 只需要这样子就好啦


四. 所有代码文件


1. 头文件


#define _CRT_SECURE_NO_WARNINGS 1
#define max 3
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include <windows.h>
void menu();
void inicontact(struct contact * pc);
void addpeople(struct contact* pc);
void delpeople(struct contact* pc);
void srhpeople(struct contact* pc);
void revpeople(struct contact* pc);
void showpeople(struct contact* pc);
void sortpeople(struct contact* pc);
void killpeople(struct contact* pc);
int cmp(struct contact* pc);
struct address
{
  char name[10];
  char sex[5];
  int age;
  char tel[15];
  char address[20];
};
struct contact
{
  struct address *date;
    int sz;
  int max;
};


2. 主函数文件


#define _CRT_SECURE_NO_WARNINGS 1
#include "address.h"
void menu()
{
  printf("------------------------------------\n");
  printf("--------请选择你要实现的功能--------\n");
  printf("--------1.添加联系人信息------------\n");
  printf("--------2.删除指定联系人信息--------\n");
  printf("--------3.查找指定联系人信息--------\n");
  printf("--------4.修改指定联系人信息--------\n");
  printf("--------5.显示所有联系人信息--------\n");
  printf("--------6.清空所有联系人------------\n");
  printf("--------7.以名字排序所有联系人------\n");
}
// 初版初始化 
//void inicontact(struct contact* pc)
//{
//  pc->sz = 0;
//  memset(pc->date, 0, 100*sizeof(struct address));
//}
// 
 void inicontact(struct contact* pc)
{
  pc->sz = 0;
  pc-> max = 3;
  pc->date = (struct address*)calloc(3,sizeof(struct address));
}
// 初始版本的增加联系人
//void addpeople(struct contact* pc)
//{
//  if (pc->sz==100)
//  {
//    printf("通讯录已满 无法继续添加");
//    return 0;
//  }
//  printf("请输入姓名\n");
//  scanf("%s", &(pc->date[pc->sz].name));
//  printf("请输入性别\n");
//  scanf("%s", &(pc->date[pc->sz].sex));
//  printf("请输入年龄\n");
//  scanf("%d", &(pc->date[pc->sz].age));
//  printf("请输入电话\n");
//  scanf("%s", &(pc->date[pc->sz].tel));
//  printf("请输入住址\n");
//  scanf("%s", &(pc->date[pc->sz].address));
//  printf("添加联系人完毕\n");
//  pc->sz++;
//}
 void addpeople(struct contact* pc)
{
  if ((pc->sz)>=(pc->max))
  {
    pc=(struct address*)realloc(pc->date, (pc->max + 2)*sizeof(struct address));
    printf("扩容成功\n");
    pc->max += 2;
  }
  printf("请输入姓名\n");
  scanf("%s", &(pc->date[pc->sz].name));
  printf("请输入性别\n");
  scanf("%s", &(pc->date[pc->sz].sex));
  printf("请输入年龄\n");
  scanf("%d", &(pc->date[pc->sz].age));
  printf("请输入电话\n");
  scanf("%s", &(pc->date[pc->sz].tel));
  printf("请输入住址\n");
  scanf("%s", &(pc->date[pc->sz].address));
  printf("添加联系人完毕\n");
  pc->sz++;
}
void delpeople(struct contact* pc)
{
  char name1[10];
  int input1;
  printf("请输入你要删除的联系人\n");
  scanf("%s", &name1);
  int i;
  for ( i = 0; i <(pc->sz); i++)
  {
    if (strcmp(pc->date[i].name, name1) == 0)
    {
      printf("查到到联系人%s是否确认删除(1or0)\n", name1);
      scanf("%d", &input1);
      if (input1==1)
      {
        for (int j = i; j < ((pc->sz)-1); j++)
        {
          (pc->date[j]) = (pc->date[j + 1]);
          pc->sz--;
        }
        printf("删除成功\n");
      }
      else
      {
        printf("成功取消\n");
      }
    }
  }
  if (i>=(pc->sz))
  {
    printf("联系人%s不存在\n", name1);
  }
}
void srhpeople(struct contact* pc)
{
  char name1[10];
  printf("请输入你要查找的联系人\n");
  scanf("%s", &name1);
  int i;
  for ( i = 0; i < (pc->sz); i++)
  {
    if (strcmp(pc->date[i].name, name1) == 0)
    {
      printf("%-10s\t %-15s\t %-3s\t %-15s\t %-20s\t\n",
        "name", "sex", "age", "tel", "address");
      printf("%-10s\t %-15s\t %-3d\t %-15s\t %-20s\t\n",
        pc->date[i].name,
        pc->date[i].sex,
        pc->date[i].age,
        pc->date[i].tel,
        pc->date[i].address);
    }
  }
  if (i > pc->sz)
  {
    printf("不存在此联系人%s\n", name1);
  }
}
void revpeople(struct contact* pc)
{
  char name1[10];
  printf("请输入你要修改的联系人\n");
  scanf("%s", &name1);
  int i;
  for ( i = 0; i < (pc->sz); i++)
  {
    if (strcmp(pc->date[i].name, name1) == 0)
    {
      printf("请输入姓名\n");
      scanf("%s", &(pc->date[i].name));
      printf("请输入性别\n");
      scanf("%s", &(pc->date[i].sex));
      printf("请输入年龄\n");
      scanf("%d", &(pc->date[i].age));
      printf("请输入电话\n");
      scanf("%s", &(pc->date[i].tel));
      printf("请输入住址\n");
      scanf("%s", &(pc->date[i].address));
      printf("修改联系人完毕\n");
    }
  }
  if (i > pc->sz)
  {
    printf("不存在此联系人%s\n", name1);
  }
}
void showpeople(struct contact* pc)
{
  int i;
  printf("%-10s\t %-15s\t %-3s\t %-15s\t %-20s\t\n",
    "name", "sex", "age", "tel", "address");
  for (i = 0; i < (pc->sz); i++)
  {
    printf("%-10s\t %-15s\t %-3d\t %-15s\t %-20s\t\n",
      pc->date[i].name,
      pc->date[i].sex,
      pc->date[i].age,
      pc->date[i].tel,
      pc->date[i].address);
  }
}
int cmp(void *e1,void *e2)
{
  struct address* p1 = (struct address*)e1;
  struct address* p2 = (struct address*)e2;
  return strcmp(p1->name, p2->name);
}
void sortpeople(struct contact* pc)
{
  qsort(pc, pc->sz, sizeof(struct address), cmp);
}
void killpeople(struct contact* pc)
{
  free(pc->date);
  pc->date = NULL;
  pc->max = 0;
  pc->sz = 0;
}


3. 测试文件


#define _CRT_SECURE_NO_WARNINGS 1
#include "address.h"
int main()
{
  struct contact c1;
  inicontact(&c1);
  int input=1;
  do
  {
    menu();
        scanf("%d", &input);
    switch (input)
    {
    case 1:
      system("cls");
      addpeople(&c1);
      break;
    case 2:
      system("cls");
      delpeople(&c1);
      break;
    case 3:
      system("cls");
      srhpeople(&c1);
      break;
    case 4:
      system("cls");
      revpeople(&c1);
      break;
    case 5:
      system("cls");
      showpeople(&c1);
      break;
    case 6:
      system("cls");
      inicontact(&c1);
      break;
    case 7:
      system("cls");
      sortpeople(&c1);
      break;
    case 0:
      system("cls");
      killpeople(&c1);
      break;
    default:
      break;
    }
  } 
  while (input);
  return 0;
}


以上就是本篇博客的全部内容啦 由于博主才疏学浅 所以难免会出现纰漏 希望大佬们看到错误之后能够


不吝赐教 在评论区或者私信指正 博主一定及时修正


那么大家下期再见咯

相关文章
|
8月前
|
存储
通讯录(动态实现与文件优化版)
通讯录(动态实现与文件优化版)
62 1
【文件版&动态版通讯录】
【文件版&动态版通讯录】
40 0
【动态通讯录】
【动态通讯录】
48 0
|
8月前
文件版本的通讯录
文件版本的通讯录
62 1
|
C语言
【C语言课程设计】通讯录(3.0版本)
【C语言课程设计】通讯录(3.0版本)
78 0
|
C语言
【C语言课程设计】通讯录(2.0版本)
【C语言课程设计】通讯录(2.0版本)
53 0
|
存储 C语言
【C语言课程设计】通讯录(1.0版本)
【C语言课程设计】通讯录(1.0版本)
65 0
|
C语言
通讯录【一】静态版本
通讯录【一】静态版本