单链表应用

news2024/11/13 12:18:12

基于单链表实现通讯录项目

//Contact.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
#include"list.h"

//初始化通讯录
void InitContact(contact** con)
{
	con = NULL;
	
}
//添加通讯录数据
void AddContact(contact** con)
{
	PeoInfo info;
	printf("address:");
	scanf_s("%s", info.address, ADDR_MAX);
	printf("name:");
	scanf_s("%s", info.name, NAME_MAX);
	printf("sex:");
	scanf_s("%s", info.sex, SEX_MAX);
	printf("tel:");
	scanf_s("%s", info.tel, TEL_MAX);
	printf("age:");
	scanf_s("%d", &info.age);
	SLTPushBack(con, info);
}
//删除通讯录数据
void DelContact(contact** con)
{
	SListDesTroy(con);
}
//展示通讯录数据
void ShowContact(contact* con)
{
	SLTPrint(con);
}
//查找通讯录数据
void FindContact(contact* con)
{
	PeoInfo info;
	info.name[NAME_MAX];
	scanf_s("%s", info.name, NAME_MAX);
	printf("%p\n", SLTFind(con, info));
}
//修改通讯录数据
void ModifyContact(contact** con)
{
	PeoInfo info;
	info.name[NAME_MAX];
	scanf_s("%s", info.name, NAME_MAX);
	SLTNode* find = SLTFind(*con, info);
	if (find)
	{
		printf("address:");
		scanf_s("%s", find->val.address, ADDR_MAX);
		printf("name:");
		scanf_s("%s", find->val.name, NAME_MAX);
		printf("sex:");
		scanf_s("%s", find->val.sex, SEX_MAX);
		printf("tel:");
		scanf_s("%s", find->val.tel, TEL_MAX);
		printf("age:");
		scanf_s("%d", &find->val.age);
		printf("修改完成\n");
		return;
	}
	else
	{
		printf("没找到");
	}
}
//销毁通讯录数据
void DestroyContact(contact** con)
{
	SListDesTroy(con);
}
//Contact.h
#define _CRT_SECURE_NO_WARNINGS 1
#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 address[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);
//list.c
#include"list.h"
#include<stdlib.h>
#include<string.h>
void SLTPrint(SLTNode* phead)
{
	printf("address   name       sex        tel           age\n");
	while (phead)
	{
		printf("%s   %8s   %8s   %8s      %8d\n", (*phead).val.address, (*phead).val.name, (*phead).val.sex, (*phead).val.tel, (*phead).val.age);
		phead = phead->next;
	}
}
SLTNode* buyNode(SLTDataType x)
{
	SLTNode* node = (SLTNode*)malloc(sizeof(SLTNode));
	node->next = NULL;
	node->val = x;
	return node;
}
//头部插入删除/尾部插入删除
void SLTPushBack(SLTNode** pphead, SLTDataType x)
{
	SLTNode* node = buyNode(x);
	if (*pphead == NULL)
	{
		*pphead = node;
		return;
	}
	SLTNode* cur = (*pphead);
	while (cur->next)
	{
		cur = cur->next;
	}
	cur->next = node;
}
void SLTPushFront(SLTNode** pphead, SLTDataType x)
{
	SLTNode* node = buyNode(x);
	if (pphead == NULL)
	{
		*pphead = node;
		return;
	}
	node->next = (*pphead);
	(*pphead) = node;
}
void SLTPopBack(SLTNode** pphead)
{
	SLTNode* cur = (*pphead);
	if (cur->next == NULL)
	{
		free(cur);
		cur = NULL;
		return;
	}
	SLTNode* prev = NULL;
	while (cur->next)
	{
		prev = cur;
		cur = cur->next;
	}
	free(cur);
	prev->next = NULL;
}
void SLTPopFront(SLTNode** pphead)
{
	SLTNode* cur = (*pphead);
	if (cur->next == NULL)
	{
		free(cur);
		return;
	}
	SLTNode* prev = cur;
	cur = cur->next;
	free(prev);
	prev = NULL;
}

