当前位置: 首页 > news >正文

【数据结构】利用单链表再实现通讯录

在之前顺序表的实现中,我们利用了顺序表实现了通讯录,基于上篇文章学习了单链表,本篇文章将介绍如何利用单链表再实现通讯录。

1. 结构体用户数据

实现结构体的函数:

//⽤⼾数据
typedef struct PersonInfo
{char name[NAME_MAX];char sex[SEX_MAX];int age;char tel[TEL_MAX];char addr[ADDR_MAX];
}PeoInfo;

2. 通讯录数据导入

实现将历史数据导入通讯录的函数:

void LoadContact(contact** con) 
{FILE* pf = fopen("contact.txt", "rb");if (pf == NULL) {perror("fopen error!\n");return;}//循环读取⽂件数据PeoInfo info;while (fread(&info, sizeof(info), 1, pf)){SLTPushBack(con, info);}printf("历史数据导⼊通讯录成功!\n");
}

3. 通讯录数据初始化

实现通讯录数据初始化的函数:

void InitContact(contact** con) 
{LoadContact(con);//把本地的通讯录数据导⼊到链表结构
}

4. 添加通讯录数据

实现添加通讯录数据的函数:

void AddContact(contact** con) 
{PeoInfo info;printf("请输⼊姓名:\n");scanf("%s", &info.name);printf("请输⼊性别:\n");scanf("%s", &info.sex);printf("请输⼊年龄:\n");scanf("%d", &info.age);printf("请输⼊联系电话:\n");scanf("%s", &info.tel);printf("请输⼊地址:\n");scanf("%s", &info.addr);SLTPushBack(con, info);printf("插⼊成功!\n");
}

 5. 删除通讯录数据

实现删除通讯录数据的函数:

contact* FindByName(contact* con, char name[]) 
{contact* cur = con;while (cur){if (strcmp(cur->data.name, name) == 0) {return cur;}cur = cur->next;}return NULL;
}void DelContact(contact** con) 
{char name[NAME_MAX];printf("请输⼊要删除的⽤⼾姓名:\n");scanf("%s", name);contact* pos = FindByName(*con, name);if (pos == NULL) {printf("要删除的⽤⼾不存在,删除失败!\n");return;}SLTErase(con, pos);printf("删除成功!\n");
}

 6. 展现通讯录数据

实现展现通讯录数据的函数:

void ShowContact(contact* con) 
{printf("%-10s %-4s %-4s %15s %-20s\n", "姓名", "性别", "年龄", "联系电话", "地址");contact* cur = con;while (cur){printf("%-10s %-4s %-4d %15s %-20s\n",cur->data.name,cur->data.sex,cur->data.age,cur->data.tel,cur->data.addr);cur = cur->next;}
}

 7. 查找通讯录数据

实现查找通讯录数据的函数:

void FindContact(contact* con) 
{char name[NAME_MAX];printf("请输⼊要查找的⽤⼾姓名:\n");scanf("%s", name);contact* pos = FindByName(con, name);if (pos == NULL) {printf("要查找的⽤⼾不存在,查找失败!\n");return;}printf("查找成功!\n");printf("%-10s %-4s %-4d %15s %-20s\n",pos->data.name,pos->data.sex,pos->data.age,pos->data.tel,pos->data.addr);
}

 8. 修改通讯录数据

实现修改通讯录数据的函数:

void ModifyContact(contact** con) 
{char name[NAME_MAX];printf("请输⼊要修改的⽤⼾名称:\n");scanf("%s", &name);contact* pos = FindByName(*con, name);if (pos == NULL) {printf("要查找的⽤⼾不存在,修改失败!\n");return;}printf("请输⼊要修改的姓名:\n");scanf("%s", pos->data.name);printf("请输⼊要修改的性别:\n");scanf("%s", pos->data.sex);printf("请输⼊要修改的年龄:\n");scanf("%d", &pos->data.age);printf("请输⼊要修改的联系电话:\n");scanf("%s", pos->data.tel);printf("请输⼊要修改的地址:\n");scanf("%s", pos->data.addr);printf("修改成功!\n");
}

 9. 保存通讯录数据

