通讯录实战

普通版本
//1. 添加联系人信息
//2. 删除指定联系人信息
//3. 查找指定联系人信息
//4. 修改指定联系人信息
//5. 显示所有联系人信息
//6. 清空所有联系人
contact.h文件:

#ifndef _CONTACT_H_
#define _CONTACT_H_

#include<stdio.h>
#include<Windows.h>
#include<stdlib.h>
#include<string.h>

enum Oper
{
 EXIT,
 ADD,
 DEL,
 SEARCH,
 SHOW,
 CLEAR,
 SORT,
 DESTORY
};

#define MAX_NAME 10
#define MAX_SEX 5
#define MAX_TELE 11
#define MAX_ADDR 20
#define MAX_NUMBER 1000
#define DEFAULT_SIZE 2

typedef struct Personinfo
{
 char name[MAX_NAME];
 short age;
 char sex[MAX_SEX];//性别
 char tele[MAX_TELE];
 char addr[MAX_ADDR];
}Personinfo;//每个人的信息

typedef struct Contact
{
 Personinfo per[MAX_NUMBER];
 int usedSize;
}Contact;//通讯录

void initContact(Contact *pcon);
void AddContact(Contact *pcon);
void ShowContact(Contact *pcon);
void DelContact(Contact *pcon);
void ClearContact(Contact *pcon);
void SearchContact(Contact *pcon);
#endif

contact.h文件

#include "Contact.h"
#pragma warning (disable:4996)

//初始化通讯录
void initContact(Contact *pcon)
{
 pcon->usedSize = 0;
 memset(pcon->per, 0, sizeof(pcon->per));
 }
 
 //添加联系人
 void AddContact(Contact *pcon)
{
 if (pcon->usedSize == MAX_NUMBER)
 {
  printf("不好意思,满了\n");
  return;
 }
 printf("请输入姓名:");
 scanf("%s", pcon->per[pcon->usedSize].name);
 printf("请输入年龄:");
 scanf("%d", &(pcon->per[pcon->usedSize].age));
 printf("请输入性别:");
 scanf("%d", pcon->per[pcon->usedSize].sex);
 printf("请输入电话:");
 scanf("%d", pcon->per[pcon->usedSize].tele);
 printf("请输入住址:");
 scanf("%d", pcon->per[pcon->usedSize].addr);
 pcon->usedSize++;
 printf("添加成功!\n");
}

//输出通讯录
void ShowContact(Contact *pcon)
{
 int i = 0;
 printf("%-10s %-5s %-5s %-11s %-20s\n", "姓名" ,"年龄",
  "性别", "电话", "地址");
 for (i = 0; i < pcon->usedSize; i++)
 {
  printf("%-10s %-5d %-5s %-11s %-20s\n",
   pcon->per[i].name,pcon->per[i].age,
   pcon->per[i].sex, pcon->per[i].tele,
   pcon->per[i].addr);
 }
}

//查找联系人,并返回下标
int FindContact(Contact *pcon)
{
 int i = 0;
 char name[MAX_NAME] = { 0 };
 if (pcon->usedSize == 0)
 {
  printf("通讯录为空\n");
  return -1;
 }
 printf("请输入你要查找的姓名:");
 scanf("%s", name);
 for (i = 0; i < pcon->usedSize; i++)
 {
  if (strcmp(pcon->per[i].name, name) == 0)
  {
   return i;
  }
 }
 return -1;
}

//查找联系人
void SearchContact(Contact *pcon)
{
 int index = FindContact(pcon);
 if (index == -1)
 {
  printf("查无此人\n");
  return;
 }
 else{
  int i = index;
  printf("%-10s %-5d %-5s %-11s %-20s\n",
   pcon->per[i].name, pcon->per[i].age,
   pcon->per[i].sex, pcon->per[i].tele,
   pcon->per[i].addr);
 }
}

//删除联系人
void DelContact(Contact *pcon)
{
 int index = FindContact(pcon);
 int i = 0;
 if (index == -1)
 {
  printf("查无此人\n");
  return;
 }
 for (i = index; i < pcon->usedSize - 1; i++)
 {
  pcon->per[i] = pcon->per[i + 1];
 }
  pcon->usedSize--;
  printf("删除成功\n");
}
void ClearContact(Contact *pcon)
{
 pcon->usedSize = 0;
}

test.c

