南宁做自适应网站,手机平台软件开发,简单的个人主页网站制作,如何制作响应式网站前言#xff1a; 我们在上一章节用c语言实现了线性表中的的动态顺序表#xff0c;那么顺序表就只是顺序表吗#xff1f;当然不是#xff0c;使用顺序表结构可以实现很多项目#xff0c;许多项目的数据结构都会用到顺序表#xff0c;本章节我们就要使用顺序表实现一个简易…前言 我们在上一章节用c语言实现了线性表中的的动态顺序表那么顺序表就只是顺序表吗当然不是使用顺序表结构可以实现很多项目许多项目的数据结构都会用到顺序表本章节我们就要使用顺序表实现一个简易的通讯录项目。
准备 由于我们的通讯录是基于动态顺序表实现的所以我们实现这个项目会用到动态顺序表的底层代码。在动态顺序表中有三个文件分别是头文件代码SeqList.h文件包含项目实现代码SeqList文件和测试文件test.c文件我们要在此基础上增加两个文件实现通讯录分别是包含头文件的Contact.h文件和实现代码的Contact.c文件 在上一期的顺序表中我们用一个结构体代表顺序表而里面的arr数组负责存储数据但是它内部存储的数据都是内置类型如intchar类型的数据所以比较简单。在这一期我们要使用这个数组存储自定义类型每个自定义类型都存储了一个联系人的信息这样我们的顺序表就开始变得复杂了起来 通讯录实现 我们说顺序表里存储的不再是内置类型而是自定义类型那么是怎样实现的呢我们使用一个结构体在它内部我们定义一个人的名字性别年龄电话号码家庭地址等信息使用数组存储为了方便更改数组的长度使用#define定义几个常量作为它们的数组长度这个结构体我们将它命名为ConPeoInfo为了方便使用我们用typedef将它改名为Info
#define NAME_MAX 20
#define GENDER_MAX 10
#define TEL_MAX 20
#define ADDR_MAX 100typedef struct ConPeoInfo
{char name[NAME_MAX];char gender[GENDER_MAX];int age;char tel[TEL_MAX];char addr[ADDR_MAX];
}Info;
定了好了自定义类型后我们只需要将需要实现的方法一一实现即可。
通讯录初始化和销毁
通讯录的初始化和销毁我们可以直接调用我们之前在顺序表的初始化方法所以它们实现起来非常的简单。
通讯录初始化
void ContactInit(Contact* con)
{assert(con);SeqInit(con);
}//初始化
通讯录销毁
void ContactDestroy(Contact* con)
{SeqDestroy(con);
}//销毁
在这里我们提一下Contact类型就是SL类型也就是顺序表类型。那么为什么要将它改名为Contact呢contact的中文翻译为联系人而SL也许放在通讯录代码中多数人都不认识只会认为它是一个顺序表所以为了让代码的辨识度更高我们利用前置声明将SeqList类型改为了Contact类型
typedef struct SeqList Contact;
//前置声明
添加联系人 添加联系人是通讯录中最基本的功能。我们用一个Info类型的变量去接收我们要添加的联系人信息再使用顺序表中的尾插方法将这个变量插入通讯录中
void ContactAdd(Contact* con)
{Info cpi;printf(请输入要添加的姓名\n);scanf(%s, cpi.name);printf(请输入要添加的性别\n);scanf(%s, cpi.gender);printf(请输入要添加的年龄\n);scanf(%d, cpi.age);printf(请输入要添加的电话\n);scanf(%s, cpi.tel);printf(请输入要添加的地址\n);scanf(%s, cpi.addr);SeqPushBack(con, cpi);}//添加联系人
当然我们也可以使用其他插入方法如头插指定位置插入。
删除联系人与通过姓名查找 有添加就会有删除删除联系人我们可以先通过查找联系人姓名来确定有没有这个人的信息如果没有就输出没有这个联系人如果有我们就将找到的联系人所在的下标返回然后将这个下标的信息删除。
通过姓名查找联系人
int FindByName(Contact* con, char name[])
{int i 0;for (i 0; i con-size; i){if (strcmp(con-arr[i].name, name) 0){return i;}}return -1;
}
删除联系人
void ContactDel(Contact* con)
{char name[NAME_MAX];printf(请输入要删除的联系人姓名\n);scanf(%s, name);int find FindByName(con, name);if (find 0){printf(没有要删除的联系人数据\n);return;}SLErase(con, find);printf(删除成功\n);
}//删除
删除联系人我们使用了顺序表中的指定位置删除因为我们返回的下标就是我们要删除的联系人所在的下标所以这里我们只能使用指定位置删除这个方法。
修改联系人信息 修改联系人我们同样采用查找联系人姓名的方法先确定有没有我们要修改的联系人信息如果没有就无法修改如果有我们才执行修改操作而修改操作与添加操作相似
void ContactMorify(Contact* con)
{char name[NAME_MAX];printf(请输入要修改的联系人姓名\n);scanf(%s, name);int find FindByName(con, name);if (find 0){printf(通讯录中没有要修改的联系人信息\n);return;}printf(请输入新的姓名\n);scanf(%s, con-arr[find].name);printf(请输入新的性别\n);scanf(%s, con-arr[find].gender);printf(请输入新的年龄\n);scanf(%d, con-arr[find].age);printf(请输入新的电话\n);scanf(%s,con-arr[find].tel);printf(请输入新的地址\n);scanf(%s,con-arr[find].addr);printf(修改成功\n);}//修改
查找联系人
查找联系人则比较简单我们同样使用查找联系人姓名的方法去确定有没有这个联系人如果有我们就把这个联系人的信息全部打印出来
void ContactFind(Contact* con)
{char name[NAME_MAX];printf(请输入要查找的联系人姓名\n);scanf(%s, name);int find FindByName(con, name);if (find 0){printf(要查找的联系人的数据不存在\n);return;}printf(%5s %5s %5s %5s %5s\n, 姓名, 性别, 年龄, 电话, 地址);printf(%s %s %d %s %s\n, con-arr[find].name,con-arr[find].gender,con-arr[find].age,con-arr[find].tel,con-arr[find].addr);
}
展示所有联系人信息
当我们要查看所有联系人信息时我们就可以使用这个方法这个方法也比较简单我们只需要将整个顺序表遍历一遍并将每个联系人的信息全部打印出来
void ContactShow(Contact* con)
{int i 0;printf(%5s %5s %5s %5s %5s\n, 姓名, 性别, 年龄, 电话, 地址);for (i 0; i con-size; i){printf(%s %s %d %s %s\n, con-arr[i].name,con-arr[i].gender,con-arr[i].age,con-arr[i].tel,con-arr[i].addr);}
}//所有联系人 测试通讯录 当实现了这些方法之后我们就可以实现通讯录的界面了创建一个菜单函数我们可以用指定数字来表示我们要执行的操作比如我们要添加联系人我们按数字1就可以开始添加联系人
void menu()
{printf(*************通讯录************\n);printf(****1.添加联系人 2.删除联系人**\n);printf(****3.查找联系人 4.修改联系人**\n);printf(****5.全部联系人 0.退出********\n);printf(*******************************\n);}
我们来看一下菜单 菜单里的输入数字执行操作的功能我们使用switch语句实现
int main()
{Contact con;int op -1;ContactInit(con);do{menu();printf(请选择您要进行的操作\n);scanf(%d, op);switch (op){case 1:ContactAdd(con);break;case 2:ContactDel(con);break;case 3:ContactFind(con);break;case 4:ContactMorify(con);break;case 5:ContactShow(con);break;default:printf(输入错误请重新输入!\n);break;}} while (op ! 0);ContactDestroy(con);//ContactTest01();return 0;
}
到这里我们通讯录所有的代码就已经实现完成了我们来测试一下吧 通过测试发现我们的方法都没有什么问题我将代码放在下面 感兴趣的小伙伴可以试一下哦。
Contact.h :
#pragma once
typedef struct SeqList Contact;
//前置声明#define NAME_MAX 20
#define GENDER_MAX 10
#define TEL_MAX 20
#define ADDR_MAX 100typedef struct ConPeoInfo
{char name[NAME_MAX];char gender[GENDER_MAX];int age;char tel[TEL_MAX];char addr[ADDR_MAX];
}Info;//初始化
void ContactInit(Contact* con);
void ContactAdd(Contact* con);//添加
void ContactDel(Contact* con);//删除
void ContactMorify(Contact* con);//修改void ContactFind(Contact* con);//查找
void ContactShow(Contact* con);//展示
//销毁
void ContactDestroy(Contact* con);
SeqList.h :
#pragma once
#includestdio.h
#includeassert.h
#includestdlib.h
#includeContact.htypedef struct ConPeoInfo SLDataType;
typedef struct SeqList
{SLDataType* arr;int size;//有效数据int capacity;//空间大小}SL;void SeqInit(SL* ps);//初始化void SeqDestroy(SL* ps);//销毁void SeqPushBack(SL* ps, SLDataType x);//尾插void SeqPushFront(SL* ps, SLDataType x);//头插void SeqPopBack(SL* ps);//尾删void SeqPopBack(SL* ps);//头删void SeqPrint(SL* ps);//打印void SLErase(SL* ps, int pos);//指定删除int SLFind(SL* ps, SLDataType x);//查找数据//指定下标前插入数据
void SLInsert(SL* ps, int pop, SLDataType x);
SeqList.c :
#define _CRT_SECURE_NO_WARNINGS 1
#includeSeqList.hvoid SeqInit(SL* ps)
{ps-arr NULL;ps-size ps-capacity 0;
}//初始化void SeqCheckcapa(SL* ps)//检查内存够不够不够则增加
{assert(ps);if (ps-capacity ps-size){int Newcapecity ps-capacity 0 ? 4 : 2 * ps-capacity * sizeof(SLDataType);SLDataType* tem (SLDataType*)realloc(ps-arr, Newcapecity * sizeof(SLDataType));if (tem ! NULL){ps-arr tem;}}
}void SeqPushBack(SL* ps, SLDataType x)
{assert(ps);SeqCheckcapa(ps);ps-arr[ps-size] x;}//尾插void SeqPushFront(SL* ps, SLDataType x)
{assert(ps);SeqCheckcapa(ps);int i 0;for (i ps-size; i 0; i--){ps-arr[i] ps-arr[i - 1];}ps-arr[0] x;ps-size;
}//头插void SeqPopBack(SL* ps)
{assert(ps);assert(ps-size 0);ps-size--;
}//尾删void SeqPopFront(SL* ps)
{assert(ps);assert(ps-size 0);int i 0;for (i 0; i ps-size - 1; i){ps-arr[i] ps-arr[i 1];}ps-size--;}//头删void SLInsert(SL* ps, int pos, SLDataType x)
{assert(ps);assert(pos 0 pos ps-size);SeqCheckcapa(ps);int i 0;for (i ps-size; i pos; i--){ps-arr[i] ps-arr[i - 1];}ps-arr[pos] x;ps-size;}//指定下标前插入数据void SLErase(SL* ps, int pos)
{assert(ps);assert(pos 0 pos ps-size);int i 0;for (i pos; i ps-size - 1; i){ps-arr[i] ps-arr[i 1];}ps-size--;
}//指定下标删除//int SLFind(SL* ps, SLDataType x)
//{
// assert(ps);
// int i 0;
// for (i 0; i ps-size; i)
// {
// if (ps-arr[i] x)
// {
// return i;
// }
// }
// return -1;
//}//查找数据
//void SeqPrint(SL* ps)
//{
// assert(ps);
// int i 0;
//
// for (i 0; i ps-size; i)
// {
// printf(%d , ps-arr[i]);
// }
// printf(\n);
//}//打印void SeqDestroy(SL* ps)
{assert(ps);free(ps-arr);if (ps-arr ! NULL);{ps-arr NULL;}ps-capacity ps-size 0;
}
//销毁Contact.c :
#define _CRT_SECURE_NO_WARNINGS 1
#includeSeqList.h
#includeContact.h
#includestring.hvoid ContactInit(Contact* con)
{assert(con);SeqInit(con);
}//初始化
int FindByName(Contact* con, char name[])
{int i 0;for (i 0; i con-size; i){if (strcmp(con-arr[i].name, name) 0){return i;}}return -1;
}void ContactAdd(Contact* con)
{Info cpi;printf(请输入要添加的姓名\n);scanf(%s, cpi.name);printf(请输入要添加的性别\n);scanf(%s, cpi.gender);printf(请输入要添加的年龄\n);scanf(%d, cpi.age);printf(请输入要添加的电话\n);scanf(%s, cpi.tel);printf(请输入要添加的地址\n);scanf(%s, cpi.addr);SeqPushBack(con, cpi);}//添加联系人void ContactDel(Contact* con)
{char name[NAME_MAX];printf(请输入要删除的联系人姓名\n);scanf(%s, name);int find FindByName(con, name);if (find 0){printf(没有要删除的联系人数据\n);return;}SLErase(con, find);printf(删除成功\n);
}//删除void ContactMorify(Contact* con)
{char name[NAME_MAX];printf(请输入要修改的联系人姓名\n);scanf(%s, name);int find FindByName(con, name);if (find 0){printf(通讯录中没有要修改的联系人信息\n);return;}printf(请输入新的姓名\n);scanf(%s, con-arr[find].name);printf(请输入新的性别\n);scanf(%s, con-arr[find].gender);printf(请输入新的年龄\n);scanf(%d, con-arr[find].age);printf(请输入新的电话\n);scanf(%s,con-arr[find].tel);printf(请输入新的地址\n);scanf(%s,con-arr[find].addr);printf(修改成功\n);}//修改
void ContactFind(Contact* con)
{char name[NAME_MAX];printf(请输入要查找的联系人姓名\n);scanf(%s, name);int find FindByName(con, name);if (find 0){printf(要查找的联系人的数据不存在\n);return;}printf(%5s %5s %5s %5s %5s\n, 姓名, 性别, 年龄, 电话, 地址);printf(%s %s %d %s %s\n, con-arr[find].name,con-arr[find].gender,con-arr[find].age,con-arr[find].tel,con-arr[find].addr);
}
void ContactShow(Contact* con)
{int i 0;printf(%5s %5s %5s %5s %5s\n, 姓名, 性别, 年龄, 电话, 地址);for (i 0; i con-size; i){printf(%s %s %d %s %s\n, con-arr[i].name,con-arr[i].gender,con-arr[i].age,con-arr[i].tel,con-arr[i].addr);}
}//所有联系人
void ContactDestroy(Contact* con)
{SeqDestroy(con);
}//销毁
test.c :
#define _CRT_SECURE_NO_WARNINGS 1
#includeSeqList.h
#includeContact.h
void menu()
{printf(*************通讯录************\n);printf(****1.添加联系人 2.删除联系人**\n);printf(****3.查找联系人 4.修改联系人**\n);printf(****5.全部联系人 0.退出********\n);printf(*******************************\n);}
int main()
{Contact con;int op -1;ContactInit(con);do{menu();printf(请选择您要进行的操作\n);scanf(%d, op);switch (op){case 1:ContactAdd(con);break;case 2:ContactDel(con);break;case 3:ContactFind(con);break;case 4:ContactMorify(con);break;case 5:ContactShow(con);break;default:printf(输入错误请重新输入!\n);break;}} while (op ! 0);ContactDestroy(con);//ContactTest01();return 0;
} 文章转载自: http://www.morning.pqypt.cn.gov.cn.pqypt.cn http://www.morning.klltg.cn.gov.cn.klltg.cn http://www.morning.sypby.cn.gov.cn.sypby.cn http://www.morning.sjmxh.cn.gov.cn.sjmxh.cn http://www.morning.c7623.cn.gov.cn.c7623.cn http://www.morning.nlqgb.cn.gov.cn.nlqgb.cn http://www.morning.nlglm.cn.gov.cn.nlglm.cn http://www.morning.wkwds.cn.gov.cn.wkwds.cn http://www.morning.ryfpx.cn.gov.cn.ryfpx.cn http://www.morning.ghxkm.cn.gov.cn.ghxkm.cn http://www.morning.dpdr.cn.gov.cn.dpdr.cn http://www.morning.bfycr.cn.gov.cn.bfycr.cn http://www.morning.mfct.cn.gov.cn.mfct.cn http://www.morning.kkysz.cn.gov.cn.kkysz.cn http://www.morning.jcyyh.cn.gov.cn.jcyyh.cn http://www.morning.nzzws.cn.gov.cn.nzzws.cn http://www.morning.rltsx.cn.gov.cn.rltsx.cn http://www.morning.fglzk.cn.gov.cn.fglzk.cn http://www.morning.gtylt.cn.gov.cn.gtylt.cn http://www.morning.hytfz.cn.gov.cn.hytfz.cn http://www.morning.qsy41.cn.gov.cn.qsy41.cn http://www.morning.zpzys.cn.gov.cn.zpzys.cn http://www.morning.qrwjb.cn.gov.cn.qrwjb.cn http://www.morning.mnbgx.cn.gov.cn.mnbgx.cn http://www.morning.zxhpx.cn.gov.cn.zxhpx.cn http://www.morning.hhxpl.cn.gov.cn.hhxpl.cn http://www.morning.rqkzh.cn.gov.cn.rqkzh.cn http://www.morning.dlhxj.cn.gov.cn.dlhxj.cn http://www.morning.hsrpr.cn.gov.cn.hsrpr.cn http://www.morning.bgnkl.cn.gov.cn.bgnkl.cn http://www.morning.ftgwj.cn.gov.cn.ftgwj.cn http://www.morning.dwyyf.cn.gov.cn.dwyyf.cn http://www.morning.hilmwmu.cn.gov.cn.hilmwmu.cn http://www.morning.jwwfk.cn.gov.cn.jwwfk.cn http://www.morning.hmwjk.cn.gov.cn.hmwjk.cn http://www.morning.hpkr.cn.gov.cn.hpkr.cn http://www.morning.ftrpvh.cn.gov.cn.ftrpvh.cn http://www.morning.mrxgm.cn.gov.cn.mrxgm.cn http://www.morning.gwsdt.cn.gov.cn.gwsdt.cn http://www.morning.pfgln.cn.gov.cn.pfgln.cn http://www.morning.sxmbk.cn.gov.cn.sxmbk.cn http://www.morning.tkjh.cn.gov.cn.tkjh.cn http://www.morning.nktgj.cn.gov.cn.nktgj.cn http://www.morning.yhrfg.cn.gov.cn.yhrfg.cn http://www.morning.ykswq.cn.gov.cn.ykswq.cn http://www.morning.nyqm.cn.gov.cn.nyqm.cn http://www.morning.jkfyt.cn.gov.cn.jkfyt.cn http://www.morning.gassnw.com.gov.cn.gassnw.com http://www.morning.wqkzf.cn.gov.cn.wqkzf.cn http://www.morning.lwbhw.cn.gov.cn.lwbhw.cn http://www.morning.zrpys.cn.gov.cn.zrpys.cn http://www.morning.gpkjx.cn.gov.cn.gpkjx.cn http://www.morning.btns.cn.gov.cn.btns.cn http://www.morning.mnccq.cn.gov.cn.mnccq.cn http://www.morning.jfgmx.cn.gov.cn.jfgmx.cn http://www.morning.mknxd.cn.gov.cn.mknxd.cn http://www.morning.jmtrq.cn.gov.cn.jmtrq.cn http://www.morning.ssqwr.cn.gov.cn.ssqwr.cn http://www.morning.hcgbm.cn.gov.cn.hcgbm.cn http://www.morning.lfbzg.cn.gov.cn.lfbzg.cn http://www.morning.nggry.cn.gov.cn.nggry.cn http://www.morning.xprq.cn.gov.cn.xprq.cn http://www.morning.rxnl.cn.gov.cn.rxnl.cn http://www.morning.skrh.cn.gov.cn.skrh.cn http://www.morning.a3e2r.com.gov.cn.a3e2r.com http://www.morning.knrgb.cn.gov.cn.knrgb.cn http://www.morning.jtwck.cn.gov.cn.jtwck.cn http://www.morning.mhxlb.cn.gov.cn.mhxlb.cn http://www.morning.lbxhy.cn.gov.cn.lbxhy.cn http://www.morning.xxwl1.com.gov.cn.xxwl1.com http://www.morning.rwnx.cn.gov.cn.rwnx.cn http://www.morning.kycxb.cn.gov.cn.kycxb.cn http://www.morning.dmzzt.cn.gov.cn.dmzzt.cn http://www.morning.tktyh.cn.gov.cn.tktyh.cn http://www.morning.ckfyp.cn.gov.cn.ckfyp.cn http://www.morning.dschz.cn.gov.cn.dschz.cn http://www.morning.xzrbd.cn.gov.cn.xzrbd.cn http://www.morning.bpmfn.cn.gov.cn.bpmfn.cn http://www.morning.pfmsh.cn.gov.cn.pfmsh.cn http://www.morning.dqpnd.cn.gov.cn.dqpnd.cn