数据结构4:基于单链表的通讯录项目

文章目录

  • 头文件
    • SList.h
    • Contact.h
  • 实现文件
    • SList.c
    • Contact.c
  • 测试代码

头文件

SList.h

#pragma once#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include"Contact.h"//typedef int SLDataType;
typedef PersonInfo SLDataType;//创建链表节点结构
typedef struct SListNode {SLDataType a;struct SListNode* next;
}SListNode;//销毁
void SLDestory(SListNode** phead);//打印
void SLPrint(SListNode* phead);//尾插
void SLPushBack(SListNode** pphead, SLDataType x);//头插
void SLPushFront(SListNode** pphead, SLDataType x);//尾删
void SLPopBack(SListNode** pphead);//头删
void SLPopFront(SListNode** pphead);//查找
SListNode* SLFind(SListNode* phead, SLDataType x);//在指定数据之前插入数据
void SLInsertFront(SListNode** pphead, SLDataType pos, SLDataType x);//指定数据之后插入
void SLInsertBack(SListNode* phead, SLDataType pos, SLDataType x);//指定位置之前插入数据
void SLInsertFront_1(SListNode** pphead, SListNode* pos, SLDataType x);//指定位置之前插入数据
void SLInsertBack_1(SListNode* pos, SLDataType x);//删除pos结点
void SLErase(SListNode** pphead, SListNode* pos);//删除pos之后的结点
void SLEraseAfter(SListNode* pos);

Contact.h

#pragma once#define NAME_MAX 50
#define GENDER_MAX 4
#define TEL_MAX 11
#define ADDR_MAX 100//将单链表重命名为通讯录
typedef struct SListNode Contact;//定义联系人数据结构
typedef struct PersonInfo {char name[NAME_MAX];char gender[GENDER_MAX];char tel[TEL_MAX];char addr[ADDR_MAX];
}PersonInfo;//销毁通讯录
void ContactDestory(Contact** con);//添加通讯录数据
void ContactPushBack(Contact** con);//展示通讯录
void ContactPrint(Contact* con);//保存数据
void SaveContact(Contact* con);//读取文件
void LoadContact(Contact** con);//删除联系人
void ContactDele(Contact** con);//查找联系人
void ContactFind(Contact* con);//修改联系人信息
void ContactModify(Contact** con);

实现文件

SList.c

