// contact.h
#ifndef _CONTACT_H_
#define _CONTACT_H_
#pragma warning(disable:4996)
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
//person 内部元素的大小
#define NAME_SIZE 32
#define ADDRESS_SIZE 128
#define SEX_SIZE 8
#define TELEPHONE_SIZE 32
#define SAVE_FILE "save.txt"
//通讯录的初始信息
#define INIT_NUM 2
#define INC_NUM 2
typedef struct person{
char name[NAME_SIZE];
char sex[SEX_SIZE];
int age;
char address[ADDRESS_SIZE];
char telephone[TELEPHONE_SIZE];
}person_t;
typedef struct contact{
int cap; //容量
int size; //当前有效好友
person_t frinds[0]; //柔性数组
}contact_t;
void InitContact(contact_t **ct);
void AddFriend(contact_t **ct);
void DelFriend(contact_t *ct);
void SearchFriend(contact_t *ct);
int SearchCore(contact_t *ct, const char *name);
void ModFriend(contact_t *ct);
void SortFrind(contact_t *ct);
void ClearFriend(contact_t *ct);
void SaveContact(contact_t *ct);
void SortFriend(contact_t *ct);
void ShowFriend(contact_t *ct);
#endif
//contact.c
#include "Contact.h"
void InitContact(contact_t **ct)
{
FILE *fp = fopen(SAVE_FILE, "rb");
if (fp == NULL)
{
*ct = (contact_t*)malloc(sizeof(contact_t)+sizeof(person_t)*INIT_NUM);
if (*ct == NULL)
{
perror("malloc\n");
exit(-1);
}
(*ct)->size = 0;
(*ct)->cap = INIT_NUM;
printf("Using Default Init!\n");
}
else{
contact_t tmp;
fread(&tmp, sizeof(contact_t), 1, fp);
*ct = (contact_t*)malloc(sizeof(contact_t)+sizeof(person_t)*(tmp.cap));
if (ct == NULL)
{
perror("malloc\n");
exit(2);
}
memcpy(*ct, &tmp, sizeof(contact_t));
fread((*ct)->frinds, sizeof(person_t), (*ct)->size, fp);
printf("Using Save.txt Init!\n");
fclose(fp);
}
}
static int IsFull(contact_t *ct)
{
return ct->size == ct->cap;
}
static int Inc(contact_t **ct)
{
assert(ct);
if ((*ct)->size == (*ct)->cap)
{
contact_t *tmp = (contact_t *)realloc(*ct,sizeof(person_t)*((*ct)->cap + INC_NUM) + sizeof(contact_t));
if (tmp == NULL)
{
printf("malloc 失败!");
exit(1);
}
*ct = tmp;
(*ct)->cap += INC_NUM;
printf("增容成功!\n");
return 1;
}
return 0;
}
static int IsExist(contact_t *ct, person_t *p)
{
assert(ct);
assert(p);
int i = 0;
for (; i < ct->size; i++)
{
if (strcmp((ct->frinds + i)->name, p->name) == 0)
{
return 1;
}
}
return 0;
}
void AddFriend(contact_t **ct)
{
assert(ct);
if (!IsFull(*ct) || Inc(ct))
{
person_t p;
printf("请输入新增用户的姓名# ");
scanf("%s", p.name);
printf("请输入新增用户的性别# ");
scanf("%s", p.sex);
printf("请输入新增用户的年龄# ");
scanf("%d", &p.age);
printf("请输入新增用户的地址# ");
scanf("%s", p.address);
printf("请输入新增用户的电话# ");
scanf("%s", p.telephone);
if (IsExist(*ct, &p))
{
printf("%s 已经存在,请不要重复插入!", p.name);
}
else
{
memcpy((*ct)->frinds + (*ct)->size, &p, sizeof(p));
(*ct)->size += 1;
printf("新增用户成功!\n");
}
}
else{
printf("动态开辟内存失败!\n");
}
}
int SearchCore(contact_t *ct, const char* name)
{
assert(ct);
assert(name);
int i = 0;
for (; i < ct->size; i++)
{
person_t *p = ct->frinds + i;
if (strcmp(p->name, name)==0)
{
return i;
}
}
return -1;
}
void SearchFriend(contact_t *ct)
{
assert(ct);
char name[NAME_SIZE];
printf("请输入你要查找联系人的姓名:");
scanf("%s", name);
int i = SearchCore(ct, name);
person_t *p = (ct->frinds + i);
if (i >= 0)
{
printf("查找联系人成功!\n");
printf("|%-10s|%-10s|%-10s|%-10s|%-10s|\n", "姓名", "性别", "年龄", "地址", "电话");
printf("|%-10s|%-10s|%-10d|%-10s|%-10s|\n", p->name, p->sex, p->age, p->address, p->telephone);
}
else{
printf("查找失败!\n");
}
}
void ModFriend(contact_t *ct)
{
assert(ct);
char name[NAME_SIZE];
printf("请输入你要修改联系人的姓名:");
scanf("%s", name);
int i = SearchCore(ct, name);
if (i >= 0)
{
person_t p;
printf("请输入修改后的姓名:");
scanf("%s", p.name);
printf("请输入修改后的性别:");
scanf("%s", p.sex);
printf("请输入修改后的年龄:");
scanf("%d", &p.age);
printf("请输入修改后的地址:");
scanf("%s", p.address);
printf("请输入修改后的电话:");
scanf("%s", p.telephone);
memcpy(ct->frinds + i, &p, sizeof(p));
printf("修改联系人成功!\n");
}
else{
printf("修改失败!\n");
}
}
void DelFriend(contact_t *ct)
{
assert(ct);
char name[NAME_SIZE];
printf("请输入你要删除的联系人:");
scanf("%s", name);
int i = SearchCore(ct, name);
if (i >= 0)
{
ct->frinds[i] = ct->frinds[ct->size - 1];
ct->size--;
printf("删除联系人成功!\n");
}
else
{
printf("删除失败!\n");
}
}
void ShowFriend(contact_t *ct)
{
assert(ct);
printf("\n|size: %6d|cap: %6d|\n\n", ct->size, ct->cap);
printf("|%-10s|%-10s|%-10s|%-10s|%-10s|\n", "姓名", "性别", "年龄", "电话", "地址");
int i = 0;
for (; i < ct->size; i++)
{
person_t *p = ct->frinds + i;
printf("|%-10s|%-10s|%-10d|%-10s|%-10s|\n", p->name, p->sex, p->age, p->telephone, p->address);
}
printf("\n\n");
}
static int cmpPerson(const void *p1, const void *p2)
{
assert(p1);
assert(p2);
person_t *_p1 = (person_t *)p1;
person_t *_p2 = (person_t *)p2;
return strcmp(_p1->name, _p2->name);
}
void SortFriend(contact_t *ct)
{
assert(ct);
qsort(ct->frinds, ct->size, sizeof(person_t), cmpPerson);
printf("联系人排序成功!\n");
}
void SaveContact(contact_t *ct)
{
assert(ct);
FILE *fp = fopen(SAVE_FILE, "wb");
if (fp == NULL)
{
printf("save eror!\n");
return;
}
fwrite(ct, sizeof(contact_t), 1, fp);
fwrite(ct->frinds, sizeof(person_t),ct->size, fp);
printf("保存文件成功!\n");
fclose(fp);
}
void ClearFriend(contact_t *ct)
{
assert(ct);
ct->size = 0;
printf("清除通讯录成功!\n");
}
//main.c
#include "Contact.h"
void ShowMenu()
{
contact_t *ct = NULL;
InitContact(&ct);
int quit = 0;
while (!quit)
{
printf("#######################################################\n");
printf("# 1.Add 2. Del 3.Search #\n");
printf("# 4. Mod 5. Show 6.Clear #\n");
printf("# 7. Sort 0.Exit #\n");
printf("#######################################################\n");
printf("Please Select# ");
int select = 0;
scanf("%d", &select);
switch (select)
{
case 1:
AddFriend(&ct);
break;
case 2:
DelFriend(ct);
break;
case 3:
SearchFriend(ct);
break;
case 4:
ModFriend(ct);
break;
case 5:
ShowFriend(ct);
break;
case 6:
ClearFriend(ct);
break;
case 7:
SortFriend(ct);
break;
case 0:
SaveContact(ct);
quit = 1;
break;
default:
break;
}
}
free(ct);
}
int main()
{
ShowMenu();
return 0;
}
完整版通讯录源代码(2)——最全的功能(二进制文件写入与读取)
猜你喜欢
转载自blog.csdn.net/cfk17829572643/article/details/115143642
今日推荐
周排行