#include "Contact.h"
#pragma warning (disable:4996)
//1. 添加联系人信息
//2. 删除指定联系人信息
//3. 查找指定联系人信息
//4. 修改指定联系人信息
//5. 显示所有联系人信息
//6. 清空所有联系人
void menu()
{
 printf("######欢迎使用XXX通讯录############\n");
 printf("#####0.exit######1.add#############\n");
 printf("#####2.del#######3.search############\n");
 printf("#####4.show######5.clear#############\n");
 printf("#####6.sort######7.destory#############\n");
 printf("####################################\n");
}
int main()
{
 int input = 0;
 Contact con;
 initContact(&con);
 do{
  menu();
  printf("请输入你的操作:");
  scanf("%d", &input);
  switch (input)
  {
  case EXIT:
   break;
  case ADD:
   AddContact(&con);
   break;
  case DEL:
   DelContact(&con);
   break;
  case SEARCH:
   SearchContact(&con);
   break;
  case SHOW:
   ShowContact(&con);
   break;
  case CLEAR:
   ClearContact(&con);
   break;
  case SORT:
   break;
  case DESTORY:
   break;
  default:
   break;
  }
 } while (input);
 system("pause");
 return 0;
}

动态版本:
1.定义通讯录结构体时,个人信息数组改为个人信息指针,
增加一个容量变量,可以通过动态申请所需要的内存来存储。
2.初始化通讯录时,可以X先设原本的容量DEFAULT_SIZE=2,
然后动态申请空间。
3.增加个人信息时,首先判断是否满了,若为满要进行扩容。
可以增加 判断扩容是否成功 函数。
4.动态申请内存时,容易发生内存泄漏,增加摧毁函数。
程序如下

contact.h文件:

#ifndef _CONTACT_H_
#define _CONTACT_H_
#include<stdio.h>
#include<Windows.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#include<vld.h>
enum Oper
{
 EXIT,
 ADD,
 DEL,
 SEARCH,
 SHOW,
 CLEAR,
 SORT,
 DESTORY
};
#define MAX_NAME 10
#define MAX_SEX 5
#define MAX_TELE 11
#define MAX_ADDR 20
#define MAX_NUMBER 1000
#define DEFAULT_SIZE 2
typedef struct Personinfo
{
 char name[MAX_NAME];
 short age;
 char sex[MAX_SEX];//性别
 char tele[MAX_TELE];
 char addr[MAX_ADDR];
}Personinfo;//每个人的信息
typedef struct Contact
{
 Personinfo *per;
 int usedSize;
 int cpaticty;//容量
}Contact;//通讯录
void initContact(Contact *pcon);
void AddContact(Contact *pcon);
void ShowContact(Contact *pcon);
void DelContact(Contact *pcon);
void ClearContact(Contact *pcon);
void SearchContact(Contact *pcon);
void DestoryContact(Contact *pcon);
#endif

contact.c文件

#include "Contact.h"
#pragma warning (disable:4996)
void initContact(Contact *pcon)
{
 pcon->usedSize = 0;
 pcon->cpaticty = DEFAULT_SIZE;
 pcon->per = (Personinfo *)malloc(sizeof(Personinfo)*pcon->cpaticty);
 assert(pcon->per != NULL);
}
//返回值代表扩容是否成功
static int CheckFullAndRe(Contact *pcon)
{
 if (pcon->usedSize == pcon->cpaticty)
 {
  Personinfo *ptr = NULL;
  ptr=(Personinfo *)realloc(pcon->per, sizeof(Personinfo)*pcon->cpaticty * 2);
  if (ptr != NULL)
  {
   pcon->per = ptr;
   pcon->cpaticty *= 2;
   printf("扩容成功\n");
   return 1;
  }
  else{
   return 0;//扩容失败
  }
 }
 return 1;//内存没满,没有进入if,需要返回值
}

//增加联系人
void AddContact(Contact *pcon)
{
 /*if (pcon->useSize == MAX_NUMBER)
 {
  printf("不好意思,满了\n");
  return;
 }*/
 if (CheckFullAndRe(pcon) != 1)
 {
  printf("扩容失败!\n");
  return;
 }
 printf("请输入姓名:");
 scanf("%s", pcon->per[pcon->usedSize].name);
 printf("请输入年龄:");
 scanf("%d", &(pcon->per[pcon->usedSize].age));
 printf("请输入性别:");
 scanf("%d", pcon->per[pcon->usedSize].sex);
 printf("请输入电话:");
 scanf("%d", pcon->per[pcon->usedSize].tele);
 printf("请输入住址:");
 scanf("%d", pcon->per[pcon->usedSize].addr);
 pcon->usedSize++;
 printf("添加成功!\n");
}

//显示联系人
void ShowContact(Contact *pcon)
{
 int i = 0;
 printf("%-10s %-5s %-5s %-11s %-20s\n", "姓名" ,"年龄",
  "性别", "电话", "地址");
 for (i = 0; i < pcon->usedSize; i++)
 {
  printf("%-10s %-5d %-5s %-11s %-20s\n",
   pcon->per[i].name,pcon->per[i].age,
   pcon->per[i].sex, pcon->per[i].tele,
   pcon->per[i].addr);
 }
}

