【C語言】簡單實現通訊錄
已實現功能
新建聯繫人
刪除指定聯繫人
查找指定聯繫人
修改指定聯繫人
顯示所有聯繫人
清空所有聯繫人
按姓名排序聯繫人
待實現功能
通訊錄加密
通訊錄聯網保存
通訊錄導入導出
實現效果展示
頭文件
#ifndef __TONYXUNLU_H__
#define __TONGXUNLU_H__
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <Windows.h>
#include <string.h>
#define DEFAULT 2 //通信錄默認大小
#define NAME_MAX 10
#define SEX_MAX 5
#define TELE_MAX 12
#define ADDRESS_MAX 50
#define ADD_NUM 2 //每次擴容默認步長
enum OPTION
{
EXIT,
ADD,
DEL,
FIND,
MODIFY,
DISPLAY,
EMPTY,
SORT
};
typedef struct PLEINFO //通訊錄個人信息結構體
{
char name[NAME_MAX];
char sex[SEX_MAX];
unsigned char age;
char telephone[TELE_MAX];
char address[ADDRESS_MAX];
}PLEINFO;
typedef struct CONTACT //通訊錄結構體
{
unsigned int count;
unsigned int capacity;
PLEINFO *data;
}CONTACT;
CONTACT my_contact;
void InitContact(CONTACT *pcontact); //初始化通訊錄
void Modify(CONTACT *pcontact); //修改聯繫人信息
void SubCapacity(CONTACT *pcontact); //覈查縮小通訊錄容量
void AddCapacity(CONTACT *pcontact); //覈查增加通訊錄容量
void Add(CONTACT *pcontact); //新建聯繫人
void Del(CONTACT *pcontact); //刪除聯繫人
int Find(CONTACT *pcontact); //查找聯繫人
void Display(CONTACT *pcontact); //顯示所有聯繫人
void Sort(CONTACT *pcontact); //按姓名排序聯繫人
void Empty(CONTACT *pcontact); //清空聯繫人
void menu(); //菜單
void Exit(CONTACT *pcontact); //關閉通訊錄
#endif //_TONGXUNLU_H__
功能實現文件
#include "tongxunlu.h"
void InitContact(CONTACT *pcontact) //初始化通訊錄
{
pcontact->capacity = DEFAULT;
pcontact->count = 0;
pcontact->data = (PLEINFO *)calloc(sizeof(PLEINFO), pcontact->capacity);
if (pcontact->data == NULL)
{
printf("\n初始化通訊錄失敗\n");
system("pause");
exit(-1);
}
}
void SubCapacity(CONTACT *pcontact) //覈查縮小通訊錄容量
{
if (pcontact->capacity > pcontact->count && pcontact->count != 0)
{
int result = pcontact->capacity - pcontact->count;
PLEINFO *tmp = (PLEINFO *)realloc(pcontact->data, (pcontact->capacity - result)*sizeof(PLEINFO));
if (tmp != NULL)
{
pcontact->data = tmp;
tmp = NULL;
pcontact->capacity -= result;
}
else
{
perror("縮容失敗");
Exit(pcontact);
exit(-1);
}
}
}
void AddCapacity(CONTACT *pcontact) //覈查增加通訊錄容量
{
if (pcontact->capacity == pcontact->count)
{
PLEINFO *tmp = (PLEINFO *)realloc(pcontact->data, (pcontact->capacity + ADD_NUM)*sizeof(PLEINFO));
if (tmp != NULL)
{
pcontact->data = tmp;
tmp = NULL;
pcontact->capacity += ADD_NUM;
}
else
{
perror("擴容失敗");
Exit(pcontact);
exit(-1);
}
}
}
void Add(CONTACT *pcontact) //新建聯繫人
{
AddCapacity(pcontact);
printf("\n\t新建聯繫人\n\n");
printf("請輸入聯繫人姓名:>");
scanf("%s", (pcontact->data[pcontact->count].name));
printf("請輸入聯繫人性別:>");
scanf("%s", (pcontact->data[pcontact->count].sex));
printf("請輸入聯繫人年齡:>");
scanf("%d", &((pcontact->data[pcontact->count].age)));
printf("請輸入聯繫人電話:>");
scanf("%s", (pcontact->data[pcontact->count].telephone));
printf("請輸入聯繫人住址:>");
scanf("%s", (pcontact->data[pcontact->count].address));
++pcontact->count;
printf("\n\t聯繫人增加成功\n");
system("pause");
}
void Del(CONTACT *pcontact) //刪除聯繫人
{
int i = Find(pcontact);
if (i == -1)
{
printf("\n沒有找到該聯繫人\n");
system("pause");
return;
}
else
{
pcontact->data[i] = pcontact->data[--pcontact->count];
}
SubCapacity(pcontact);
printf("\n刪除成功\n");
system("pause");
}
unsigned int Find(CONTACT *pcontact) //查找聯繫人
{
char name[10];
unsigned int i = 0;
printf("請輸入你要操作的聯繫人的姓名:>");
scanf("%s", name);
for (i = 0; i < pcontact->count; i++)
{
if (!strcmp(pcontact->data[i].name, name))
{
return i;
}
}
return -1;
}
void Modify(CONTACT *pcontact) //修改聯繫人信息
{
int i = Find(pcontact);
if (i == -1)
{
printf("\n沒有找到該聯繫人\n");
system("pause");
return;
}
else
{
int input = 0;
printf("\n---------------------------------------------\n");
printf("\n\t已找到該聯繫人\n\n姓名:%s\n性別:%s\n年齡:%d\n電話:%s\n住址:%s\n",
pcontact->data[i].name, pcontact->data[i].sex, pcontact->data[i].age,
pcontact->data[i].telephone, pcontact->data[i].address);
printf("\n---------------------------------------------\n");
do
{
printf("\n1.姓名\t2.性別\t3.年齡\t4.電話\t5.住址\t0.退出\n\n你要修改聯繫人的哪一個信息呢?:>");
scanf("%d", &input);
switch (input)
{
case 1:
{
printf("姓名修改爲:>");
scanf("%s", pcontact->data[i].name);
}
break;
case 2:
{
printf("性別修改爲:>");
scanf("%s", pcontact->data[i].sex);
}
break;
case 3:
{
printf("年齡修改爲:>");
scanf("%d", &(pcontact->data[i].age));
}
break;
case 4:
{
printf("電話修改爲:>");
scanf("%s", pcontact->data[i].telephone);
}
break;
case 5:
{
printf("住址修改爲:>");
scanf("%s", pcontact->data[i].address);
}
break;
case 0: printf("\n退出修改\n");
break;
default: printf("\n選擇錯誤,請重新選擇\n");
break;
}
} while (input);
}
printf("\n聯繫人修改成功\n");
system("pause");
}
void Display(CONTACT *pcontact) //顯示所有聯繫人
{
unsigned int i = 0;
printf("\n通訊錄當前 存放聯繫人數量/總容量\t%d/%d\n", pcontact->count, pcontact->capacity);
printf("\n---------------------------------------------\n");
printf("\n%-10s%-8s%-9s%-15s%-50s\n\n", "姓名", "性別", "年齡", "電話", "住址");
for (i = 0; i < pcontact->count; i++)
{
printf("%-10s%-8s%-9d%-15s%-50s\n",
pcontact->data[i].name, pcontact->data[i].sex, pcontact->data[i].age,
pcontact->data[i].telephone, pcontact->data[i].address);
}
printf("\n---------------------------------------------\n");
system("pause");
}
void Empty(CONTACT *pcontact) //清空聯繫人
{
PLEINFO *tmp = (PLEINFO *)calloc(sizeof(PLEINFO), DEFAULT);
if (!tmp)
{
printf("\n清空失敗,請稍後重新清空\n");
system("pause");
return;
}
free(pcontact->data);
pcontact->data = tmp;
tmp = NULL;
pcontact->capacity = DEFAULT;
pcontact->count = 0;
printf("\n聯繫人清空成功\n");
system("pause");
}
void Sort(CONTACT *pcontact) //按姓名排序聯繫人 //冒泡排序
{
unsigned int i = 0;
for (i = 0; i < pcontact->count - 1; i++)
{
unsigned int j = 0;
for (j = 0; j < pcontact->count - i - 1; j++)
{
if (strcmp(pcontact->data[j].name, pcontact->data[j + 1].name) > 0)
{
PLEINFO tmp = pcontact->data[j];
pcontact->data[j] = pcontact->data[j + 1];
pcontact->data[j + 1] = tmp;
}
}
}
}
void menu() //菜單
{
printf("***********************\n");
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");
}
void Exit(CONTACT *pcontact) //關閉通訊錄
{
free(pcontact->data);
pcontact->data = NULL;
pcontact->capacity = 0;
pcontact->count = 0;
printf("\n已退出通訊錄\n");
system("pause");
}
主函數文件
#include "tongxunlu.h"
int main()
{
int input = 0;
InitContact(&my_contact);
do
{
system("cls");
menu();
printf("你想幹嘛?:>");
scanf("%d", &input);
switch (input)
{
case EXIT: Exit(&my_contact);
break;
case ADD: Add(&my_contact);
break;
case DEL: Del(&my_contact);
break;
case FIND:
{
unsigned int i = Find(&my_contact);
if (i == -1)
{
printf("\n沒有找到聯繫人\n");
system("pause");
break;
}
printf("\n---------------------------------------------\n");
printf("\n姓名:%-10s\n性別:%-8s\n年齡:%-9d\n電話:%-15s\n住址:%-50s\n",
my_contact.data[i].name, my_contact.data[i].sex, my_contact.data[i].age,
my_contact.data[i].telephone, my_contact.data[i].address);
printf("\n---------------------------------------------\n");
system("pause");
}
break;
case MODIFY: Modify(&my_contact);
break;
case DISPLAY:Display(&my_contact);
break;
case EMPTY: Empty(&my_contact);
break;
case SORT: Sort(&my_contact);
break;
default: printf("\n你輸錯了,重新輸入吧!\n");
break;
}
} while (input);
return 0;
}