前言
这是我自己做的第三个小项目---通讯录项目。后期我会继续制作其他小项目并开源至博客上。
上一小项目是猜数字游戏,没看过的同学可以去看看:
有关猜数字游戏的小项目
https://blog.csdn.net/hsy1603914691/article/details/142302049?spm=1001.2014.3001.5502
目标
1. 通过实战项目巩固自己对数据结构中顺序表的理解。
2. 制作一个通讯录,实现增添、删减、查找、打印、修改联系人的目的。
contact.h文件
#define _CRT_SECURE_NO_WARNINGS #define name_lenth 20 #define gander_num 10 #define telephone_num 20 #define address_num 20 #define MAX 100 #include <stdio.h> #include <assert.h> #include <stdlib.h> #include <string.h> #include <windows.h> //定义成员信息结构体 typedef struct PerInfo { char name[name_lenth]; char sex[gander_num]; int age; char tele[telephone_num]; char addr[address_num]; }PerInfo; //定义顺序表结构体 typedef struct Contact { PerInfo data[MAX]; int size; }Contact; //打印菜单 void nume(); //创建通讯录1 void ContactInit(Contact* con); //销毁通讯录 void ContactDestory(Contact* con); //增添联系人1 void ContactAdd(Contact* con); //删除联系人1 void ContactDelete(Contact* con); //修改联系人1 void ContactChange(Contact* con); //查找联系人1 void ContactSearch(Contact* con); //展示通讯录所有联系人1 void ContactShow(Contact* con);
1. 在 contact.h 文件中,我们存放结构体和函数的声明,以及各种库的引用。
2. 在定义成员信息结构体时,我们使用大量宏定义,方便我们后期修改、扩容等。
3. 我们这里创建的是定容的通讯录,使用的是静态顺序表。
contact.c文件
#include "contact.h" //菜单函数 void nume() { printf("*******************************\n"); printf("********通讯录管理系统*********\n"); printf("***1.add************2.delete***\n"); printf("***3.search*********4.change***\n"); printf("***5.show**********6.destory***\n"); printf("***********0.exit**************\n"); printf("*******************************\n"); return; } //创建通讯录 void ContactInit(Contact* con) { assert(con); con->size = 0; memset(con->data, 0, sizeof(con->data)); return; } //增添联系人 void ContactAdd(Contact* con) { assert(con); if (con->size == MAX) { printf("通讯录已满,需要进一步扩容!\n"); return; } else { printf("请输入名字:"); scanf("%s", con->data[con->size].name); printf("请输入年龄:"); scanf("%d", &(con->data[con->size].age)); printf("请输入性别:"); scanf("%s", con->data[con->size].sex); printf("请输入电话:"); scanf("%s", con->data[con->size].tele); printf("请输入地址:"); scanf("%s", con->data[con->size].addr); con->size++; printf("增加成功\n"); } return; } //删除联系人 void ContactDelete(Contact* con) { assert(con); if (con->size == 0)//先要看通讯录是否为空 { printf("通讯录为空,无法删除\n"); return; } printf("请输入要删除人的名字:"); char name[100] = { 0 }; scanf("%s", name); for ( int i = 0; i < con->size; i++) { if (strcmp(con->data[i].name, name) == 0)//对比数据是否相同 { for (int n = i; n< con->size; n--) { con->data[n] = con->data[n - 1]; } con->size--; printf("删除成功\n"); } } printf("查无此人!\n"); return; } //展示通讯录所有联系人 void ContactShow(Contact* con) { assert(con); if (con->size == 0) { printf("还未存放任何通讯录成员!\n"); return; } else { int i = 0; printf("%-15s%-5s%-5s%-12s%-30s%\n", "名字", "年龄", "性别", "电话", "地址"); for (i = 0; i < con->size; i++) { printf("%-15s%-5d%-5s%-12s%-30s%\n",con->data[i].name, con->data[i].age, con->data[i].sex, con->data[i].tele, con->data[i].addr); } printf("打印完成\n"); } return; } //查找联系人 void ContactSearch(Contact* con) { assert(con); printf("请输入你要查找的联系人姓名!"); char name[20] = { 0 }; scanf("%s", name); int i = 0; for (i = 0; i < con->size; i++) { if (strcmp(con->data[i].name, name) == 0)//对比数据是否相同 { printf("确实有此人!\n"); printf("这个人在通讯录中的序号是:%d\n", i); printf("%-15s%-5d%-5s%-12s%-30s%\n", con->data[i].name, con->data[i].age, con->data[i].sex, con->data[i].tele, con->data[i].addr); return; } } printf("查无此人!\n"); return; } //修改联系人 void ContactChange(Contact* con) { assert(con); char name[100]; printf("请输入要修改人的名字:"); scanf("%s", name); for (int i = 0; i < con->size; i++) { if (strcmp(con->data[i].name, name) == 0)//对比数据是否相同 { printf("请输入名字:"); scanf("%s", con->data[i].name); printf("请输入年龄:"); scanf("%d", &(con->data[con->size].age)); printf("请输入性别:"); scanf("%s", con->data[i].sex); printf("请输入电话:"); scanf("%s", con->data[i].tele); printf("请输入地址:"); scanf("%s", con->data[i].addr); printf("修改成功!\n"); } } printf("查无此人!\n"); return; } //销毁通讯录 void ContactDestory(Contact* con) { assert(con); con->size = 0; memset(con->data, 0, sizeof(con->data)); }
1. 在 contact.c 文件中,我们存放各种函数的实现。
2. 我们使用指针来接受通讯录结构体,使用地址传值。
3. 在后期,我们需要不断的改进函数,使得我们的通讯录更加直接美观。
test.c文件
#include "contact.h" int main() { system("title 通讯录"); int input = 0; Contact con; ContactInit(&con); printf("This is a contact list made by HSY."); do { Sleep(2000); system("cls"); nume(); printf("请输入你的选择:"); scanf("%d", &input); switch (input) { case 1: ContactAdd(&con); break; case 2: ContactDelete(&con); break; case 3: ContactSearch(&con); break; case 4: ContactChange(&con); break; case 5: ContactShow(&con); break; case 6: ContactDestory(&con); break; case 0: printf("已经退出通讯录!\n"); break; default: printf("输入有问题,请重新输入:\n"); break; } } while (input); return 0; }
1. 在 test.c 文件中,我们存放主函数,通过switch选择结构来实现。
2. 后期我们也需要在这里补充各种小细节,如:Sleep(2000);system("cls");等,来完善这个项目。
致谢
感谢您花时间阅读这篇文章!如果您对本文有任何疑问、建议或是想要分享您的看法,请不要犹豫,在评论区留下您的宝贵意见。每一次互动都是我前进的动力,您的支持是我最大的鼓励。期待与您的交流,让我们共同成长,探索技术世界的无限可能!