//查找联系人返回下标
int FindContact(Contact *pcon)
{
 int i = 0;
 char name[MAX_NAME] = { 0 };
 if (pcon->usedSize == 0)
 {
  printf("通讯录为空\n");
  return -1;
 }
 printf("请输入你要查找的姓名:");
 scanf("%s", name);
 for (i = 0; i < pcon->usedSize; i++)
 {
  if (strcmp(pcon->per[i].name, name) == 0)
  {
   return i;
  }
 }
 return -1;
}

//查找联系人信息
void SearchContact(Contact *pcon)
{
 int index = FindContact(pcon);
 if (index == -1)
 {
  printf("查无此人\n");
  return;
 }
 else{
  int i = index;
  printf("%-10s %-5d %-5s %-11s %-20s\n",
   pcon->per[i].name, pcon->per[i].age,
   pcon->per[i].sex, pcon->per[i].tele,
   pcon->per[i].addr);
 }
}

//删除联系人
void DelContact(Contact *pcon)
{
 int index = FindContact(pcon);
 int i = 0;
 if (index == -1)
 {
  printf("查无此人\n");
  return;
 }
 for (i = index; i < pcon->usedSize - 1; i++)
 {
  pcon->per[i] = pcon->per[i + 1];
 }
  pcon->usedSize--;
  printf("删除成功\n");
}

//清空联系人
void ClearContact(Contact *pcon)
{
 pcon->usedSize = 0;
}

//摧毁
void DestoryContact(Contact *pcon)
{
 free(pcon->per);
 pcon->per = NULL;//预防野指针
 pcon->cpaticty = 0;
 pcon->usedSize = 0;
}

test.c文件:

#include "Contact.h"
#pragma warning (disable:4996)
//1. 添加联系人信息
//2. 删除指定联系人信息
//3. 查找指定联系人信息
//4. 修改指定联系人信息
//5. 显示所有联系人信息
//6. 清空所有联系人
//7. 摧毁
void menu()
{
 printf("######欢迎使用XXX通讯录############\n");
 printf("#####0.exit######1.add#############\n");
 printf("#####2.del#######3.search############\n");
 printf("#####4.show######5.clear#############\n");
 printf("#####6.sort######7.destory#############\n");
 printf("####################################\n");
}
int main()
{
 int input = 0;
 Contact con;
 initContact(&con);
 do{
  menu();
  printf("请输入你的操作:");
  scanf("%d", &input);
  switch (input)
  {
  case EXIT:
   DestoryContact(&con);
   break;
  case ADD:
   AddContact(&con);
   break;
  case DEL:
   DelContact(&con);
   break;
  case SEARCH:
   SearchContact(&con);
   break;
  case SHOW:
   ShowContact(&con);
   break;
  case CLEAR:
   ClearContact(&con);
   break;
  case SORT:
   break;
  case DESTORY:
   DestoryContact(&con);
   break;
  default:
   break;
  }
 } while (input);
 system("pause");
 return 0;
}

文件版本:摧毁之前把数据保存在文件里面
1.增加存储函数。
2.初始化时加载文件内容。增加加载函数。
:打开文件,判断空间是否满了,若满了必须扩容。
程序如下:
contact.h文件:

#ifndef _CONTACT_H_
#define _CONTACT_H_
#include<stdio.h>
#include<Windows.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#include<vld.h>
enum Oper
{
 EXIT,
 ADD,
 DEL,
 SEARCH,
 SHOW,
 CLEAR,
 SORT,
 DESTORY
};
#define MAX_NAME 10
#define MAX_SEX 5
#define MAX_TELE 11
#define MAX_ADDR 20
#define MAX_NUMBER 1000
#define DEFAULT_SIZE 2
typedef struct Personinfo
{
 char name[MAX_NAME];
 short age;
 char sex[MAX_SEX];//性别
 char tele[MAX_TELE];
 char addr[MAX_ADDR];
}Personinfo;//每个人的信息
typedef struct Contact
{
 //Personinfo per[MAX_NUMBER];//普通版本
 Personinfo *per;
 int usedSize;
 int cpaticty;//容量
}Contact;//通讯录
void initContact(Contact *pcon);
void AddContact(Contact *pcon);
void ShowContact(Contact *pcon);
void DelContact(Contact *pcon);
void ClearContact(Contact *pcon);
void SearchContact(Contact *pcon);
void DestoryContact(Contact *pcon);
int CheckFullAndRe(Contact *pcon);
void LoadContact(Contact *pcon);
#endif

contact.c文件:

