contact.h
#pragma warning (disable:4996)
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#pragma once
#define DFL_NUM 5
#define INC_NUM 1
typedef struct person{ // 联系人
char name[32];
char sex[8];
int age;
char telephone[16];
char address[64];
}person_t;
typedef struct contact{ //通讯录
int cap; //当前总容量
int size; //当前的有效个数
person_t persons[0];
}contact_t;
extern void Menu();
extern void InitContact(contact_t **ctp); //初始化
extern void DestroyContact(contact_t **ctp);//释放内存
extern void AddPerson(contact_t **ctp);//添加联系人
extern void DelPerson(contact_t *ct);//删除联系人
extern void SearchPerson( contact_t *ct);//查找联系人
extern void ModPerson(contact_t *ct);//修改联系人
extern void PrintContact( contact_t *ct);//显示所有联系人
extern void ClearContact(contact_t *ct);//清空通讯录
extern void SortContact(contact_t *ct);//排序联系人(按姓名)
extern void SaveFile(const contact_t *ct);
contact.c
#include "contact.h"
static int Isfull(contact_t *ct){
return (ct->size == ct->cap);
}
int Inc(contact_t **ctp){ //扩容成功 :1 扩容失败:0
contact_t *ct = (contact_t *)realloc(*ctp,sizeof(contact_t)+sizeof(person_t)*((*ctp)->cap+INC_NUM));
if (NULL == ct){
perror("realloc");
exit(1);
}
ct->cap = (*ctp)->cap + INC_NUM;
ct->size = (*ctp)->size;
*ctp = ct;
printf("当前容量%d",(*ctp) ->cap);
return 1;
}
static int FindPerson(contact_t *ct, char name[32]){
person_t *p = ct->persons;
for (int i = 0; i < ct->size;i++){
if (strcmp(name,(p+i)->name) == 0){
return i;
}
}
return -1;
}
static int NameCompar(const void *xp,const void *yp){
const person_t *x_p = (const person_t *)xp;
const person_t *y_p = (const person_t *)yp;
return strcmp(x_p->name,y_p->name);
}
void InitContact(contact_t **ctp){ //初始化
FILE *fp = fopen("contact.txt","rb");
if (NULL == fp){
*ctp = (contact_t *)malloc(sizeof(contact_t)+DFL_NUM*sizeof(person_t));
if (*ctp == NULL){
perror("malloc");
exit(1);
}
(*ctp)->cap = DFL_NUM;
(*ctp)->size = 0;
printf("默认初始化...\n");
}
else{
contact_t t;
fread(&t,sizeof(contact_t),1,fp);
(*ctp) = (contact_t *)malloc(sizeof(contact_t)+sizeof(person_t)*DFL_NUM);
if (NULL == *ctp){
perror("malloc");
exit(1);
}
fread((*ctp)->persons, sizeof(person_t), t.size, fp);
//sizeof(person_t)每个元素大小
//t.size 元素个数
(*ctp)->cap = t.cap;
(*ctp)->size = t.size;
fclose(fp);
printf("文件载入...\n");
}
}
void AddPerson(contact_t **ctp){
if (!Isfull(*ctp) || Inc(ctp)){
//1.没满,直接进来
//2.满了,扩容后
/*contact_t *ct = *ctp;*/
person_t *p = (*ctp)->persons + (*ctp)->size;
printf("请输入联系人姓名");
scanf("%s", p->name);
printf("请输入联系人性别");
scanf("%s", p->sex);
printf("请输入联系人年龄");
scanf("%d", &p->age);
printf("请输入联系人电话");
scanf("%s", p->telephone);
printf("请输入联系人住址");
scanf("%s", p->address);
(*ctp)->size++;
}
printf("Add person success!!\n");
}
void DelPerson(contact_t *ct){
char name[32] = { 0 };
printf("请输入要删除联系人的名字");
scanf("%s", name);
int num = FindPerson(ct, name);
if (num < 0){
printf("未找到此联系人\n");
return;
}
memmove(ct->persons + num, ct->persons + ct->size - 1, sizeof(person_t));
ct->size--;
printf("删除[%s] ... 成功\n", name);
}
void SearchPerson(contact_t *ct){
printf("请输入查找联系人的姓名#");
char name[32] = {0};
person_t *p = ct->persons;
scanf("%s",name);
int i = FindPerson(ct,name);
if (i < 0){
printf("没找到此人\n");
}
printf("|%-10s|%-4s|%-3d|%-11s|%8s|\n", (p+i)->name, (p + i)->sex, (p + i)->age, (p + i)->telephone, (p + i)->address);
}
void ModPerson(contact_t *ct){
printf("请输入修改联系人的姓名#");
char name[32] = { 0 };
person_t *p = ct->persons;
scanf("%s", name);
int i = FindPerson(ct, name);
if (i < 0){
printf("没找到此人\n");
}
printf("修改姓名");
scanf("%s", (p + i)->name);
printf("修改性别");
scanf("%s", (p + i)->sex);
printf("修改年龄");
scanf("%d", &((p + i)->age));
printf("修改电话");
scanf("%s", (p + i)->telephone);
printf("修改住址");
scanf("%s", (p + i)->address);
printf("修改 [%s] 信息成功!!",name);
}
void PrintContact(contact_t *ct){
person_t *p = ct->persons;
int i = 0;
while (i<ct->size){
printf("|%-10s|%-4s|%-3d|%-11s|%8s|\n", (p+i)->name, (p+i)->sex, (p+i)->age, (p+i)->telephone, (p+i)->address);
i++;
}
printf("\n");
}
void ClearContact(contact_t *ct){
ct->size = 0;
printf("已清零!!");
}
void SortContact(contact_t *ct){
//按照姓名排序
/*void qsort(void* base, size_t num, size_t size,
int(*compar)(const void*, const void*));*/
qsort(ct->persons,ct->size,sizeof(person_t),NameCompar);
printf("排序完成\n");
}
void SaveFile(const contact_t * ct){
FILE *fp = fopen("contact.txt","wb");
if (NULL == fp){
perror("fopen");
return;
}
fwrite(ct,sizeof(contact_t),1,fp);
fwrite(ct->persons, sizeof(person_t), ct->size, fp);
fclose(fp);
}
void DestroyContact(contact_t **ctp){
free(*ctp);
(*ctp) = NULL;
printf("Destory contact success!!\n");
}
main.c
#include "contact.h"
void Menu(){
printf("+------------------------+\n");
printf("|--1.Add 2.Delete --|\n");
printf("|--3.Serch 4.Modify --|\n");
printf("|--5.Show 6.Clear --|\n");
printf("|--7.Sort 0.Exit --|\n");
printf("+------------------------+\n");
}
int main()
{
contact_t *ct = NULL;
InitContact(&ct);
Menu();
int select = 0;
int quit = 0;
while (!quit){
printf("Please select#");
scanf("%d", &select);
switch (select){
case 1:
AddPerson(&ct);
break;
case 2:
DelPerson(ct);
break;
case 3:
SearchPerson(ct);
break;
case 4:
ModPerson(ct);
break;
case 5:
PrintContact(ct);
break;
case 6:
ClearPerson(ct);
break;
case 7:
SortContact(ct);
break;
case 0:
quit = 1;
SaveContact(ct);
break;
default:
printf("Select again...");
break;
}
}
DestroyContact(&ct);
printf("Bye Bye!!!");
return 0;
}
谢谢浏览