动态通讯录

#ifndef _CONTACT_H_
#define _CONTACT_H_

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <windows.h>

#pragma warning(disable:4996)

#define NAME_SIZE 64
#define TEL_SIZE  16
#define ADDR_SIZE 128
#define LIST_DEFAULT 1
#define INC_SIZE 2

#define CT_FILE "contact.bin"

typedef struct person{
	char name[NAME_SIZE];
	char sex;
	unsigned char age;
	char telphone[TEL_SIZE];
	char address[ADDR_SIZE];
}person_t, *person_p, **person_pp;

typedef struct contact{
	int cap;
	int size;
	person_t list[0];
}contact_t, *contact_p, **contact_pp;


//Init
void InitContact(contact_pp _ctpp);
//Add
void AddPerson(contact_pp ct);

//Del
//Mod
//Search
//Sort
void Sort(contact_p ct);

//Clear
//Show
void Show(contact_p ct);
void Save(contact_p ct);
int Load(contact_pp _ctpp);
#endif

#include "contact.h"

//yes->1,no->0
static int IsFull(contact_p ct)
{
	return ct->size == ct->cap ? 1 : 0;
}
//yes->1, no->0
static int Inc(contact_pp _ctpp)
{
	int new_size = sizeof(contact_t)+((*_ctpp)->cap+INC_SIZE)*sizeof(person_t);
	contact_p p = realloc(*_ctpp, new_size);
	if (!p){
		printf("Inc error!\n");
		return 0;
	}
	p->cap = (*_ctpp)->cap + INC_SIZE;
	*_ctpp = p;
	printf("debug: Inc Contact Sucess!\n");
	return 1;
}
int InitContactFile(contact_pp _ctpp, FILE *fp)
{
	contact_p ct_p = (contact_p)malloc(sizeof(contact_t));
	if (ct_p){
		fread(ct_p, sizeof(contact_t), 1, fp);
		int _cap = ct_p->cap;
		int size = sizeof(contact_t)+ct_p->cap*sizeof(person_t);
		contact_p p = (contact_p)realloc(ct_p, size);
		if (p){
			ct_p = p;
			fread(ct_p->list, ct_p->cap*sizeof(person_t), 1, fp);
			*_ctpp = ct_p;
			return 1;
		}
		else{
			return 0;
		}
	}
	else{
		return 0;
	}
}
void InitContactDefault(contact_pp _ctpp)
{
	//void Load();
	*_ctpp = malloc(sizeof(contact_t)+sizeof(person_t)*LIST_DEFAULT);
	if (NULL == *_ctpp){
		printf("%s: %d\n", strerror(errno), errno);
		exit(1);
	}
	(*_ctpp)->cap = LIST_DEFAULT;
	(*_ctpp)->size = 0;
	printf("debug: Init Contact Sucess!\n");
}
int Load(contact_pp _ctpp)
{
	FILE *fp = fopen(CT_FILE, "rb");
	if (NULL == fp){
		printf("Init Contact Default!\n");
		InitContactDefault(_ctpp);
		return 1;
	}
	int ret = InitContactFile(_ctpp, fp);
	fclose(fp);
	return ret;
}
void Show(contact_p ct)
{
	int top = ct->size;
	int i = 0;
	person_p p = ct->list;
	for (; i < top; i++){
		//姓名、性别、年龄、电话、住址
		printf("|%-6s|%-2c|%-3d|%-12s|%-16s|\n",\
			p[i].name, p[i].sex,p[i].age, p[i].telphone,p[i].address);
	}
}
static int person_cmp(const void *x, const void *y)
{
	person_p _x = (person_p)x;
	person_p _y = (person_p)y;
	return strcmp(_x->name, _y->name);
}
void Sort(contact_p ct)
{
	person_p p = ct->list;
	qsort(p, ct->size, sizeof(person_t), person_cmp);
}

void AddPerson(contact_pp ct)
{
	if (!IsFull(*ct) || Inc(ct)){
		person_p p = &((*ct)->list[(*ct)->size]);
		printf("Please Enter Name: ");
		scanf("%s", p->name);
		printf("Please Enter Sex: ");
		scanf(" %c", &(p->sex));
		printf("Please Enter Age: ");
		scanf(" %u", &(p->age));
		printf("Please Enter Tel: ");
		scanf(" %s", p->telphone);
		printf("Please Enter Addr: ");
		scanf(" %s", p->address);
		((*ct)->size)++;
	}
	else{
		printf("realloc error!\n");
		return;
	}
}

void Save(contact_p ct)
{
	FILE *fp = fopen(CT_FILE, "wb");
	if (NULL == fp){
		printf("fopen error!\n");
		return;
	}
	int size = sizeof(contact_t)+ct->cap * sizeof(person_t);
	fwrite(ct, size, 1, fp);
	fclose(fp);
}
#include "contact.h"

void Menu()
{
	printf("#####################################\n");
	printf("# 1. Show      2. Add      3. Del   #\n");
	printf("# 4. Mod       5. Search   6. Sort  #\n");
	printf("# 7. Clear     8. Save     9. Exit  #\n");
	printf("#####################################\n");
	printf("Please Select: ");
}
int main()
{
	volatile int quit = 0;
	int select = 0;
	contact_p ct;
	Load(&ct);
	while (!quit){
		Menu();
		scanf("%d", &select);
		switch (select){
		case 1:
			Show(ct);
			break;
		case 2:
			AddPerson(&ct);
			break;
		case 3:
			break;
		case 4:
			break;
		case 5:
			break;
		case 6:
			Sort(ct);
			break;
		case 7:
			break;
		case 8:
			break;
		case 9:
			Save(ct);
			quit = 1;
			break;
		default:
			break;
		}
	}
	system("pause");
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值