通讯录(动态修改大小以及文件保存)

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;


}

谢谢浏览

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值