静态通讯录的实现:增(add)删(del)查(search)改(modify)、显示(show)、清空(empty)、排序(sort)、退出(exit)。
1>创建一个结构体S1,结构体内容包括了一些基本信息,(姓名、性别、年龄、电话、住址)
2>创建一个结构体S2,内容包含了利用S1创建的结构体数组和整形变量sz。
注:(这样做的目的是为了简洁直观,因为sz变量的存在是为了记录通讯录的相关操作,可以直观的看出来记录的数量,如果改用全局变量sz,看起来太过零散,代码可读性太差。)
3>分别对各个函数进行定义。
代码如下。
text.c
#include"contact1.h"
void test()
{
int input = 0;
Contact con;
InitCon(&con);//初始化结构体数组
do
{
menu();
printf("请选择>");
scanf("%d", &input);
switch (input)
{
case 1:
add(&con);
break;
case 2:
del(&con);
break;
case 3:
search(&con);
break;
case 4:
modify(&con);
break;
case 5:
show(&con);
break;
case 6:
empty(&con);
break;
case 7:
sort(&con);
break;
case 8:
input = 0;
break;
default:
break;
}
} while (input);
}
int main()
{
test();
system("pause");
return 0;
}
contact.c
#include"contact1.h"
void InitCon(pCon p)
{
assert(p);
memset(p->data, 0, sizeof(p->data));
p->sz = 0;
}
void menu()
{
printf("\n******************************\n");
printf("****1.add 2.del ****\n");
printf("****3.search 4.modify****\n");
printf("****5.show 6.empty ****\n");
printf("****7.sort 8.exit ****\n");
printf("******************************\n");
}
void add(pCon p)
{
if (p->sz == MAX)
printf("通讯录已满");
else
{
printf("请您输入姓名>");
scanf("%s", p->data[p->sz].name);
printf("请您输入年龄>");
scanf("%d", &p->data[p->sz].age);
printf("请您输入性别>");
scanf("%s", p->data[p->sz].sex);
printf("请您输入点话>");
scanf("%s", p->data[p->sz].tel);
printf("请您输入地址>");
scanf("%s", p->data[p->sz].addr);
p->sz++;
}
}
void del(pCon p)
{
char s[20];
int i;
if (p->sz == 0)
printf("通讯录为空");
else
{
printf("请输入要删除联系人的姓名>");
scanf("%s", s);
for (i = 0; i < p->sz; i++)
{
if (strcmp(s, p->data[i].name) == 0)//如果找到了,就把所有的往前挪动一个。
{
for (; i < p->sz-1; i++)
{
p->data[i] = p->data[i + 1];
}
p->sz--;//sz减一,假装已经把最后一个删除了!
}
}
if (i == p->sz)
printf("没找到该联系人!");
}
}
void search(pCon p)
{
char s[20];
int i;
printf("请输入要查找联系人的姓名>");
scanf("%s", s);
for (i = 0; i < p->sz; i++)
{
if (strcmp(s, p->data[i].name) == 0)//找到了
{
printf("%8s\t%3d\t%5s\t%13s\t%20s\t\n", p->data[i].name, p->data[i].age, p->data[i].sex,
p->data[i].tel, p->data[i].addr);
break;
}
}
if (i == p->sz)
printf("没找到该联系人!");
}
void modify(pCon p)
{
char s[20];
int i;
printf("请输入要更改联系人的姓名>");
scanf("%s", s);
for (i = 0; i < p->sz; i++)
{
if (strcmp(s, p->data[i].name) == 0)//找到了
{
printf("请您输入更改后的姓名>");
scanf("%s", p->data[i].name);
printf("请您输入更改后的年龄>");
scanf("%d", &p->data[i].age);
printf("请您输入更改后的性别>");
scanf("%s", p->data[i].sex);
printf("请您输入更改后的点话>");
scanf("%s", p->data[i].tel);
printf("请您输入更改后的地址>");
scanf("%s", p->data[i].addr);
break;
}
}
if (i == p->sz)
printf("没找到该联系人!");
}
void show(pCon p)
{
int i;
printf("%8s\t%3s\t%5s\t%13s\t%20s\n","name", "age", "sex", "tel", "addr");
for (i = 0; i < p->sz; i++)
{
printf("%8s\t%3d\t%5s\t%13s\t%20s\t\n", p->data[i].name, p->data[i].age, p->data[i].sex,
p->data[i].tel, p->data[i].addr);
}
}
void empty(pCon p)
{
p->sz = 0;
}
int name_sort(const void*c1,const void*c2)
{
return strcmp((((Peoinfor*)c1)->name), (((Peoinfor*)c2)->name));
}
int age_sort(const void*c1, const void*c2)
{
return(((Peoinfor*)c1)->age) - (((Peoinfor*)c2)->age);
}
void sort(pCon p)
{
int input = 0;
printf("请选择排序方式>\n");
printf("_____1.姓名排序_____\n_____2.年龄排序_____\n");
do
{
scanf("%d", &input);
switch (input)
{
case 1:
qsort(p->data, p->sz, sizeof(p->data[0]), name_sort);
input = 0;
break;
case 2:
qsort(p->data, p->sz, sizeof(p->data[0]),age_sort);
input = 0;
break;
default:
break;
}
} while (input);
}
contact.h
#ifndef CONTACT_H
#define CONTACT_H
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
#define NAME 20
#define SEX 5
#define TEL 15
#define ADDR 20
#define MAX 100
typedef struct Peoinfor
{
char name[NAME];
int age;
char sex[SEX];
char tel[TEL];
char addr[ADDR];
}Peoinfor;
typedef struct Contact
{
Peoinfor data[MAX];
int sz;
}Contact, *pCon;
void InitCon(pCon con);
void menu();
void add(pCon con);
void del(pCon con);
void search(pCon con);
void modify(pCon con);
void show(pCon con);
void empty(pCon con);
void sort(pCon con);
#endif
下面列出部分测试图,其他功能大家可以自行测试。
1.添加联系人
2.删除联系人
3.打印联系人列表后退出
感觉很多地方还是有不熟悉,花费了好几个小时才码出这个静态通讯录,对结构体的理解和应用还是不深,以后还得多加练习,加油~