1.SeqList.h
#pragma once
#include <stdio.h>
#include<assert.h>
#include<stdlib.h>
#include "Contact.h"
#define INIT_CAPACITY 4
//动态顺序表 按需申请
typedef PI SLDatetype;
typedef struct SeqList
{
SLDatetype* a;
int size;//有效数据个数
int capacity;//空间容量
}SL;
//增删查改
void SeqInit(SL* s);
void SeqDestroy(SL* s);
void SLPushBack(SL* ps, SLDatetype x);
void SLPopBack(SL* ps);
void SLPushFront(SL* ps, SLDatetype x);
void SLPopFront(SL* ps);
void SLCheckCapacity(SL* ps);
void SLInsert(SL* ps, int pose, SLDatetype x);
void SLErase(SL* ps, int pose);
2.SeqList.c
#define _CRT_SECURE_NO_WARNINGS
#include"SeqList.h"
#include<assert.h>
//扩容
void SLCheckCapacity(SL* ps)
{
assert(ps);
if (ps->size == ps->capacity)
{
SLDatetype* tmp = (SLDatetype*)realloc(ps->a, sizeof(SLDatetype) * ps->capacity * 2);
if (tmp == NULL)
{
perror("realloc fail");
return;
}
ps->a = tmp;
ps->capacity *= 2;
}
}
//顺序表初始化
void SeqInit(SL* ps)
{
ps->a = (SLDatetype*)malloc(sizeof(SLDatetype) * INIT_CAPACITY);
if (ps->a == NULL)
{
perror("malloc fail");
return;
}
ps->size = 0;
ps->capacity = INIT_CAPACITY;
}
//顺序表销毁
void SeqDestroy(SL* ps)
{
free(ps->a);
ps->a = NULL;
ps->size = ps->capacity = 0;
}
//尾插
void SLPushBack(SL* ps, SLDatetype x)
{
assert(ps);
//扩容
SLCheckCapacity(ps);
ps->a[ps->size++] = x;
}
//尾删
void SLPopBack(SL* ps)
{
//温柔检查
/*if (ps->size == 0)
return;*/
//暴力检查
assert(ps->size > 0);
ps->size--;
}
//头插
void SLPushFront(SL* ps, SLDatetype x)
{
assert(ps->a);
SLCheckCapacity(ps);
int end = ps->size - 1;
while (end >= 0)
{
ps->a[end + 1] = ps->a[end];
--end;
}
ps->a[0] = x;
ps->size++;
}
//中间插入
void SLInsert(SL* ps, int pose, SLDatetype x)
{
assert(ps);
assert(pose >= 0 && pose <= ps->size);
SLCheckCapacity(ps);
int end = ps->size - 1;
while (end >= pose)
{
ps->a[end + 1] = ps->a[end];
--end;
}
ps->a[pose] = x;
ps->size++;
}
//中间删除
void SLErase(SL* ps, int pose)
{
assert(ps);
assert((pose >= 0) && (pose < ps->size));
int begin = pose + 1;
while (begin < ps->size)
{
ps->a[begin - 1] = ps->a[begin];
++begin;
}
ps->size--;
}
//尾删
void SLPopFront(SL* ps)
{
assert(ps);
assert(ps->size > 0);
int begin = 1;
while (begin < ps->size)
{
ps->a[begin - 1] = ps->a[begin];
++begin;
}
ps->size--;
}
3.Contact.c
#define _CRT_SECURE_NO_WARNINGS
#include"Contact.h"
#include"SeqList.h"
//通讯录的初始化
void ContactInit(Contact* con)
{
//实际上要进行的是顺序表的初始化
//顺序表的初始化已经实现好了
SeqInit(con);
}
//通讯录的销毁
void ContactDestroy(Contact* con)
{
SeqDestroy(con);
}
//通讯录添加数据
void ContactAdd(Contact* con)
{
//获取用户输入的内容:姓名+性别+年龄+电话+地址
PI info;
printf("请输入要添加的联系人的姓名\n");
scanf("%s", info.name);
printf("请输入要添加的联系人的姓别\n");
scanf("%s", info.gender);
printf("请输入要添加的联系人的年龄\n");
scanf("%d", &info.age);
printf("请输入要添加的联系人的电话\n");
scanf("%s", info.tel);
printf("请输入要添加的联系人的住址\n");
scanf("%s", info.addr);
//往通讯录中添加联系人数据
//头插尾插都可以
SLPushBack(con, info);
}
//通过名字查找联系人
int FindName(Contact* con, char name[])
{
for (int i = 0; i < con->size;i++)
{
if (0 == strcmp(con->a[i].name, name))
{
//找到了
return i;
}
}
//没有找到
return -1;
}
//通讯录删除数据
void ContactDel(Contact* con)
{
//要删除的数据必须存在才能删除
//查找
char name[NAME_MAX];
printf("请输入要删除的联系人的姓名:\n");
scanf("%s",name);
int find = FindName(con, name);
if (find < 0)
{
printf("要删除的联系人数据不存在\n");
return;
}
//要删除的联系人存在----->知道了要删除的联系人对应的下标
SLErase(con, find);
printf("删除成功\n");
}
void ContactShow(Contact* con)
{
//表头:姓名 性别 年龄 电话 地址
printf("%s %s %s %s %s\n","姓名","性别","年龄","电话","地址");
//遍历通讯录,按照格式打印每个联系人数据
for (int i = 0; i < con->size; i++)
{
printf("%s %s %d %s %s\n",
con->a[i].name,
con->a[i].gender,
con->a[i].age,
con->a[i].tel,
con->a[i].addr
);
}
}
//通讯录的修改
void ContactModify(Contact* con)
{
//要修改的联系人数据存在
char name[NAME_MAX];
printf("请输入要删除的联系人的姓名:\n");
scanf("%s",name);
int find = FindName(con, name);
if (find < 0)
{
printf("要删除的联系人数据不存在\n");
return;
}
//直接修改
printf("请输入新的联系人的姓名\n");
scanf("%s", con->a[find].name);
printf("请输入新的联系人的姓别\n");
scanf("%s", con->a[find].gender);
printf("请输入新的联系人的年龄\n");
scanf("%d", &con->a[find].age);
printf("请输入新的联系人的电话\n");
scanf("%s", con->a[find].tel);
printf("请输入新的联系人的住址\n");
scanf("%s", con->a[find].addr);
printf("修改成功\n");
}
//查找联系人
void ContactFind(Contact* con)
{
char name[NAME_MAX];
printf("请输入要查找的联系人的姓名:\n");
scanf("%s", name);
int find = FindName(con, name);
if (find < 0)
{
printf("要查找的联系人数据不存在\n");
return;
}
//直接打印
printf("%s %s %d %s %s\n",
con->a[find].name,
con->a[find].gender,
con->a[find].age,
con->a[find].tel,
con->a[find].addr
);
}
4.Contact.h
#pragma once
#define NAME_MAX 20
#define GENDER_MAX 10
#define TEL_MAX 20
#define ADDR_MAX 100
#include<string.h>
//定义联系人数据结构
//姓名 年龄 性别 电话 地址
typedef struct PersonInfo
{
char name[NAME_MAX];
char gender[GENDER_MAX];
int age;
char tel[TEL_MAX];
char addr[ADDR_MAX];
}PI;
struct SeqList;
//给顺序表改个名字,叫通讯录
typedef struct SeqList Contact;
//通讯录的初始化
void ContactInit(Contact* con);
//通讯录的销毁
void ContactDestroy(Contact* con);
//通讯录添加数据
void ContactAdd(Contact* con);
//通讯录删除数据
void ContactDel(Contact* con);
//通讯录的修改
void ContactModify(Contact* con);
//通讯录查找
void ContactFind(Contact* con);
//通讯录数据展示
void ContactShow(Contact* con);
#define _CRT_SECURE_NO_WARNINGS
#include"SeqList.h"
#include"Contact.h"
void menu()
{
printf("*******************************\n");
printf("****** 通讯录 ******\n");
printf("****** 1.添加 2.删除 ******\n");
printf("****** 3.查找 4.修改 ******\n");
printf("****** 5.阅览 6.清空 ******\n");
printf("****** 0.退出 ******\n");
printf("*******************************\n");
}
//void ContactTest()
//{
// Contact con;//创建的通讯录对象,实际上是顺序表对象,等价于SL
// ContactInit(&con);
// ContactDestroy(&con);
// ContactAdd(&con);
//}
int main(void)
{
Contact con;
ContactInit(&con);
int input;
do
{
menu();
printf("请选择:--->\n");
scanf("%d", &input);
switch (input)
{
case 1:
ContactAdd(&con); //增加
break;
case 2:
ContactDel(&con); //删除
break;
case 3:
ContactFind(&con); //查找
break;
case 4:
ContactModify(& con); //修改
break;
case 5:
ContactShow(&con); //显示
break;
case 6:
ContactDestroy(&con); //销毁
break;
default:
printf("选择错误");
break;
}
} while (input);
return 0;
}