#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#define Max_name 10
#define Max_sex 10
#define Max_number 11
#define Max_phoList 1000
typedef struct PhoneList
{
char name[Max_name];
char sex[Max_sex];
char number[Max_number];
}PhoneList;
typedef struct Contact
{
PhoneList* data;
int size;
int capacity;
} Contact;
void InitContact(Contact* con);
int Dilatation(Contact* con);
void Show(Contact* con);
void AddContact(Contact* con);
void DelContact(Contact* con);
void Search(Contact* con);
void Modify(Contact* con);
void Sort(Contact* con);
int cmp_by_name(const void* e1, const void*e2);
void SaveContact(Contact* con);
void LoadContact(Contact* con);
void ClearContact(Contact* con);
-------------------------------------------------
#include"contact.h"
void InitContact(Contact* con)
{
con->size = 0;
con->capacity = 2;
con->data = (PhoneList*)malloc(sizeof(PhoneList)* con->capacity);
if (con->data == NULL)
{
printf("通讯录开辟失败!\n");
exit(1);
}
LoadContact(con);
}
void LoadContact(Contact* con)
{
FILE* pfIn = fopen("contact.txt", "rb");
if (pfIn == NULL)
{
printf("LoadContact::%s\n", strerror(errno));
return;
}
else
{
PhoneList tmp = { 0 };
while (fread(&tmp, sizeof(PhoneList), 1, pfIn))
{
if (con->size == con->capacity)
{
int ret = Dilatation(con);
}
con->data[con->size] = tmp;
con->size++;
}
}
fclose(pfIn);
pfIn = NULL;
}
void SaveContact(Contact* con)
{
FILE* pfOut = fopen("contact.txt", "wb");
if (pfOut == NULL)
{
printf("savaContact::%s\n", strerror(errno));
return;
}
else
{
for (int i = 0; i < con->size; i++)
{
fwrite(con->data + i, sizeof(PhoneList), 1, pfOut);
}
printf("通讯录已保存!\n");
fclose(pfOut);
pfOut = NULL;
}
}
int Dilatation(Contact* con)
{
PhoneList* ptr = (PhoneList*)realloc(con->data, sizeof(PhoneList)* con->capacity * 2);
if (ptr != NULL)
{
con->capacity *= 2;
con->data = ptr;
printf("扩容成功!\n");
return 1;
}
else
{
printf("扩容失败!\n");
return 0;
}
}
void Show(Contact* con)
{
int i = 0;
if (con->size == 0)
{
printf("-----------------------------------\n");
printf("通讯录为空!\n");
printf("-----------------------------------\n");
}
else
{
printf("\n");
printf("\n");
printf("-----------------------------------\n");
printf("%-10s\t %-10s\t %-11s\n", "姓名", "性别", "电话号码");
for (i = 0; i < con->size; i++)
{
printf("%-10s\t %-10s\t %-11s\n", (con->data[i]).name, (con->data[i]).sex, (con->data[i]).number);
}
printf("-----------------------------------\n");
printf("\n");
printf("\n");
}
}
void AddContact(Contact* con)
{
if (con->size == con->capacity)
{
int ret = Dilatation(con);
if (ret == 0)
{
printf("内存已满,无法添加!\n");
printf("正在退出通讯录!\n");
SaveContact(con);
exit(1);
}
}
printf("请输入姓名:>");
scanf("%s", (con->data[con->size].name));
printf("请输入性别:>");
scanf("%s", (con->data[con->size].sex));
printf("请输入电话号码:>");
scanf("%s", (con->data[con->size].number));
printf("已保存联系人信息!\n");
con->size++;
}
static int FindName(Contact* con)
{
int i;
char str[10];
printf("请输入要查找的姓名:>");
scanf("%s", str);
for (i = 0; i < con->size; i++)
{
if (strcmp(con->data[i].name, str) == 0)
return i;
}
return -1;
}
void DelContact(Contact* con)
{
int pos = FindName(con);
if (pos == -1)
{
printf("查无此人!\n");
return;
}
else
{
int i = pos;
for (i = pos; i < con->size - 1; i++)
{
con->data[i] = con->data[i + 1];
}
printf("\n");
printf("删除成功!\n");
printf("\n");
con->size--;
}
}
void Search(Contact* con)
{
int pos = FindName(con);
if (pos == -1)
{
printf("查无此人!\n");
return;
}
else
{
printf("查找人信息如下:\n");
printf("姓名:%s\n", con->data[pos].name);
printf("性别:%s\n", con->data[pos].sex);
printf("电话号码:%s\n", con->data[pos].number);
}
return;
}
void Modify(Contact* con)
{
int pos = FindName(con);
printf("请修改姓名:> ");
scanf("%s", con->data[pos].name);
printf("请修改性别:> ");
scanf("%s", con->data[pos].sex);
printf("请修改电话号码:> ");
scanf("%s", con->data[pos].number);
}
int cmp_by_name(const void* e1, const void* e2)
{
int val = strcmp(((PhoneList*)e1)->name, ((PhoneList*)e2)->name);
return val;
}
void ClearContact(Contact* con)
{
con->size = 0;
con->capacity = 0;
free(con->data);
con->data = NULL;
printf("通讯录已清空!\n");
}
-------------------------------------------------------
#include "contact.h"
enum Func
{
Exit,
addContact,
delContact,
serch,
modify,
show,
sort,
save,
clearContact
};
int main()
{
Contact con;
InitContact(&con);
int input;
do
{
printf("************************************\n");
printf("** 1.addContact * 2.delContact **\n");
printf("** 3.serch * 4.modify **\n");
printf("** 5.show * 6.sort **\n");
printf("** 7.save * 8.clearContact*\n");
printf("************ 0.exit **************\n");
printf("************************************\n");
printf("请输入你的操作:> ");
scanf("%d", &input);
switch (input)
{
case addContact:
AddContact(&con);
break;
case delContact:
DelContact(&con);
break;
case serch:
Search(&con);
break;
case show:
Show(&con);
break;
case modify:
Modify(&con);
case sort:
qsort(con.data, con.size, sizeof(con.data[0]), cmp_by_name);
break;
case save:
SaveContact(&con);
break;
case clearContact:
ClearContact(&con);
break;
case Exit:
printf("正在退出\n");
}
} while (input);
}