#define _CRT_SECURE_NO_WARNINGS 1#include"SList.h"//打印
//void SLPrint(SListNode* phead)
//{
//	SListNode* pcur = phead;
//	while (pcur)
//	{
//		printf("%d->", pcur->a);
//		pcur = pcur->next;
//	}
//	printf("NULL\n");
//}//创建新节点
SListNode* BuyNode(SLDataType x)
{SListNode* newnode = (SListNode*)malloc(sizeof(SListNode));if (newnode == NULL){perror("malloc fail!\n");exit(1);}newnode->a = x;newnode->next = NULL;return newnode;
}//链表的销毁
void SLDestory(SListNode** pphead)
{assert(pphead);SListNode* pcur = *pphead;while (pcur){SListNode* tmp = pcur->next;free(pcur);pcur = tmp;}*pphead = NULL;
}//尾插
void SLPushBack(SListNode** pphead, SLDataType x)
{assert(pphead);SListNode* newnode = BuyNode(x);if (*pphead == NULL){*pphead = newnode;}else {SListNode* ptail = *pphead;while (ptail->next != NULL){ptail = ptail->next;}ptail->next = newnode;}
}//头插
void SLPushFront(SListNode** pphead, SLDataType x)
{assert(pphead);SListNode* newnode = BuyNode(x);newnode->next = *pphead;*pphead = newnode;
}//尾删
void SLPopBack(SListNode** pphead)
{assert(pphead && *pphead);if ((*pphead)->next == NULL){SLDestory(pphead);return;}SListNode* pprev = *pphead;SListNode* ptail = *pphead;while (ptail->next != NULL){pprev = ptail;ptail = ptail->next;}pprev->next = NULL;free(ptail);ptail = NULL;
}//头删
void SLPopFront(SListNode** pphead)
{assert(pphead && *pphead);SListNode* pcur = *pphead;*pphead = pcur->next;free(pcur);pcur = NULL;
}//查找
//SListNode* SLFind(SListNode* phead, SLDataType x)
//{
//	assert(phead);
//	SListNode* pcur = phead;
//	while (pcur)
//	{
//		if (pcur->a == x)
//		{
//			return pcur;
//		}
//		pcur = pcur->next;
//	}
//	return NULL;
//}//指定数据之前插入
//void SLInsertFront(SListNode** pphead, SLDataType pos, SLDataType x)
//{
//	assert(pphead && *pphead);
//	if ((*pphead)->a == pos)
//	{
//		SLPushFront(pphead, x);
//		return;
//	}
//	SListNode* newnode = BuyNode(x);
//	SListNode* pcur = *pphead;
//	while (pcur->next->a != pos)
//	{
//		pcur = pcur->next;
//	}
//	newnode->next = pcur->next;
//	pcur->next = newnode;
//}//指定数据之后插入
//void SLInsertBack(SListNode* phead, SLDataType pos, SLDataType x)
//{
//	assert(phead);
//	SListNode* newnode = BuyNode(x);
//	SListNode* find = SLFind(phead, pos);
//	newnode->next = find->next;
//	find->next = newnode;
//}//指定位置之前插入数据
//void SLInsertFront_1(SListNode** pphead, SListNode* pos, SLDataType x)
//{
//	assert(pphead && *pphead);
//	assert(pos);
//	if (*pphead == pos)
//	{
//		SLPushFront(pphead, x);
//		return;
//	}
//	SListNode* newnode = BuyNode(x);
//	SListNode* pcur = *pphead;
//	while (pcur->next != pos)
//	{
//		pcur = pcur->next;
//	}
//	newnode->next = pcur->next;
//	pcur->next = newnode;
//}//指定位置之前插入数据
//void SLInsertBack_1(SListNode* pos, SLDataType x)
//{
//	assert(pos);
//	SListNode* newnode = BuyNode(x);
//	newnode->next = pos->next;
//	pos->next = newnode;
//}//删除pos结点
void SLErase(SListNode** pphead, SListNode* pos)
{assert(pphead && *pphead);assert(pos);if (*pphead == pos){SLPopFront(pphead);return;}SListNode* prev = *pphead;while (prev->next != pos){prev = prev->next;}prev->next = pos->next;free(pos);pos = NULL;
}//删除pos之后的结点
void SLEraseAfter(SListNode* pos)
{assert(pos && pos->next);SListNode* next = pos->next;pos->next = next->next;free(next);next = NULL;
}

Contact.c

#define _CRT_SECURE_NO_WARNINGS 1
#include<string.h>
#include"Contact.h"
#include"SList.h"//销毁通讯录
void ContactDestory(Contact** con)
{SLDestory(con);
}//添加通讯录数据
void ContactPushBack(Contact** con)
{assert(con);Contact* phead = *con;PersonInfo tmp;printf("请输入联系人姓名:\n");scanf("%s", tmp.name);printf("请输入联系人性别:\n");scanf("%s", tmp.gender);printf("请输入联系人电话:\n");scanf("%s", tmp.tel);printf("请输入联系人地址:\n");scanf("%s", tmp.addr);SLPushBack(con, tmp);
}//查找联系人信息
Contact* Findbyname(Contact* con,char name[NAME_MAX])
{assert(con);Contact* pcur = con;while (pcur){if (strcmp(pcur->a.name, name) == 0) {return pcur;}pcur = pcur->next;}return NULL;
}//删除联系人
void ContactDele(Contact** con)
{assert(con);Contact* phead = *con;char name[NAME_MAX];printf("请输入要删除的联系人姓名:\n");scanf("%s", name);Contact* find = Findbyname(*con, name);if (find == NULL){printf("无此联系人信息!\n");return;}SLErase(con, find);
}//查找联系人
void ContactFind(Contact* con)
{assert(con);char name[NAME_MAX];printf("请输入要查找的联系人姓名:\n");scanf("%s", name);Contact* find = Findbyname(con, name);if (find == NULL){printf("无此联系人信息!\n");return;}printf("姓名 性别 电话 地址\n");printf("%s %s %s %s\n", find->a.name, find->a.gender, find->a.tel, find->a.addr);
}//修改联系人信息
void ContactModify(Contact** con)
{assert(con);char name[NAME_MAX];printf("请输入要修改的联系人姓名:\n");scanf("%s", name);Contact* find = Findbyname(*con, name);if (find == NULL){printf("无此联系人信息!\n");return;}printf("请输入新的联系人姓名:\n");scanf("%s", find->a.name);printf("请输入联系人性别:\n");scanf("%s", find->a.gender);printf("请输入联系人电话:\n");scanf("%s", find->a.tel);printf("请输入联系人地址:\n");scanf("%s", find->a.addr);printf("修改成功!\n");
}//展示通讯录
void ContactPrint(Contact* con)
{Contact* pcur = con;printf("姓名 性别 电话 地址\n");while (pcur) {printf("%s %s %s %s\n", pcur->a.name, pcur->a.gender, pcur->a.tel, pcur->a.addr);pcur = pcur->next;}
}//保存文件
void SaveContact(Contact* con)
{FILE* pf = fopen("Contact.txt", "wb");if (pf == NULL) {perror("fopen fail!\n");return;}Contact* pcur = con;while (pcur) {fwrite(&(pcur->a), sizeof(PersonInfo), 1, pf);pcur = pcur->next;}fclose(pf);pf = NULL;printf("保存成功!\n");return;
}//读取文件
void LoadContact(Contact** con)
{FILE* pf = fopen("Contact.txt", "rb");if (pf == NULL) {perror("fopen fail!\n");return;}PersonInfo a;PersonInfo* tmp = &a;while (fread(tmp,sizeof(PersonInfo),1,pf) ){SLPushBack(con, *tmp);}printf("读取成功!\n");
}

