利用线性表实现通讯录,实际上就是将线性表中数组的类型改成结构体
在通讯录中,依次放入姓名、年龄、性别、电话号码、地址,
size表示数组中实际元素的个数,capacity表示数组的容量。
#define NAME_MAX 100
#define GENDER_MAX 10
#define TEL_MAX 12
#define ADDR_MAX 100
//通讯录数据类型
typedef struct PersonInfo
{
char name[NAME_MAX];
int age;
char gender[GENDER_MAX];
char tel[TEL_MAX];
char addr[ADDR_MAX];
}Info;
typedef Info SLDataType;
typedef struct Con
{
SLDataType* a;
int size;
int capacity;
}Con;
与线性表的初始化是一样的
void ContactInit(Con* pcon)
{
pcon->a = (SLDataType*)malloc(4 * sizeof(SLDataType));
if (pcon->a == NULL)
{
printf("内存申请失败\n");
exit(-1);
}
pcon->size = 0;
pcon->capacity = 4;
}
与线性表的销毁是一样的
void ContactDesTroy(Con* pcon)
{
if (pcon->a)
{
free(pcon->a);
}
pcon->a = NULL;
pcon->size = pcon->capacity = 0;
}
依次输入结构体中的每个成员,如何放进结构体数组中
注意这里同样需要检查数组是否满了,满了则需要扩容
void ContactCheck(Con* pcon)//检查是否满了
{
assert(pcon);
if (pcon->size == pcon->capacity)
{
pcon->capacity *= 2;
pcon->a = (SLDataType*)realloc(pcon->a, sizeof(SLDataType) * pcon->capacity);
if (pcon->a == NULL)
{
printf("扩容失败\n");
exit(-1);
}
}
}
void ContactAdd(Con* pcon)
{
assert(pcon);
ContactCheck(pcon);
SLDataType inf;
printf("请输入姓名:");
scanf("%s", inf.name);
printf("请输入年龄:");
scanf("%d", &inf.age);
printf("请输入性别:");
scanf("%s", inf.gender);
printf("请输入电话:");
scanf("%s", inf.tel);
printf("请输入住址:");
scanf("%s", inf.addr);
pcon->a[pcon->size] = inf;
pcon->size++;
}
这里是根据联系人的姓名来删除,所以可以直接写一个函数来搜索联系人
int ContactSearchName(Con* pcon,char name[])
{
int i = 0;
for (i = 0; i < pcon->size; i++)
{
if (strcmp(pcon->a[i].name, name) == 0)
{
return i;
}
}
return -1;
}
void ContactDel(Con* pcon)
{
printf("请输入要删除的联系人姓名:");
char name[NAME_MAX];
scanf("%s", name);
int ret = ContactSearchName(pcon, name);
if (ret == -1)
{
printf("未找到联系人\n");
}
else
{
for (int i = ret; i < pcon->size-1; i++)
{
pcon->a[i] = pcon->a[i + 1];
}
pcon->size--;
}
}
这里也需要用到搜索联系人的函数
void ContactModify(Con* pcon)
{
printf("请输入要修改的联系人姓名:");
char name[NAME_MAX];
scanf("%s", name);
int ret = ContactSearchName(pcon, name);
if (ret == -1)
{
printf("未找到联系人\n");
}
else
{
SLDataType inf;
printf("请输入姓名:");
scanf("%s", inf.name);
printf("请输入年龄:");
scanf("%d", &inf.age);
printf("请输入性别:");
scanf("%s", inf.gender);
printf("请输入电话:");
scanf("%s", inf.tel);
printf("请输入住址:");
scanf("%s", inf.addr);
pcon->a[ret] = inf;
}
}
void ContactPrintOne(Con* pcon, int i)
{
printf("%s ", pcon->a[i].name);
printf("%d ", pcon->a[i].age);
printf("%s ", pcon->a[i].gender);
printf("%s ", pcon->a[i].tel);
printf("%s\n", pcon->a[i].addr);
}
void ContactFind(Con* pcon)
{
printf("请输入联系人姓名:");
char name[NAME_MAX];
scanf("%s", name);
int ret = ContactSearchName(pcon, name);
if (ret == -1)
{
printf("未找到联系人\n");
}
else
{
ContactPrintOne(pcon, ret);
}
}
遍历数组,将里面的信息都打印出来
void ContactShow(Con* pcon)
{
assert(pcon);
int i = 0;
for (i = 0; i < pcon->size; i++)
{
printf("%s ", pcon->a[i].name);
printf("%d ", pcon->a[i].age);
printf("%s ", pcon->a[i].gender);
printf("%s ", pcon->a[i].tel);
printf("%s\n", pcon->a[i].addr);
}
}