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

单链表应用

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

//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.kler.cn/news/285293.html

相关文章:

  • 在Jtti服务器上怎么安装和配置Docker?
  • Pandas 绘图的强大之处:后端
  • Vue面试常见知识总结2——spa、vue按需加载、mvc与mvvm、vue的生命周期、Vue2与Vue3区别
  • 鸿蒙OS试题(6)
  • 自动驾驶---什么是Frenet坐标系?
  • AI学习指南深度学习篇-门控循环单元中的门控机制
  • jenkins发送html邮件配置步骤与注意事项?
  • 25. 蓝牙 - BLE相关2
  • 通过 Docker 部署 WordPress 服务器
  • IO进程day04(进程)
  • 文件上传漏洞详解
  • 存储 IO 性能优化策略、方案与瓶颈分析
  • Python 的http.server库详细介绍
  • Codeforces Round 967 (Div. 2)(A,B,C,D)
  • 使用pgrs在wsl中为postgres写拓展
  • HTTP/1和HTTP/2
  • Java面试前言
  • 【Sql Server】sql server 2019设置远程访问,外网服务器需要设置好安全组入方向规则
  • 腾讯开源突破技术:V-Express引领人像照片视频化新潮流
  • 数学建模强化宝典(3)fminsearch
  • C++笔记9•list•
  • 使用 Nginx 部署前端 Vue 项目
  • Excel下拉框多选
  • MIT的10门免费线上课,YYDS!
  • 算法day17|如何求普通二叉树的众数
  • DevOps实现CI/CD实战(二)-Jenkins配置
  • 鸿蒙( API 12 Beta5版)开发实战-UI优化布局性能
  • 视频中间件:与海康ISC平台级联
  • linux文件——文件系统——学习、理解、应用软硬件链接
  • 2025届北森智鼎SHL牛客倍智易考智联题库、十大测评系统通关攻略