通讯录2
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>
#include<string.h>struct contacts
{char name[20];int age;char gender[10];char phone[12];char address[40];
};
typedef struct contacts ABDataType;typedef struct AddressBook
{ABDataType* c;int size;int capacity;
}AB;//初始化
void ABInit(AB* p);//添加联系人
void ABAdd(AB* p, ABDataType* q);//打印通讯录
void ABPrint(AB* p);//删除联系人
void ABDele(AB* p, int n);//排序联系人
void ABSort(AB* p, int n);//查找联系人
int ABFind(AB* p, char* q);//修改联系人
void ABModify(AB* p, ABDataType* q, int n);//打印某个联系人
void ABPrint2(AB* p, int n);
#define _CRT_SECURE_NO_WARNINGS#include"ABook.h"
//初始化
void ABInit(AB*p)
{assert(p);p->c = (ABDataType*)malloc(sizeof(ABDataType)*4);p->capacity = 4;p->size = 0;
}//增容函数
bool ADDcapacity(AB* p)
{assert(p);ABDataType* tmp = p->c;tmp= (ABDataType*)realloc(tmp,sizeof(ABDataType)*p->capacity*2);if (tmp == NULL)return false;p->c = tmp;p->capacity = p->capacity * 2;return true;
}//添加联系人
void ABAdd(AB* p, ABDataType*q)
{assert(p);assert(q);if (p->size == p->capacity){//增容并判断是否增容成功assert(ADDcapacity(p));}p->c[p->size]= *q;p->size++;
}//打印通讯录
void ABPrint(AB* p)
{assert(p);int i = 0;if (p->size == 0)printf("通讯录为空!");printf("|姓名 |年龄|性别 |电话 |地址\n");for (i = 0; i < p->size; i++){printf("|%-20s|%-4d|%-10s|%-12s|%-40s", p->c[i].name, p->c[i].age, p->c[i].gender, p->c[i].phone, p->c[i].address);printf("\n");}
}//打印某个联系人
void ABPrint2(AB* p, int n)
{assert(p);printf("|姓名 |年龄|性别 |电话 |地址\n");printf("|%-20s|%-4d|%-10s|%-12s|%-40s", p->c[n].name, p->c[n].age, p->c[n].gender, p->c[n].phone, p->c[n].address);printf("\n");
}//删除联系人
void ABDele(AB* p, int n)
{int i = n;for (i = n; i < p->size - 1; i++){p->c[i] = p->c[i + 1];}p->size--;
}void ABQSort(AB* p, int left, int right)
{if (left >= right)return 0;int prev = left;int next = left + 1;int keyi = left;while (next <= right){if (strcmp(p->c[next].name, p->c[keyi].name) < 0 && ++prev != next){ABDataType tmp = p->c[next];p->c[next] = p->c[prev];p->c[prev] = tmp;}next++;}ABDataType tmp = p->c[keyi];p->c[keyi] = p->c[prev];p->c[prev] = tmp;keyi = prev;ABQSort(p, left, keyi - 1);ABQSort(p, keyi + 1, right);
}//排序联系
void ABSort(AB* p,int n)
{assert(p);ABQSort(p, 0, n - 1);
}//查找联系人
int ABFind(AB* p, char*q)
{assert(p);assert(q);int i = 0;for (i = 0; i < p->size; i++){if (strcmp(p->c[i].name, q) == 0)return i;}return -1;
}//修改联系人
void ABModify(AB* p, ABDataType* q,int n)
{assert(p);assert(q);p->c[n] = *q;
}