首页 > 其他分享 >单链表应用

单链表应用

时间:2024-08-31 11:53:17浏览次数:5  
标签:pphead 单链 SLTNode cur void next 应用 con

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

//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;
}

运行结果:

 

谢谢观看 

标签:pphead,单链,SLTNode,cur,void,next,应用,con
From: https://blog.csdn.net/Limerence_Aries/article/details/141750673

相关文章

  • 单链表
    目录1.链表的概念及结构2.单链表的实现3.链表的分类                        1.链表的概念及结构概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 链......
  • 探索音频处理中的频率分辨率:原理、影响与应用
    目录什么是频率分辨率?频率分辨率对音频处理的影响频率分辨率的实际应用与选择结论在音频信号处理领域,频率分辨率是一个至关重要的概念,它直接影响信号的分析和处理结果。无论是在语音识别、噪声抑制、音乐信号处理,还是在更多复杂的音频处理应用中,理解和选择适当的频率......
  • HarmonyOS开发之H5页面启动其他应用
    场景描述在HarmonyOS的开发中,经常需要在应用或者浏览器的H5页面中跳转到另一个应用。为了实现这一目标,本文档将介绍一种通过URLScheme(DeepLink)来启动已安装应用或者跳转至应用商店下载未安装应用的方法。实现步骤1.配置Scheme查询首先,在拉起方的module.json5文件中配置......
  • 【python】PyQt5中富文本框QTextEdit的详细教程与应用实战
    ✨✨欢迎大家来到景天科技苑✨✨......
  • MT6704 应用问题
    MT6704isahighperformance40V synchronousrectifierseriesproductfor Flybackconverters.Itiscompatiblewith variousFlybackconverterstypes.MT6704Itsupports DCM,CCMandQuasi-Resonant. Itintegratesa40VpowerMOSFETthatcan replaceSch......
  • 【智能算法改进】多策略融合的改进黑猩猩搜索算法及其应用
    目录1.算法原理2.改进点3.结果展示4.参考文献5.代码获取1.算法原理【智能算法】黑猩猩优化算法(ChOA)原理及实现2.改进点改进的Sine混沌映射初始化种群ChoA种群随机初始化的方法导致种群多样性、均匀性差、容易出现边界聚集现象,而混沌映射可以有效的改善上述......
  • 【智能算法应用】基于融合改进A星-麻雀搜索算法求解六边形栅格地图路径规划
    目录1.算法原理2.结果展示3.参考文献4.代码获取1.算法原理【智能算法】麻雀搜索算法(SSA)原理及实现六边形栅格地图分析一下地图:六边形栅格地图上移动可以看做6领域运动,偶数列与奇数列移动方式有所差异,将六边形栅格地图与二维栅格地图做映射可以发现:偶数列移动......
  • 数据分析新维度:TensorFlow在数据探索中的应用
    数据分析新维度:TensorFlow在数据探索中的应用在数据科学领域,TensorFlow作为Google开发的开源机器学习框架,不仅在深度学习领域大放异彩,其数据分析能力同样不容小觑。本文将深入探讨如何使用TensorFlow进行数据分析,包括数据预处理、探索性数据分析和可视化,并通过代码示例展示......
  • dubbo spi 的应用指南
    文章目录前言一、配置文件目录二、标准SPI三、自适应SPI(AdaptiveSPI)1、@Adaptive说明1.1、方法级别的注解:1.2、类级别的注解:2、@Adaptive作用在类上3、@Adaptive作用在方法上三、激活SPI(ActivateSPI)四、DubboAOP五、DubboIOC前言SPI全称为ServiceProviderI......
  • CRISP-DM的应用与理解
    本文分享自天翼云开发者社区《CRISP-DM的应用与理解》,作者:吴****嫄CRISP-DM是一个数据挖掘项目规划的开放标准流程框架模型,主要分为业务理解、数据理解、数据准备、建模、评估、部署六个阶段。业务理解从业务的角度理解项目的目标和需求,将业务的目的转换为一个数据挖掘的问题,制......