与前面用动态顺序表相比,区别在使用的是静态数组:
实现过程大差不差,具体代码如下:
//Sta_Contact.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#define NAME_MAX 20
#define GENDER_MAX 20
#define TEL_MAX 20
#define ASSR_MAX 20
#define ARR_MAX 100
typedef struct per_infor
{
char name[NAME_MAX];
char gender[GENDER_MAX];
int age;
char tel[TEL_MAX];
char addr[ASSR_MAX];
}SLDataType;
//静态顺序表
typedef struct Contact
{
SLDataType arr[ARR_MAX];
int size;
}Con;
//初始化与销毁
void ConInit(Con* pcon);
void ConDestroy(Con* pcon);
//打印验证
void Print(Con* pcon);
//增加联系人--尾插
void ConAdd(Con* pcon);
//删除联系人--指定姓名删除
void ConDel(Con* pcon);
//寻找是否存在该联系人--通过名字查找
int FindByName(Con* pcon,char* name);
//查找联系人
void ConFind(Con* pcon);
//变更联系人
void ConChange(Con* pcon);
//查看通讯录
void ConCheck(Con* pcon);
// Sta_Contact.c
#include "Sta_Contact.h"
//初始化与销毁
void ConInit(Con* pcon)
{
assert(pcon);
pcon->size = 0;
}
void ConDestroy(Con* pcon)
{
assert(pcon);
pcon->size = 0;
}
//增加联系人--尾插
void ConAdd(Con* pcon)
{
SLDataType info;
assert(pcon);
assert(pcon->size <= ARR_MAX);
printf("请输入联系人姓名:\n");
scanf("%s", info.name);
printf("请输入联系人年龄:\n");
scanf("%d", &info.age);
printf("请输入联系人性别:\n");
scanf("%s", info.gender);
printf("请输入联系人电话:\n");
scanf("%s", info.tel);
printf("请输入联系人住址:\n");
scanf("%s", info.addr);
printf("\n");
pcon->arr[pcon->size] = info;
pcon->size++;
}
//打印验证
void Print(Con* pcon)
{
assert(pcon);
printf("姓名\t性别\t年龄\t电话\t住址\n");
for (int i = 0; i < pcon->size; i++)
{
printf("%s\t", pcon->arr[i].name);
printf("%s\t", pcon->arr[i].gender);
printf("%d\t", pcon->arr[i].age);
printf("%s\t", pcon->arr[i].tel);
printf("%s\t", pcon->arr[i].addr);
printf("\n");
}
printf("\n");
}
//寻找是否存在该联系人--通过名字查找
int FindByName(Con* pcon,char name[])
{
assert(pcon);
for (int i = 0; i < pcon->size; i++)
{
if (strcmp(pcon->arr[i].name, name) == 0)
return i;//返回下标
}
return -1;//不存在该联系人
}
//删除联系人--指定姓名删除
void ConDel(Con* pcon)
{
//先判断是否存在该联系人
//存在就删除
//不存在就不能删除并给出提示
char name[NAME_MAX];
printf("请输入需要删除的联系人:");
scanf("%s", name);
int n = FindByName(pcon, name);
if (n != -1)
{
for (int i = n; i < pcon->size - 1; i++)
{
pcon->arr[i] = pcon->arr[i + 1];
}
pcon->size--;
printf("该联系人删除成功\n\n");
}
else
{
printf("该联系人不存在\n\n");
return;
}
}
//查看通讯录
void ConCheck(Con* pcon)
{
assert(pcon);
printf("姓名\t性别\t年龄\t电话\t住址\n");
for (int i = 0; i < pcon->size; i++)
{
printf("%s\t", pcon->arr[i].name);
printf("%s\t", pcon->arr[i].gender);
printf("%d\t", pcon->arr[i].age);
printf("%s\t", pcon->arr[i].tel);
printf("%s\t", pcon->arr[i].addr);
printf("\n");
}
printf("\n");
}
//查找联系人
void ConFind(Con* pcon)
{
assert(pcon);
char name[NAME_MAX];
printf("请输入需要查找的联系人:");
scanf("%s", name);
int n = FindByName(pcon,name);
if (n != -1)
{
printf("姓名\t性别\t年龄\t电话\t住址\n");
printf("%s\t", pcon->arr[n].name);
printf("%s\t", pcon->arr[n].gender);
printf("%d\t", pcon->arr[n].age);
printf("%s\t", pcon->arr[n].tel);
printf("%s\t", pcon->arr[n].addr);
printf("\n\n");
}
else
{
printf("该联系人不存在\n\n");
}
}
//变更联系人
void ConChange(Con* pcon)
{
assert(pcon);
//查找是否存在该联系人
char name[NAME_MAX];
printf("请输入需要变更的联系人:");
scanf("%s", name);
int n = FindByName(pcon, name);
if (n != -1)
{
SLDataType info;
printf("请输入联系人姓名:\n");
scanf("%s", info.name);
printf("请输入联系人年龄:\n");
scanf("%d", &info.age);
printf("请输入联系人性别:\n");
scanf("%s", info.gender);
printf("请输入联系人电话:\n");
scanf("%s", info.tel);
printf("请输入联系人住址:\n");
scanf("%s", info.addr);
printf("\n");
pcon->arr[n] = info;
}
else
{
printf("该联系人不存在\n\n");
}
}
//Test.c
#include "Sta_Contact.h"
#define CASE break; case
void menu()
{
printf("************************************\n");
printf("****1.增加联系人 2.删除联系人*****\n");
printf("****3.变更联系人 4.查找联系人*****\n");
printf("****5.查看通讯录 0.退出通讯录*****\n");
printf("************************************\n");
}
int main()
{
Con pcon;
ConInit(&pcon);
int op = -1;
do
{
menu();
printf("请输入操作:");
scanf("%d", &op);
switch (op)
{
case 1:
//增加联系人
ConAdd(&pcon);
//Print(&pcon);
CASE 2 :
//删除联系人
ConDel(&pcon);
//Print(&pcon);
CASE 3 :
//变更联系人
ConChange(&pcon);
CASE 4 :
//查找联系人
ConFind(&pcon);
CASE 5 :
//查看通讯录
ConCheck(&pcon);
CASE 0 :
//退出通讯录
printf("退出通讯录中...\n");
break;
default:
{
printf("输入错误,请重新输入!\n");
break;
}
}
} while (op != 0);
//销毁通讯录
ConDestroy(&pcon);
return 0;
}