//查找
SLTNode* SLTFind(SLTNode* phead, SLTDataType x)
{
	while (phead)
	{
		if (!strcmp(phead->val.name, x.name))
		{
			return phead;
		}
		phead = phead->next;
	}
	return NULL;
}
//在指定位置之前插入数据
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x)
{
	SLTNode* cur = (*pphead);
	SLTNode* node = buyNode(x);
	if (cur == pos)
	{
		SLTPushFront(pphead, x);
		return;
	}
	while (cur->next == pos)
	{
		cur = cur->next;
	}
	node->next = cur->next;
	cur->next = node;
}
//删除pos节点
void SLTErase(SLTNode** pphead, SLTNode* pos)
{
	SLTNode* cur = (*pphead);
	if (cur == pos)
	{
		SLTPopFront(pphead);
		return;
	}
	while (cur->next == pos)
	{
		cur = cur->next;
	}
	SLTNode* next = cur->next;
	cur->next = next->next;
	free(next);
	next = NULL;
}
//在指定位置之后插入数据
void SLTInsertAfter(SLTNode* pos, SLTDataType x)
{
	SLTNode* node = buyNode(x);
	SLTNode* next = pos->next;
	pos->next = node;
	node->next = next;
}
//删除pos之后的节点
void SLTEraseAfter(SLTNode* pos)
{
	SLTNode* next = pos->next;
	while (next)
	{
		SLTNode* nnext = next->next;
		free(next);
		next = nnext;
	}
	pos->next = NULL;
}
//销毁链表
void SListDesTroy(SLTNode** pphead)
{
	SLTNode* cur = (*pphead);
	while (cur)
	{
		SLTNode* next = cur->next;
		free(cur);
		cur = next;
	}
	*pphead = NULL;
	pphead = NULL;
	
}
//list.h
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"Contact.h"
typedef PeoInfo SLTDataType;
typedef struct SListNode
{
	SLTDataType val;
	struct SListNode* next;
}SLTNode;


void SLTPrint(SLTNode* phead);
SLTNode* buyNode(SLTDataType x);
//头部插入删除/尾部插入删除
void SLTPushBack(SLTNode** pphead, SLTDataType x);
void SLTPushFront(SLTNode** pphead, SLTDataType x);
void SLTPopBack(SLTNode** pphead);
void SLTPopFront(SLTNode** pphead);

//查找
SLTNode* SLTFind(SLTNode* phead, SLTDataType x);
//在指定位置之前插入数据
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x);
//删除pos节点
void SLTErase(SLTNode** pphead, SLTNode* pos);
//在指定位置之后插入数据
void SLTInsertAfter(SLTNode* pos, SLTDataType x);
//删除pos之后的节点
void SLTEraseAfter(SLTNode* pos);
//销毁链表
void SListDesTroy(SLTNode** pphead);
//test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"list.h"
int main()
{
	SLTNode* ps = 0;
	InitContact(&ps);

	AddContact(&ps);
	AddContact(&ps);
	AddContact(&ps);
	ShowContact(ps);
	printf("-------------------------------------------------\n");

	/*DelContact(&ps);
	ShowContact(ps);
	printf("-------------------------------------------------\n");*/

	FindContact(ps);
	printf("-------------------------------------------------\n");

	ModifyContact(&ps);
	ShowContact(ps);
	printf("-------------------------------------------------\n");

	DestroyContact(&ps);

	return 0;
}

运行结果:

 

谢谢观看 

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

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

相关文章

无主灯设计:吊顶之问与光影艺术的探索

在现代家居设计中&#xff0c;照明不仅仅是为了满足基本的照明需求&#xff0c;更是一种艺术和情感的表达。随着无主灯设计越来越受到人们的青睐&#xff0c;许多业主开始考虑一个问题&#xff1a;进行无主灯设计时&#xff0c;是否一定需要吊顶呢&#xff1f;本文将深入探讨这…

2017年系统架构师案例分析试题五

目录 案例 【题目】 【问题 1】(5 分) 【问题 2】(16 分) 【问题 3】(4 分) 【答案】 【问题 1】解析 【问题 2】解析 【问题 3】答案 相关推荐 案例 阅读以下关于 Web 系统架构设计的叙述&#xff0c;在答题纸上回答问题 1 至问题 3。 【题目】 某电子商务企业因发…

小波神经网络的时间序列的短时交通流量预测

小波神经网络的时间序列的短时交通流量预测 通过小波分析进行负荷序列分 解, 获得不同频率负荷分量规律 ; 由粒子群算法进行粒子群适应度排序 , 提升算法收敛速度和收敛能力 ; 为避免算法陷入局部 收敛性, 引入混沌理论来增强全局搜索能力 。 预测结果

linux 系统如何进行nfs(第五节)

网上的截图&#xff1a; 自己的操作&#xff1a; 首先是 在虚拟机中的操作。 然后是在开发板上的操作。 已经是没有问题了。

AI绘画【Stable Diffusion】抽卡必备!时间管理大师Agent Scheduler插件,一键设置任务,让你的休息时间充分利用起来!

大家好&#xff0c;我是灵魂画师向阳 相信大家在玩 Stable Diffusion 的时候一直有一个痛点&#xff0c;每次出图抽卡时都只能等待上一次抽卡结束&#xff0c;才能继续下一次抽卡&#xff1b; 特别是当我们想抽大量的卡来测试不同的模型&#xff0c;不同的参数的效果时&#…

大学生社团管理系统

一、项目概述 Hi&#xff0c;大家好&#xff0c;今天分享的项目是《大学生社团管理系统》。 随着校园文化的不断丰富&#xff0c;大学里各种社团越来越多&#xff0c;社团活动也越来越频繁&#xff0c;社团管理就显得繁琐&#xff0c;传统的人工管理方式比较麻烦&#xff0c;…

Client客户端模块