#include "Contact.h"
#pragma warning (disable:4996)
//加载,读文件
void LoadContact(Contact *pcon)
{
 FILE *pf = fopen("Contact.bat", "rb");
 Personinfo tmp = { 0 };
 //fread函数的返回值是:读取的字节数
 if (pf == NULL)
 {
  return;
 }//第一次加载什么都不用做
 while (fread(&tmp, sizeof(Personinfo), 1, pf) > 0)
 {
  CheckFullAndRe(pcon);//必须判断是否为满,如果满了扩容
  pcon->per[pcon->usedSize] = tmp;
  pcon->usedSize++;
 }
 fclose(pf);
 pf = NULL;
}

void initContact(Contact *pcon)
{
 /*pcon->usedSize = 0;
 memset(pcon->per, 0, sizeof(pcon->per));*///普通版本
 pcon->usedSize = 0;
 pcon->cpaticty = DEFAULT_SIZE;
 pcon->per = (Personinfo *)malloc(sizeof(Personinfo)*pcon->cpaticty);
 assert(pcon->per != NULL);
 LoadContact(pcon);
}
//返回值代表扩容是否成功

static int CheckFullAndRe(Contact *pcon)
{
 if (pcon->usedSize == pcon->cpaticty)
 {
  Personinfo *ptr = NULL;
  ptr=(Personinfo *)realloc(pcon->per, sizeof(Personinfo)*pcon->cpaticty * 2);
  if (ptr != NULL)
  {
   pcon->per = ptr;
   pcon->cpaticty *= 2;
   printf("扩容成功\n");
   return 1;
  }
  else{
   return 0;//扩容失败
  }
 }
 return 1;//内存没满,没有进入if,需要返回值
}


void AddContact(Contact *pcon)
{
if (CheckFullAndRe(pcon) != 1)
 {
  printf("扩容失败!\n");
  return;
 }
 printf("请输入姓名:");
 scanf("%s", pcon->per[pcon->usedSize].name);
 printf("请输入年龄:");
 scanf("%d", &(pcon->per[pcon->usedSize].age));
 printf("请输入性别:");
 scanf("%d", pcon->per[pcon->usedSize].sex);
 printf("请输入电话:");
 scanf("%d", pcon->per[pcon->usedSize].tele);
 printf("请输入住址:");
 scanf("%d", pcon->per[pcon->usedSize].addr);
 pcon->usedSize++;
 printf("添加成功!\n");
}

void ShowContact(Contact *pcon)
{
 int i = 0;
 printf("%-10s %-5s %-5s %-11s %-20s\n", "姓名" ,"年龄",
  "性别", "电话", "地址");
 for (i = 0; i < pcon->usedSize; i++)
 {
  printf("%-10s %-5d %-5s %-11s %-20s\n",
   pcon->per[i].name,pcon->per[i].age,
   pcon->per[i].sex, pcon->per[i].tele,
   pcon->per[i].addr);
 }
}

int FindContact(Contact *pcon)
{
 int i = 0;
 char name[MAX_NAME] = { 0 };
 if (pcon->usedSize == 0)
 {
  printf("通讯录为空\n");
  return -1;
 }
 printf("请输入你要查找的姓名:");
 scanf("%s", name);
 for (i = 0; i < pcon->usedSize; i++)
 {
  if (strcmp(pcon->per[i].name, name) == 0)
  {
   return i;
  }
 }
 return -1;
}

void SearchContact(Contact *pcon)
{
 int index = FindContact(pcon);
 if (index == -1)
 {
  printf("查无此人\n");
  return;
 }
 else{
  int i = index;
  printf("%-10s %-5d %-5s %-11s %-20s\n",
   pcon->per[i].name, pcon->per[i].age,
   pcon->per[i].sex, pcon->per[i].tele,
   pcon->per[i].addr);
 }
}

void DelContact(Contact *pcon)
{
 int index = FindContact(pcon);
 int i = 0;
 if (index == -1)
 {
  printf("查无此人\n");
  return;
 }
 for (i = index; i < pcon->usedSize - 1; i++)
 {
  pcon->per[i] = pcon->per[i + 1];
 }
  pcon->usedSize--;
  printf("删除成功\n");
}
void ClearContact(Contact *pcon)
{
 pcon->usedSize = 0;
}
//存储
void SaveContact(Contact *pcon)
{
 int i = 0;
 FILE *pf = fopen("Contact.bat","wb");
 assert(pf != NULL);
 for (i = 0; i < pcon->usedSize; i++)
 {
  fwrite(pcon->per + i,sizeof(Personinfo),1,pf);
 }
 fclose(pf);
 pf = NULL;
}

void DestoryContact(Contact *pcon)
{
 SaveContact(pcon);
 free(pcon->per);
 pcon->per = NULL;//预防野指针
 pcon->cpaticty = 0;
 pcon->usedSize = 0;
}

猜你喜欢

转载自blog.csdn.net/unique_IT/article/details/95630186