测试环境:vs2013
address_list.h文件
#ifndef _ADDRESS_LIST_H_
#define _ADDRESS_LIST_H_
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#pragma warning(disable:4996)
typedef struct A DataType;
typedef struct AddList
{
DataType *arr;
int capacity;//总空间大小
int size;//有效元素个数
}AddList, *PAddList;
struct A
{
char name[20];
char sex[5];
int age;
char number[12];//因为电话一般为11位,int在32位机器下存不下
//因为scanf输入字符串会默认加'\0',所以为了使用strcmp函数,数组多申请
char address[50];
};
void InitLinkman(PAddList ps, int capacity);//对联系人列表初始化
void CheckCapacity(PAddList ps);//对联系人列表空间扩容
void AddLinkman(PAddList ps);//添加联系人
void DeleLinkman(PAddList ps);//删除联系人
void FindLinkman(PAddList ps);//查找来联系人
void AlterLinkman(PAddList ps);//修改联系人
void ShowLinkman(PAddList ps);//打印联系人信息
void SortName(PAddList ps);
#endif
address_list.c文件
#include "address_list.h"
static void print_Linkman(PAddList ps, int i)
{
printf("%d\n姓名:%s\n性别:%s\n年龄:%d\n电话:%s\n住址:%s\n",
i, (ps->arr + i)->name, (ps->arr + i)->sex, (ps->arr + i)->age, (ps->arr + i)->number, (ps->arr + i)->address);
}
void InitLinkman(PAddList ps, int capacity)
{
if (NULL == ps)//说明联系人列表不存在
return;
ps->arr = (DataType *)malloc(sizeof(DataType)*capacity);
if (ps->arr == NULL)
{
printf("申请空间失败!!!\n");
return;
}
ps->capacity = capacity;
ps->size = 0;
}
void CheckCapacity(PAddList ps)
{
if (NULL == ps)
return;
ps->arr = (DataType *)realloc(ps->arr, (sizeof(DataType)*(ps->capacity) * 2));//扩增至原空间二倍
if (ps->arr == NULL)
{
printf("申请空间失败!!!\n");
return;
}
ps->capacity = 2 * ps->capacity;//申请空间成功
}
void AddLinkman(PAddList ps)
{
if (NULL == ps)
return;
if (ps->size == ps->capacity)//说明空间已满
CheckCapacity(ps);//对原空间进行扩容
//动态顺序表的尾插
printf("请输入联系人姓名>\n");
scanf("%s", (ps->arr+ps->size)->name);
printf("请输入联系人性别>\n");
scanf("%s", (ps->arr + ps->size)->sex);
printf("请输入联系人年龄>\n");
scanf("%d", &((ps->arr + ps->size)->age));
printf("请输入联系人电话号码>\n");
scanf("%s", (ps->arr + ps->size)->number);
printf("请输入联系人地址>\n");
scanf("%s", (ps->arr + ps->size)->address);
ps->size++;//添加成功
}
static void menu(int num)//这里的参数是为了区分不同函数的menu
{
if (num == 1)
printf("请输入要删除联系人的信息(至少为姓名、性别、年龄、电话、住址中的一项)\n");
else if (num == 0)
printf("请输入要查找联系人的信息(至少为姓名、性别、年龄、电话、住址中的一项)\n");
else if (num == 2)
printf("请输入要修改联系人的信息(至少为姓名、性别、年龄、电话、住址中的一项)\n");
printf("*******************\n");
printf("***0.exit 1.姓名***\n");
printf("***2.性别 3.年龄***\n");
printf("***4.电话 5.住址 ***\n");
}
void DeleLinkman(PAddList ps)
{
int i = 0;
int input = 0;
if (NULL == ps)
return;
if (ps->size == 0)
{
printf("对不起,通讯录已空\n");
return;
}
do
{
menu(1);
scanf("%d", &input);
switch (input)
{
case 0:
break;
case 1:
{
char n[20];
printf("请输入联系人姓名\n");
scanf("%s", n);
for (i = 0; i < ps->size; i++)
{
if (strcmp((ps->arr+i)->name, n) == 0)//说明找到要删除的联系人
{
int j = i;//就是从i位置删除元素
for (; j < ps->size - 1; j++)
{
ps->arr[i] = ps->arr[i + 1];//将后面的元素一个一个朝前移
}
ps->size--;//删除成功
printf("已删除!\n");
return;
}
}
printf("对不起,该联系人不存在!\n");
}
break;
case 2:
{
char n[5];
printf("请输入联系人性别\n");
scanf("%s", n);
for (i = 0; i < ps->size; i++)
{
if (strcmp((ps->arr + i)->sex, n) == 0)
{
int j = i;
for (; j < ps->size - 1; j++)
{
ps->arr[i] = ps->arr[i + 1];//将后面的元素一个一个朝前移
}
ps->size--;//删除成功
printf("已删除!\n");
return;
}
}
printf("对不起,该联系人不存在!\n");
}
break;
case 3:
{
int n = 0;
printf("请输入联系人年龄\n");
scanf("%d", &n);
for (i = 0; i < ps->size; i++)
{
if ((ps->arr + i)->age == n)
{
int j = i;//就是从i位置删除元素
for (; j < ps->size - 1; j++)
{
ps->arr[i] = ps->arr[i + 1];//将后面的元素一个一个朝前移
}
ps->size--;//删除成功
printf("已删除!\n");
return;
}
}
printf("对不起,该联系人不存在!\n");
}
break;
case 4:
{
char n[12];
printf("请输入联系人电话\n");
scanf("%s", n);
for (i = 0; i < ps->size; i++)
{
if (strcmp((ps->arr + i)->number, n))//说明找到要删除的联系人
{
int j = i;//就是从i位置删除元素
for (; j < ps->size - 1; j++)
{
ps->arr[i] = ps->arr[i + 1];//将后面的元素一个一个朝前移
}
ps->size--;//删除成功
printf("已删除!\n");
return;
}
}
printf("对不起,该联系人不存在!\n");
}
break;
case 5:
{
char n[50];
printf("请输入联系人住址\n");
scanf("%s", n);
for (i = 0; i < ps->size; i++)
{
if (strcmp((ps->arr + i)->address, n))//说明找到要删除的联系人
{
int j = i;//就是从i位置删除元素
for (; j < ps->size - 1; j++)
{
ps->arr[i] = ps->arr[i + 1];//将后面的元素一个一个朝前移
}
ps->size--;//删除成功
printf("已删除!\n");
return;
}
}
printf("对不起,该联系人不存在!\n");
}
break;
default :
printf("输入错误,请重新输入\n");
break;
}
} while (input);
}
void FindLinkman(PAddList ps)
{
int i = 0;
int input = 0;
if (NULL == ps)
return;
if (ps->size == 0)
{
printf("对不起,通讯录已空\n");
return;
}
do
{
menu(0);
scanf("%d", &input);
switch (input)
{
case 0:
break;
case 1:
{
char n[20];
printf("请输入联系人姓名\n");
scanf("%s", n);
for (i = 0; i < ps->size; i++)
{
if (strcmp((ps->arr + i)->name, n) == 0)//说明找到要删除的联系人
{
print_Linkman(ps, i);
return;
}
}
printf("对不起,该联系人不存在!\n");
}
break;
case 2:
{
char n[5];
printf("请输入联系人性别\n");
scanf("%s", n);
for (i = 0; i < ps->size; i++)
{
if (strcmp((ps->arr + i)->sex, n) == 0)
{
print_Linkman(ps, i);
return;
}
}
printf("对不起,该联系人不存在!\n");
}
break;
case 3:
{
int n = 0;
printf("请输入联系人年龄\n");
scanf("%d", &n);
for (i = 0; i < ps->size; i++)
{
if ((ps->arr + i)->age == n)
{
print_Linkman(ps, i);
return;
}
}
printf("对不起,该联系人不存在!\n");
}
break;
case 4:
{
char n[12];
printf("请输入联系人电话\n");
scanf("%s", n);
for (i = 0; i < ps->size; i++)
{
if (strcmp((ps->arr + i)->number, n))//说明找到要删除的联系人
{
print_Linkman(ps, i);
return;
}
}
printf("对不起,该联系人不存在!\n");
}
break;
case 5:
{
char n[50];
printf("请输入联系人住址\n");
scanf("%s", n);
for (i = 0; i < ps->size; i++)
{
if (strcmp((ps->arr + i)->address, n))//说明找到要删除的联系人
{
print_Linkman(ps, i);
return;
}
}
printf("对不起,该联系人不存在!\n");
}
break;
default:
printf("输入错误,请重新输入\n");
break;
}
} while (input);
}
void AlterLinkman(PAddList ps)
{
int i = 0;
int input = 0;
do
{
menu(2);
scanf("%d", &input);
switch (input)
{
case 0:
break;
case 1:
{
char n[20];
printf("请输入需要修改联系人的姓名\n");
scanf("%s", n);
for (i = 0; i < ps->size; i++)
{
if (strcmp((ps->arr + i)->name, n))//说明找到要删除的联系人
{
printf("请输入修改后联系人的姓名\n");
scanf("%s", (ps->arr + i)->name);
printf("修改后的信息为>\n");
print_Linkman(ps, i);
return;
}
}
printf("对不起,该联系人不存在!\n");
}
break;
case 2:
{
char n[5];
printf("请输入联系人性别\n");
scanf("%s", n);
for (i = 0; i < ps->size; i++)
{
if (strcmp((ps->arr + i)->sex, n))//说明找到要删除的联系人
{
printf("请输入修改后联系人的性别\n");
scanf("%s", (ps->arr + i)->sex);
printf("修改后的信息为>\n");
print_Linkman(ps, i);
return;
}
}
printf("对不起,该联系人不存在!\n");
}
break;
case 3:
{
int n = 0;
printf("请输入联系人年龄\n");
scanf("%d", &n);
for (i = 0; i < ps->size; i++)
{
if ((ps->arr + i)->age == n)//说明找到要删除的联系人
{
printf("请输入修改后联系人的年龄\n");
scanf("%d", &((ps->arr + i)->age));
printf("修改后的信息为>\n");
print_Linkman(ps, i);
return;
}
}
printf("对不起,该联系人不存在!\n");
}
break;
case 4:
{
char n[12];
printf("请输入联系人电话\n");
scanf("%s", n);
for (i = 0; i < ps->size; i++)
{
if (strcmp((ps->arr + i)->number, n))//说明找到要删除的联系人
{
printf("请输入修改后联系人电话\n");
scanf("%s", (ps->arr + i)->number);
printf("修改后的信息为>\n");
print_Linkman(ps, i);
return;
}
}
printf("对不起,该联系人不存在!\n");
}
break;
case 5:
{
char n[50];
printf("请输入联系人住址\n");
scanf("%s", n);
for (i = 0; i < ps->size; i++)
{
if (strcmp((ps->arr + i)->address, n))//说明找到要删除的联系人
{
printf("请输入修改后联系人的地址\n");
scanf("%s", (ps->arr + i)->address);
printf("修改后的信息为>\n");
print_Linkman(ps, i);
return;
}
}
printf("对不起,该联系人不存在!\n");
}
break;
default:
printf("输入错误,请重新输入\n");
break;
}
} while (input);
}
void ShowLinkman(PAddList ps)
{
int i = 0;
if (NULL == ps)
return;
if (ps->size == 0)
{
printf("对不起,通讯录为空\n");
return;
}
for (; i < ps->size; i++)
{
print_Linkman(ps, i);
}
}
void SortName(PAddList ps)
{
int i = 0;
if (NULL == ps)
return;
if (ps->size == 0)
{
printf("联系人列表为空!!!\n");
return;
}
for (i = 0; i < ps->size-1; i++)
{
int j = 0;
for (j = 0; j < ps->size - i - 1; j++)
{
if (strcmp((ps->arr + j)->name, (ps->arr + j + 1)->name) > 0)//这里是从小到大排序,如果进去,交换结构体变量
{
DataType obj;
obj = *(ps->arr + j);
*(ps->arr + j) = *(ps->arr + j + 1);
*(ps->arr + j + 1) = obj;
}
}
}
}
test.c文件
#include <stdio.h>
#include <windows.h>
#include "address_list.h"
#pragma warning(disable:4996)
static void menu()
{
printf("*****************************\n");
printf("******0.exit 1.Add *******\n");
printf("******2.Delete 3.Find *******\n");
printf("******4.Alter 5.Show *******\n");
printf("******6.Empty 7.Sort *******\n");
printf("******************************\n");
}
int main()
{
int input = 0;
int capacity = 3;
AddList List;
PAddList ps = &List;
InitLinkman(ps, capacity);//先将结构体数组中的成员flag全都初始化为0,表示空,都可以存信息
do
{
menu();
scanf("%d", &input);
switch (input)
{
case 0:
break;
case 1:
AddLinkman(ps);
break;
case 2:
DeleLinkman(ps);
break;
case 3:
FindLinkman(ps);//查找指定联系信息
break;
case 4:
AlterLinkman(ps);//修改联系人
break;
case 5:
ShowLinkman(ps);//显示所有联系人
break;
case 6:
InitLinkman(ps, capacity);
break;
case 7:
SortName(ps);//以名字排序所有联系人
break;
default:
printf("选择错误\n");
}
} while (input);
system("pause");
return 0;
}