通讯录:
通讯录可以用来存储多个联系人的信息,每个人的信息包括:
姓名、性别、年龄、电话、住址
提供方法:
1. 添加联系人信息
2. 删除指定联系人信息
3. 查找指定联系人信息
4. 修改指定联系人信息
5. 显示所有联系人信息
6. 清空所有联系人
7. 以名字排序所有联系人
contact.h
#define _CRT_SECURE_NO_DEPRECATE
#ifndef _CONTACT_
#define _CONTACT_
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<malloc.h>
#include<string.h>
#define SIZE 128
typedef struct{
char name[64];
char sex[8];
int age;
char tel[12];
char addr[128];
}man_t, *man_p, **man_pp;
typedef struct _contact{
man_p listp;
int size;
int cap;
}contact_t, *contact_p, **contact_pp;
void init(contact_pp c, int cap); //分配内存
void add(contact_pp c); //添加
void myShow(contact_p c);//显示
void menu();
void destroy(contact_p c); //销毁分配内存
void myDelete(contact_p c, char *name); //删除
void mySearch(contact_p c, char *name); //查找
void myAlter(contact_p c, char *name); //修改
void mySweep(contact_p c); //清除
void mySort(contact_p c); //排序
#endif
contatc.c
#define _CRT_SECURE_NO_DEPRECATE
#include "contact.h"
static int inc(contact_p c)
{
assert(c);
if (c->size == c->cap)
{
c->listp = realloc(c->listp, c->cap + SIZE);
if (NULL == c->listp)
{
perror("realloc");
exit(3);
}
c->cap += SIZE;
printf("inc space....\n");
}
return 1;
}
void init(contact_pp c, int cap)
{
assert(c);
assert(cap);
*c = (contact_p)malloc(sizeof(contact_t));
if (NULL == *c)
{
exit(1);
}
(*c)->listp = (man_p)malloc(sizeof(man_t)*cap);
if (NULL == (*c)->listp)
{
exit(2);
}
(*c)->cap = cap;
(*c)->size = 0;
}
void add(contact_pp c)
{
assert(c);
int i = (*c)->size;
if (inc)
{
printf("请输入姓名和地址:");
scanf("%s %s", ((*c)->listp +i) ->name, ((*c)->listp +i) ->addr);
printf("请输入年龄:");
while (1)
{
scanf("%d", &((*c)->listp + i)->age);
if ((((*c)->listp + i)->age) > 0 && (((*c)->listp + i)->age) < 150)
{
break;
}
printf("你输入年龄有误,请重新输入\n");
}
printf("请输入性别:");
while (1)
{
scanf("%s", ((*c)->listp + i)->sex);
if (!(strcmp((((*c)->listp + i)->sex), "男")) || !(strcmp((((*c)->listp + i)->sex), "女")))
{
break;
}
printf("你输入性别有误,请重新输入(男,女)\n");
}
printf("请输入电话:");
scanf("%s", ((*c)->listp + i)->tel);
(*c)->size++;
}
}
void myShow(contact_p c) //显示
{
assert(c);
man_p src = c->listp;
int i = 0;
for (; i < c->size;i++)
{
printf("联系人%d---------------------\n", i);
printf("名字:%s\n",src->name);
printf("性别:%s\n",src->sex);
printf("年龄:%d\n",src->age);
printf("电话:%s\n",src->tel);
printf("住址:%s\n",src->addr);
src++;
}
}
void menu()
{
printf("#####################################################\n");
printf("################## 通讯录 ####################\n");
printf("################## 1.add ####################\n");
printf("################## 2.delate ####################\n");
printf("################## 3.search ####################\n");
printf("################## 4.alter ####################\n");
printf("################## 5.show_all ####################\n");
printf("################## 6.sweep ####################\n");
printf("################## 7.sort ####################\n");
printf("################## 0.exit ####################\n");
printf("#####################################################\n");
}
void destroy(contact_p c) //销毁分配内存
{
assert(c);
if (c->listp)
{
free(c->listp);
c->listp = NULL;
}
free (c);
c = NULL;
}
void myDelete(contact_p c, char *name) //删除
{
assert(c);
assert(name);
man_p src = c->listp;
int i = 0;
for (; i < c->size;i++)
{
if (0 == strcmp((src+i)->name,name))
{
*(src + i) = *(src + c->size - 1);
c->size--;
printf("删除成功!\n");
break;
}
}
if (i > c->size)
{
printf("%s不存在\n",name);
}
}
void mySearch(contact_p c, char *name)
{
assert(c);
assert(name);
man_p src = c->listp;
int i = 0;
for (; i < c->size; i++)
{
if (0 == strcmp((src)->name, name))
{
printf("名字:%s\n", src->name);
printf("性别:%s\n", src->sex);
printf("年龄:%d\n", src->age);
printf("电话:%s\n", src->tel);
printf("住址:%s\n", src->addr);
break;
}
src++;
}
if (i == c->size)
{
printf("%s不存在\n", name);
}
}
void myAlter(contact_p c, char *name) //修改
{
assert(c);
assert(name);
man_p src = c->listp;
int i = 0;
for (; i < c->size; i++)
{
if (0 == strcmp((src)->name, name))
{
printf("请输入修改后的名字:");
scanf("%s",c->listp->name);
printf("请输入修改后的地址:");
scanf("%s", c->listp->addr);
printf("请输入修改后的性别:");
scanf("%s", c->listp->sex);
printf("请输入修改后的年龄:");
scanf("%d", &c->listp->age);
printf("请输入修改后的电话:");
scanf("%s", c->listp->tel);
break;
}
src++;
}
if (i == c->size)
{
printf("%s不存在\n", name);
}
}
void mySweep(contact_p c) //清除
{
assert(c);
c->size = 0;
printf("全部清除成功\n");
}
int str_cmp(const void * dest,const void * src)
{
return strcmp(((man_p)dest)->name,((man_p)src)->name);
}
void mySort(contact_p c) //排序
{
assert(c);
qsort(c->listp,c->size, sizeof(man_t), str_cmp);
printf("按名字排序完成!\n");
}
main.c
#define _CRT_SECURE_NO_DEPRECATE
#include "contact.h"
main()
{
contact_p person = NULL;
init(&person, SIZE);
int input = 0;
while (1)
{
menu();
printf("请输入选择:>");
scanf("%d", &input);
if (input < 0 || input >7)
{
printf("输入有误!\n");
continue;
}
switch (input)
{
case 0:
{
destroy(person);
exit(0);
break;
}
case 1:
{
add(&person);
break;
}
case 2:
{
char s_name[128];
printf("请输入要删除的姓名:");
scanf("%s",s_name);
myDelete(person, s_name);
break;
}
case 3:
{
char s_name[128];
printf("请输入要查找的姓名:");
scanf("%s", s_name);
mySearch(person, s_name);
break;
}
case 4:
{
char s_name[128];
printf("请输入要修改的姓名:");
scanf("%s", s_name);
myAlter(person, s_name);
break;
}
case 5:
{
myShow(person);
break;
}
case 6:
{
mySweep(person);
break;
}
case 7:
{
mySort(person);
break;
}
/*default:
{
printf("输入有误!\n");
break;
}*/
}
}
system("pause");
return 0;
}