一.Client模块介绍 二.Client具体实现 1.消费者/订阅者模块 2.信道管理模块 3.异步线程模块 4.连接管理模块 这个模块同样是针对muduo库客户端连接的二次封装&#xff0c;向用户提供创建channel信道的接口&#xff0c;创建信道后&#xff0c;可以通过信道来获取指定服务。 三…

游泳耳机哪个牌子好?四大硬核爆款游泳耳机推荐种草!

随着人们对健康生活方式的不断追求&#xff0c;游泳作为一项全身性的运动受到了越来越多人的喜爱。与此同时&#xff0c;为了在水下也能享受音乐的乐趣&#xff0c;游泳耳机应运而生&#xff0c;并迅速成为泳池和海滩上不可或缺的装备之一。面对市面上琳琅满目的游泳耳机产品&a…

线性表之静态链表

1. 静态链表的设计 1.1 定义静态链表 链表是由多个相同类型的节点组成的线性表&#xff0c;它的每个节点都包含一个数据项和一个指向下一个节点的指针&#xff0c;链表中各个节点的地址是不连续的。 下面是一个用于存储整形数据的链表节点结构&#xff1a; struct Node {int…

深度学习与大模型第1课环境搭建

深度学习与大模型第1课 环境搭建 1. 安装 Anaconda 首先&#xff0c;您需要安装 Anaconda&#xff0c;这是一个开源的 Python 发行版&#xff0c;能够简化包管理和环境管理。以下是下载链接及提取码&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1Na2xOFpBXQMgzXA…

Text Control 控件教程:智能文档处理 (IDP)

TX Text Control 是一款功能类似于 MS Word 的文字处理控件&#xff0c;包括文档创建、编辑、打印、邮件合并、格式转换、拆分合并、导入导出、批量生成等功能。广泛应用于企业文档管理&#xff0c;网站内容发布&#xff0c;电子病历中病案模板创建、病历书写、修改历史、连续打…

【云计算】什么是云计算服务|为什么出现了云计算|云计算的服务模式

文章目录 什么是云计算服务本地部署VS云计算SaaS PaaS IaaS公有云、私有云、混合云为什么优先发展云计算服务的厂商是亚马逊、阿里巴巴等公司 什么是云计算服务 根据不同的目标用户&#xff0c;云计算服务&#xff08;Cloud Computing Services&#xff09;分为两种&#xff1…

前端性能优化:提升网站加载速度的五个关键技巧

聚沙成塔每天进步一点点 本文回顾 ⭐ 专栏简介前端性能优化&#xff1a;提升网站加载速度的五个关键技巧1. 引言2. 前端性能优化的五个关键技巧2.1 减少HTTP请求技巧说明实现示例 2.2 启用浏览器缓存技巧说明实现示例 2.3 使用内容分发网络&#xff08;CDN&#xff09;技巧说明…

完美洗牌的秘密(五)——完美洗牌的性质和变体

‍ ‍早点关注我&#xff0c;精彩不错过&#xff01; 之前4篇文章&#xff0c;我们介绍清楚了完美洗牌的3对基本定理。今天&#xff0c;我们来看在这一般的描述基础上&#xff0c;还有哪些常见性质和变体值得探讨。 所谓操作的性质&#xff0c;在扑克牌数学魔术的语境下&#x…

公务员事业编【判断推理】 之“逻辑判断” 个人NOTE

目录 1、翻译推理 1.1 翻译规则之“前推后” 1.2 翻译规则之“逆否等价” 1.3 翻译规则之“后推前” 1.4 且和或 2、组合排列&#xff08;代入法/排除法&#xff09; 3、日常结论 4、逻辑论证 4.1 加强类 4.1.1 搭桥&#xff08;论证力度最强&#xff09; 4.1.2 补充…

系统架构设计师 - 软件架构设计(2)

软件架构设计 软件架构设计&#xff08;20多分&#xff09;最重要基于架构的软件开发 ★ ★ ★概念开发过程架构需求、设计过程架构文档化架构复审架构实现、演化过程 软件质量属性 ★ ★ ★ ★ ★软件架构评估 ★ ★ ★ ★ ★概念架构评估方法评估方式基于场景的评估方法 软件…

EmguCV学习笔记 VB.Net 9.1 VideoCapture类

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

人工智能开发实战MNIST数据集及神经网络完全解析

内容提要 MNIST数据集简介神经元常用函数深度神经网络卷积神经网络介绍循环神经网络 一、MNIST数据集简介 数据集&#xff08;Dataset&#xff09;是一类数据的集合。传统的数据集通常表现为表格或者文档形式&#xff0c;每个数值被称为数据资料。 MNIST数据集是一个含有手写…

ARM32开发——(二十四)电源管理单元

1. 重点 了解什么是电池管理单元PMU了解ARM32中的电源域了解几种省电模式 2. 主要内容 2.1 PMU PMU全称Power Management Unit&#xff0c;电源管理单元。 2.2 电源域 总共有三大电源域&#xff0c;包括VDD / VDDA域&#xff0c;1.2V域和备份域。 2.2.1 VDD/VDDA域 VDD/…