测试代码

#define _CRT_SECURE_NO_WARNINGS 1#include"SList.h"
#include"Contact.h"//测试通讯录
void Test2(Contact* con)
{//读取数据LoadContact(&con);//执行操作int input = 0;do {menu();scanf("%d", &input);switch (input){case 1:ContactPushBack(&con);break;case 2:ContactDele(&con);break;case 3:ContactModify(&con);break;case 4:ContactFind(con);break;case 5:ContactPrint(con);default:break;}} while (input);printf("正在退出...\n");//保存数据SaveContact(con);
}int main()
{Contact* con = NULL;Test2(con);//销毁ContactDestory(&con);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/812916.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年第十四届MathorCup数学应用挑战赛B题解题思路

B题https://mbd.pub/o/bread/ZZ6Wm5dx 问题1:对于附件I(Pre_test文件夹)给定的三张甲骨文原始拓片图 片进行图像预处理&#xff0c;提取图像特征&#xff0c;建立甲骨文图像预处理模型&#xff0c;实现对 甲骨文图像干扰元素的初步判别和处理。 针对问题1&#xff0c;对于附件…

【研发效能·创享大会-嗨享技术轰趴】-IDCF五周年专场

一、这是一场创新分享局&#xff01; 来吧&#xff0c;朋友们! 参加一场包含AIGC、BizDevOps、ToB产品管理、B端产品运营、平台工程、研发效能、研发度量、职业画布、DevOps国标解读的研发效能创享大会&#xff0c;会有哪些收益呢&#xff1f; 知识更新与技能提升&#xff1a;…

在线批量生成URL HTML单页网页程序

输入前缀、开始数字、结束数字、后缀 即可快速生成 几万、十万、百万 条链接。 支持 一键复制、 一键导出本地 txt 文件。 源码免费下载地址抄笔记 (chaobiji.cn)

Conda 常用命令总结

创建虚拟环境 conda create -n name python[your_version] 激活环境 conda activate name 退出环境 conda deactivate 查看虚拟环境 conda info --envs 删除虚拟环境 conda remove -n name --all 删除所有的安装包及cache(索引缓存、锁定文件、未使用过的包和tar包) …

java的jar包jakarta.jakartaee-web-api和jakarta.servlet-api有什么区别

jakarta.jakartaee-web-api和jakarta.servlet-api都是Java EE&#xff08;现在是 Jakarta EE&#xff09;中的一部分&#xff0c;用于开发基于Java EE平台的Web应用程序。它们之间的区别在于以下几点&#xff1a; 命名空间&#xff1a; jakarta.servlet-api是Java EE 8之前版本…

linux中常用命令(未完待续)

linux中常用命令&#xff08;未完待续&#xff09; 复制/移动文件夹&#xff1a;在Linux中移动/复制文件夹到另一个目录中 # *********************删除文件夹↓********************************* # 要删除一个文件夹&#xff0c;最常见的方法是使用rm命令。 # PS&#xff1…

CSS3 常用样式

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 ✍CSS3 常用样式&#x1f48e;1 CSS3 新增选择器&#x1f339;1.1 属性选择器…

使用ego-planner进行无人机控制时的数据流(自用)

本文将详细介绍如何使用ego-planner向无人机发送控制指令&#xff0c;实现自动控制的过程。我们将探讨ego-planner的运行方式以及控制指令的传输过程&#xff0c;涉及到ROS节点、MAVROS协议以及无人机的控制器等方面。 在实现自动控制时&#xff0c;控制指令的传输是至关重要的…

R语言 多组堆砌图

目录 数据格式 普通绘图 添加比例 R语言 堆砌图_r语言堆砌图-CSDN博客 关键点在于数据转换步骤和数据比例计算步骤&#xff0c;然后个性化调整图。 ①data <- melt(dat, id.vars c("ID"))##根据分组变为长数据 ②#计算百分比## data2 <- ddply(data, …

大学生毕业答辩要点

不要太老实 暗号①:论文的创新点体现在哪里? 你就答:本篇毕业论文的创新之处在于讨论XXX的问题时不仅在xxx方面列出xxx,也从实际的角度进行了举例论证。一是在方法上,本文将xxx方法与xxx方法相结合,能多有效消除单方法带来的误差有效提高了数据的精度(结果的有效性)二…

Go 使用ObjectID

ObjectID介绍 MongoDB中的ObjectId是一种特殊的12字节 BSON 类型数据&#xff0c;用于为主文档提供唯一的标识符&#xff0c;默认情况下作为 _id 字段的默认值出现在每一个MongoDB集合中的文档中。以下是ObjectId的具体组成&#xff1a; 1. 时间戳&#xff08;Timestamp&…

Ollama、FastGPT大模型RAG结合使用案例

参考: https://ollama.com/download/linux https://doc.fastai.site/docs/intro/ https://blog.csdn.net/m0_71142057/article/details/136738997 https://doc.fastgpt.run/docs/development/custom-models/m3e/ Ollama作为后端大模型加载运行 FastGPT作为前端页面聊天集成RA…

Redis中的集群(八)

集群 设置从节点 向一个节点发送命令: CLUSTER REPLICATE <node_id>可以让接收命令的节点成为node_id所指定节点的从节点&#xff0c;并开始对主节点进行复制: 1.接收到该命令的节点会首先会在自己的clusterState.nodes字典中找到node_id所对应节点的clusterNode结构,…

根据后端获取到的文档流,下载打开显示“无法打开文件”

原代码&#xff1a; download(item) {this.axios.get(api.download/item.name).then(res > {// console.log(res)let bob new Blob([res.data],{type: application/vnd.ms-excel})const link document.createElement(a);let url window.URL.createObjectURL(bob);link.d…

flutter中鼠标检测事件的应用---主要在于网页端使用

flutter中鼠标检测事件的应用—主要在于网页端使用 鼠标放上去 主要代码 import package:flutter/material.dart;class CustomStack extends StatefulWidget {override_CustomStack createState() > _CustomStack(); }class _CustomStack extends State<CustomStack>…

高质量ChatGPT Prompts 精选

通用超级 Prompt GPT4实用。通用超级 prompt &#xff0c;根据你想要的输出和你的反馈&#xff0c;自动使用相应的专家角色帮你解决问题。如果需要升级ChatGPT Plus&#xff0c;可以参考教程 升级 GPT4.0 保姆教程 您是一位具有多领域专长的专家级ChatGPT提示工程师。在我们…

Nginx 访问日志配置

Nginx 的访问日志主要记录用户客户端的请求信息(见下表)。用户的每次请求都会记录在访问日志中,access_log 指令可以设置日志的输出方式及引用的日志格式。 名称访问日志指令指令access_log作用域http、stream、server、location、if in location、limit except指令值格式lo…

前端面试题收集整理

1. 浏览器地址输入url之后发生了什么 解析url (协议&#xff0c;域名IP端口&#xff0c;地址路径&#xff0c;hash值&#xff0c;参数) DNS对域名进行解析&#xff08;先去本地host查看&#xff09;&#xff1b; 建立TCP连接&#xff08;三次握手&#xff09;&#xff1b; 发送…

2023年全国青少年信息素养大赛(Python)海南赛区复赛真题,包含答案

2023 年全国青少年信息素养大赛 (Python) 海南赛区复赛真题 第 1 题,整数加 8 题目描述: 输入一个整数,输出这个整数加 8 的结果。 输入描述: 输入一行一个正整数。 输出描述: 输出求和的结果。 样例

YOLO算法改进Backbone系列之:Fcaformer

目前&#xff0c;设计更高效视觉Transformer的一个主要研究方向是通过采用稀疏注意力或使用局部注意力窗口来降低自我注意力模块的计算成本。相比之下&#xff0c;我们提出了一种不同的方法&#xff0c;旨在通过密集注意力模式来提高基于变换器的架构的性能。具体来说&#xff…