实现保存通讯录数据的函数:

 void SaveContact(contact* con) {FILE* pf = fopen("contact.txt", "wb");if (pf == NULL) {perror("fopen error!\n");return;}//将通讯录数据写⼊⽂件contact* cur = con;while (cur){fwrite(&(cur->data), sizeof(cur->data), 1, pf);cur = cur->next;}printf("通讯录数据保存成功!\n");}

 10. 销毁通讯录数据

实现销毁通讯录数据的函数:

void DestroyContact(contact** con) 
{SaveContact(*con);//在通讯录销毁之前,先把历史数据保存到本地⽂件中contact.txtSListDesTroy(con);
}

最后附上全部代码 :

//contact.h
#pragma once
#define NAME_MAX 100
#define SEX_MAX 4
#define TEL_MAX 11
#define ADDR_MAX 100//前置声明
typedef struct SListNode contact;//⽤⼾数据
typedef struct PersonInfo
{char name[NAME_MAX];char sex[SEX_MAX];int age;char tel[TEL_MAX];char addr[ADDR_MAX];
}PeoInfo;//初始化通讯录
void InitContact(contact** con);//实际调⽤的是链表的初始化接⼝(可以简单做⼀个头结点的
初始化)//添加通讯录数据
void AddContact(contact** con);// 链表尾插/头插//删除通讯录数据
void DelContact(contact** con);//链表的删除指定位置的数据//展⽰通讯录数据
void ShowContact(contact* con);//链表的打印//查找通讯录数据
void FindContact(contact* con);//修改通讯录数据
void ModifyContact(contact** con);//销毁通讯录数据
void DestroyContact(contact** con);
//contact.c
#define _CRT_SECURE_NO_WARNINGS
#include"contact.h"
#include"SList.h"//部分函数上篇文章讲过可以直接用void LoadContact(contact** con) 
{FILE* pf = fopen("contact.txt", "rb");if (pf == NULL) {perror("fopen error!\n");return;}//循环读取⽂件数据PeoInfo info;while (fread(&info, sizeof(info), 1, pf)){SLTPushBack(con, info);}printf("历史数据导⼊通讯录成功!\n");
}void InitContact(contact** con) 
{LoadContact(con);//把本地的通讯录数据导⼊到链表结构
}void AddContact(contact** con) 
{PeoInfo info;printf("请输⼊姓名:\n");scanf("%s", &info.name);printf("请输⼊性别:\n");scanf("%s", &info.sex);printf("请输⼊年龄:\n");scanf("%d", &info.age);printf("请输⼊联系电话:\n");scanf("%s", &info.tel);printf("请输⼊地址:\n");scanf("%s", &info.addr);SLTPushBack(con, info);printf("插⼊成功!\n");
}contact* FindByName(contact* con, char name[]) 
{contact* cur = con;while (cur){if (strcmp(cur->data.name, name) == 0) {return cur;}cur = cur->next;}return NULL;
}void DelContact(contact** con) 
{char name[NAME_MAX];printf("请输⼊要删除的⽤⼾姓名:\n");scanf("%s", name);contact* pos = FindByName(*con, name);if (pos == NULL) {printf("要删除的⽤⼾不存在,删除失败!\n");return;}SLTErase(con, pos);printf("删除成功!\n");
}void ShowContact(contact* con) 
{printf("%-10s %-4s %-4s %15s %-20s\n", "姓名", "性别", "年龄", "联系电话", "地址");contact* cur = con;while (cur){printf("%-10s %-4s %-4d %15s %-20s\n",cur->data.name,cur->data.sex,cur->data.age,cur->data.tel,cur->data.addr);cur = cur->next;}
}void FindContact(contact* con) 
{char name[NAME_MAX];printf("请输⼊要查找的⽤⼾姓名:\n");scanf("%s", name);contact* pos = FindByName(con, name);if (pos == NULL) {printf("要查找的⽤⼾不存在,查找失败!\n");return;}printf("查找成功!\n");printf("%-10s %-4s %-4d %15s %-20s\n",pos->data.name,pos->data.sex,pos->data.age,pos->data.tel,pos->data.addr);
}void ModifyContact(contact** con) 
{char name[NAME_MAX];printf("请输⼊要修改的⽤⼾名称:\n");scanf("%s", &name);contact* pos = FindByName(*con, name);if (pos == NULL) {printf("要查找的⽤⼾不存在,修改失败!\n");return;}printf("请输⼊要修改的姓名:\n");scanf("%s", pos->data.name);printf("请输⼊要修改的性别:\n");scanf("%s", pos->data.sex);printf("请输⼊要修改的年龄:\n");scanf("%d", &pos->data.age);printf("请输⼊要修改的联系电话:\n");scanf("%s", pos->data.tel);printf("请输⼊要修改的地址:\n");scanf("%s", pos->data.addr);printf("修改成功!\n");
}void SaveContact(contact* con) {FILE* pf = fopen("contact.txt", "wb");if (pf == NULL) {perror("fopen error!\n");return;}//将通讯录数据写⼊⽂件contact* cur = con;while (cur){fwrite(&(cur->data), sizeof(cur->data), 1, pf);cur = cur->next;}printf("通讯录数据保存成功!\n");}void DestroyContact(contact** con) 
{SaveContact(*con);//在通讯录销毁之前,先把历史数据保存到本地⽂件中contact.txtSListDesTroy(con);
}

在接下来我们将会学习更多有意思的东西,如果本篇有不理解的地方,欢迎私信我或在评论区指出,期待与你们共同进步。创作不易,望各位大佬一键三连!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 编程的作品怎么删除编程库:一步步的深入解析
  • 2. Revit API UI 之 IExternalCommand 和 IExternalApplication
  • c++中main(int argc, char* argv[])参数详解
  • PaddleDetection快速体验quick_start
  • 云南区块链商户平台发票助手成品
  • 【数据结构】排序(上)
  • 编程不行?解锁求职新路径的七大策略
  • java使用websocket遇到的问题
  • pdf转图片,pdf转图片在线转
  • Ubuntu 网络重置
  • Scapy使用报错Interface is invalid (no pcap match found) 解决办法
  • 【环境搭建】2.阿里云ECS服务器 安装MySQL
  • 必刷!!软考【系统分析师】100道高频考题(含知识点解析),轻松45+
  • 《玫瑰的故事》打响暑期档,“三连爆”的新丽领跑剧集市场
  • 【算法与数据结构】【数组篇】【题11-题15】
  • 「译」Node.js Streams 基础
  • 【知识碎片】第三方登录弹窗效果
  • Android Studio:GIT提交项目到远程仓库
  • echarts花样作死的坑
  • Facebook AccountKit 接入的坑点
  • Mysql5.6主从复制
  • PAT A1092
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • Redis 懒删除(lazy free)简史
  • vue--为什么data属性必须是一个函数
  • 创建一种深思熟虑的文化
  • 力扣(LeetCode)21
  • 前言-如何学习区块链
  • 如何利用MongoDB打造TOP榜小程序
  • 微信开放平台全网发布【失败】的几点排查方法
  • FaaS 的简单实践
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • 浅谈sql中的in与not in,exists与not exists的区别
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • # windows 安装 mysql 显示 no packages found 解决方法
  • #在 README.md 中生成项目目录结构
  • (21)起落架/可伸缩相机支架
  • (24)(24.1) FPV和仿真的机载OSD(三)
  • (C语言)共用体union的用法举例
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (新)网络工程师考点串讲与真题详解
  • (学习日记)2024.02.29:UCOSIII第二节
  • (一)Thymeleaf用法——Thymeleaf简介
  • (自用)仿写程序
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • ..回顾17,展望18
  • .NET 反射的使用
  • .NET6实现破解Modbus poll点表配置文件
  • .NET8 动态添加定时任务(CRON Expression, Whatever)
  • .NET建议使用的大小写命名原则