基于单链表实现通讯管理系统!(有完整源码!)

这篇具有很好参考价值的文章主要介绍了基于单链表实现通讯管理系统!(有完整源码!)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

基于单链表实现通讯管理系统!(有完整源码!),C语言实战项目,java,前端,数据库

                                                                                个人主页:秋风起,再归来~

                                                                                文章专栏:C语言实战项目                              

                                                                        个人格言:悟已往之不谏,知来者犹可追

                                                                                        克心守己,律己则安!

1、前言

友友们,这篇文章是基于单链表来实现通讯管理系统的,所以一定要先看完我之前写过的一篇关于单链表的实现(文章链接)的文章哦~

其实基于单链表实现通讯录的思路与基于顺讯表实现通讯录的思路是一样的,在这里我就不进行赘述了。如果还没有看过我之前写的一篇基于顺序表实现通讯录(文章链接)的宝子们一定要去看看哦~

2、各种接口的实现

以下是我们希望实现的接口~

//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 ShowContact(contact* con);

//删除通讯录数据
void DelContact(contact** con);

//查找通讯录数据
void FindContact(contact* con);

//修改通讯录数据
void ModifyContact(contact** con);

//销毁通讯录数据
void DestroyContact(contact** con);

2.1 初始化通讯录

我们希望在初始化通讯录时导入之前我们原有文件中的数据,那我们就可以进行如下的操作~

//从文件中导入原数据
void DLoadContact(contact** con)
{
	FILE* pf = fopen("contact.txt", "rb");
	if (pf == NULL)
	{
		perror("open fail\n");
		return;
	}
	PeoInfo p = { 0 };
	while (fread(&p, sizeof(PeoInfo),1,pf))
	{
		SListPushBack(con, p);
	}
	printf("历史数据导入成功!\n");
	fclose(pf);
	pf = NULL;
}

在初始化通讯录之后加载数据! 

//初始化通讯录
void InitContact(contact** con)
{
	assert(con);
	(*con) = NULL;
	DLoadContact(con);
}

2.2 添加通讯录数据

//添加通讯录数据
void AddContact(contact** con)
{
	assert(con);
	PeoInfo p = {0};
	printf("请输入添加联系人的姓名:");
	scanf("%s", p.name);
	printf("请输入添加联系人的性别:");
	scanf("%s", p.sex);
	printf("请输入添加联系人的年龄:");
	scanf("%d", &(p.age));
	printf("请输入添加联系人的电话:");
	scanf("%s", p.tel);
	printf("请输入添加联系人的住址:");
	scanf("%s", p.addr);
	SListPushBack(con,p);
	printf("\n");
}

2.3 删除通讯录数据

在查找通讯录数据之外封装一个函数(findByName)来通过名字查找联系人!

(因为我们在之后的查找和修改接口中都会用到这个方法,所以我们把它封装成一个函数方便我们后续的使用!)

//通过名字查找联系人
contact* findByName(contact* con,char* name)
{
	assert(con);
	contact* cur = con;
	while (cur)
	{
		if (strcmp(cur->data.name, name) == 0)
		{
			return cur;
		}
		cur = cur->next;
	}
	return NULL;
}

在原有单链表的删除指定数据的接口上进行封装(让单链表摇身一变成为通讯录!)

//删除通讯录数据
void DelContact(contact** con)
{
	assert(con && (*con));
	char name[NAME_MAX];
	printf("请输入你要删除的联系人的名字:");
	scanf("%s", name);
	contact* pos = findByName(*con,name);
	if (pos == NULL)
	{
		printf("您要删除的联系人不存在!\n");
		return;
	}
	SListErase(con, pos);
	printf("删除成功!\n");
}

2.4 展示通讯录数据

遍历我们的通讯录打印信息!

//展示通讯录数据
void ShowContact(contact* con)
{
	assert(con);
	contact* cur = con;
	printf("名字\t\t性别\t\t年龄\t\t电话\t\t住址\n");//打印表头
	while (cur)
	{
		printf("%s\t\t%s\t\t%d\t\t%s\t\t%s\n",
			cur->data.name,
			cur->data.sex,
			cur->data.age,
			cur->data.tel,
			cur->data.addr);
		cur = cur->next;
	}
}

2.5 查找通讯录数据

//通过名字查找联系人
contact* findByName(contact* con,char* name)
{
	assert(con);
	contact* cur = con;
	while (cur)
	{
		if (strcmp(cur->data.name, name) == 0)
		{
			return cur;
		}
		cur = cur->next;
	}
	return NULL;
}

在接口内部调用该函数! 

//查找通讯录数据
void FindContact(contact* con)
{
	assert(con);
	char name[NAME_MAX];
	printf("请输入你要查找的联系人的名字:");
	scanf("%s", name);
	contact* ret = findByName(con, name);
	if (ret == NULL)
	{
		printf("您要查找的联系人不存在!\n");
		return;
	}
	printf("找到了!\n");
	printf("名字\t\t性别\t\t年龄\t\t电话\t\t住址\n");//打印表头
		printf("%s\t\t%s\t\t%d\t\t%s\t\t%s\n",
			ret->data.name,
			ret->data.sex,
			ret->data.age,
			ret->data.tel,
			ret->data.addr);
}

2.6 修改通讯录数据

//通过名字查找联系人
contact* findByName(contact* con,char* name)
{
	assert(con);
	contact* cur = con;
	while (cur)
	{
		if (strcmp(cur->data.name, name) == 0)
		{
			return cur;
		}
		cur = cur->next;
	}
	return NULL;
}

在接口内部调用该函数! 

//修改通讯录数据
void ModifyContact(contact** con)
{
	assert(con);
	char name[NAME_MAX];
	printf("请输入你要修改的联系人的名字:");
	scanf("%s", name);
	contact* ret = findByName(*con, name);
	if (ret == NULL)
	{
		printf("您要修改的联系人不存在!\n");
		return;
	}
	PeoInfo p = { 0 };
	printf("请输入修改后联系人的姓名:");
	scanf("%s", p.name);
	printf("请输入修改后联系人的性别:");
	scanf("%s", p.sex);
	printf("请输入修改后加联系人的年龄:");
	scanf("%d", &(p.age));
	printf("请输入修改后联系人的电话:");
	scanf("%s", p.tel);
	printf("请输入修改后联系人的住址:");
	scanf("%s", p.addr);
	SListModify(ret, p);
	printf("修改成功!\n");
}

2.7 销毁通讯录数据

因为我们希望在退出通讯管理系统的时候可以将我们的操作都保留下来,所以我们可以对其进行文件操作!

//将输入的数据保存到文件中
void SaveContact(contact** con)
{
	FILE* pf = fopen("contact.txt", "wb");
	if (pf == NULL)
	{
		perror("open fail!\n");
		return;
	}
	contact* cur = *con;
	while (cur)
	{
		fwrite(&(cur->data), sizeof(PeoInfo), 1, pf);
		cur = cur->next;
	}
	printf("历史数据保存成功!\n");
	fclose(pf);
	pf = NULL;
}

 在销毁通讯录之前保留数据!

//销毁通讯录数据
void DestroyContact(contact** con)
{
	SaveContact(con);
	SListDestroy(con);
}

3、完整源码

SeqList.h

#pragma once//避免头文件被多次引用
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include"Contact.h"
typedef PeoInfo SListDataType;//便于改变数据类型

//定义一个结构体类型的节点
typedef struct SListNode
{
	SListDataType data;
	struct SListNode* next;//存储下一个节点的地址
}SListNode;

//1. 新节点的创建
SListNode* SListCreatNode(SListDataType x);

//2. 打印单链表
void PrintSList(SListNode* phead);

//3. 头插
void SListPushFront(SListNode** phead, SListDataType x);

//4. 头删
void  SListPopFront(SListNode** phead);

//5. 尾差
void SListPushBack(SListNode** phead, SListDataType x);

//6. 尾删
void  SListPopBack(SListNode** phead);

//7. 查找元素X
SListNode* SListFind(SListNode* phead, SListDataType x);

//8. 在pos位置修改
void SListModify(SListNode* pos, SListDataType x);

//9. 在任意位置之前插入
void SListInsert(SListNode** phead, SListNode* pos, SListDataType x);

//10. 在任意位置删除
void SListErase(SListNode** phead, SListNode* pos);

//11. 销毁单链表
void SListDestroy(SListNode** phead);

Contact.h

#define _CRT_SECURE_NO_WARNINGS

//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 ShowContact(contact* con);

//删除通讯录数据
void DelContact(contact** con);

//查找通讯录数据
void FindContact(contact* con);

//修改通讯录数据
void ModifyContact(contact** con);

//销毁通讯录数据
void DestroyContact(contact** con);

SeqList.c

#include"SList.h"

//1. 新节点的创建
SListNode* SListCreatNode(SListDataType x)
{
	SListNode* NewNode = (SListNode*)malloc(sizeof(SListNode));//开辟空间
	if (NewNode == NULL)//判断空间是否开辟成功
	{
		perror("malloc fail");
		return NULL;
	}
	NewNode->data = x;//赋值
	NewNode->next = NULL;//置空
	return NewNode;
}

#if 0
//2. 打印单链表
void PrintSList(SListNode* phead)
{
	if (phead == NULL)
	{
		printf("NULL");//如果链表没有元素就打印NULL
		return;
	}
	SListNode* cur = phead;
	//循环单链表打印
	while (cur != NULL)
	{
		printf("%d->", cur->data);
		cur = cur->next;
	}
	printf("NULL\n");
}
#endif

//3. 头插
void SListPushFront(SListNode** phead, SListDataType x)
{
	assert(phead);
	SListNode* newnode = SListCreatNode(x);//创建一个新节点
	newnode->next = *phead;
	*phead = newnode;
}

//4. 头删
void  SListPopFront(SListNode** phead)
{
	assert(phead);
	assert(*phead);//如果没有数据就不用头删,并报错
	SListNode* cur = (*phead)->next;
	free(*phead);
	*phead = cur;
}

//5. 尾插
void SListPushBack(SListNode** phead, SListDataType x)
{
	assert(phead);
	if (*phead == NULL)
	{
		*phead = SListCreatNode(x);//创建新节点并插入
	}
	else
	{
		SListNode* tail = *phead;
		while (tail->next != NULL)//找到尾节点
		{
			tail = tail->next;
		}
		tail->next = SListCreatNode(x);//创建新节点并插入
	}
}

//6. 尾删
void  SListPopBack(SListNode** phead)
{
	assert(phead);
	assert(*phead);//链表为空就不进行尾删
	SListNode* tail = *phead;
	if (tail->next == NULL)//如果链表就只有一个元素就进行头删
	{
		SListPopFront(phead);
	}
	else
	{
		while (tail->next->next != NULL)
		{
			tail = tail->next;
		}
		free(tail->next);
		tail->next = NULL;
	}
}

#if 0
//7. 查找元素X
SListNode* SListFind(SListNode* phead, SListDataType x)
{
	assert(phead);
	while (phead->next != NULL)//注意最后一个节点是没有查找的
	{
		if (phead->data == x)
			return phead;
		phead = phead->next;
	}
	if (phead->data == x)
		return phead;//最后一个节点没有查找
	else
		return NULL;//没找到
}
#endif

//8. 在pos位置修改
void SListModify(SListNode* pos, SListDataType x)
{
	assert(pos);
	pos->data = x;
}

//9. 在任意位置之前插入
void SListInsert(SListNode** phead, SListNode* pos, SListDataType x)
{
	assert(phead);
	assert(*phead);
	if (pos == *phead)//如果pos位置刚好是第一个节点就进行头插
	{
		SListPushFront(phead, x);
	}
	else
	{
		SListNode* newnode = SListCreatNode(x);
		SListNode* cur = *phead;
		while (cur->next != pos)//找到pos前一个节点
		{
			cur = cur->next;
		}
		cur->next = newnode;
		newnode->next = pos;
	}
}

//10. 在任意位置删除
void SListErase(SListNode** phead, SListNode* pos)
{
	assert(phead && *phead && pos);
	if (pos == *phead)//如果pos位置就是第一个节点就进行头删
	{
		SListPopFront(phead);
	}
	else
	{
		SListNode* cur = *phead;
		while (cur->next != pos)//找到pos前一个节点
		{
			cur = cur->next;
		}
		cur->next = pos->next;
		free(pos);
	}
}

//11. 销毁单链表
void SListDestroy(SListNode** phead)
{
	assert(*phead && phead);
	SListNode* cur = *phead;
	while (cur != NULL)
	{
		SListNode* tmp = cur->next;
		free(cur);
		cur = tmp;
	}
	*phead = NULL;
}

Contact.c

#include"SList.h"

//从文件中导入原数据
void DLoadContact(contact** con)
{
	FILE* pf = fopen("contact.txt", "rb");
	if (pf == NULL)
	{
		perror("open fail\n");
		return;
	}
	PeoInfo p = { 0 };
	while (fread(&p, sizeof(PeoInfo),1,pf))
	{
		SListPushBack(con, p);
	}
	printf("历史数据导入成功!\n");
	fclose(pf);
	pf = NULL;
}

//初始化通讯录
void InitContact(contact** con)
{
	assert(con);
	(*con) = NULL;
	DLoadContact(con);
}

//添加通讯录数据
void AddContact(contact** con)
{
	assert(con);
	PeoInfo p = {0};
	printf("请输入添加联系人的姓名:");
	scanf("%s", p.name);
	printf("请输入添加联系人的性别:");
	scanf("%s", p.sex);
	printf("请输入添加联系人的年龄:");
	scanf("%d", &(p.age));
	printf("请输入添加联系人的电话:");
	scanf("%s", p.tel);
	printf("请输入添加联系人的住址:");
	scanf("%s", p.addr);
	SListPushBack(con,p);
	printf("\n");
}

//展示通讯录数据
void ShowContact(contact* con)
{
	assert(con);
	contact* cur = con;
	printf("名字\t\t性别\t\t年龄\t\t电话\t\t住址\n");//打印表头
	while (cur)
	{
		printf("%s\t\t%s\t\t%d\t\t%s\t\t%s\n",
			cur->data.name,
			cur->data.sex,
			cur->data.age,
			cur->data.tel,
			cur->data.addr);
		cur = cur->next;
	}
}

//通过名字查找联系人
contact* findByName(contact* con,char* name)
{
	assert(con);
	contact* cur = con;
	while (cur)
	{
		if (strcmp(cur->data.name, name) == 0)
		{
			return cur;
		}
		cur = cur->next;
	}
	return NULL;
}

//删除通讯录数据
void DelContact(contact** con)
{
	assert(con && (*con));
	char name[NAME_MAX];
	printf("请输入你要删除的联系人的名字:");
	scanf("%s", name);
	contact* pos = findByName(*con,name);
	if (pos == NULL)
	{
		printf("您要删除的联系人不存在!\n");
		return;
	}
	SListErase(con, pos);
	printf("删除成功!\n");
}

//查找通讯录数据
void FindContact(contact* con)
{
	assert(con);
	char name[NAME_MAX];
	printf("请输入你要查找的联系人的名字:");
	scanf("%s", name);
	contact* ret = findByName(con, name);
	if (ret == NULL)
	{
		printf("您要查找的联系人不存在!\n");
		return;
	}
	printf("找到了!\n");
	printf("名字\t\t性别\t\t年龄\t\t电话\t\t住址\n");//打印表头
		printf("%s\t\t%s\t\t%d\t\t%s\t\t%s\n",
			ret->data.name,
			ret->data.sex,
			ret->data.age,
			ret->data.tel,
			ret->data.addr);
}

//修改通讯录数据
void ModifyContact(contact** con)
{
	assert(con);
	char name[NAME_MAX];
	printf("请输入你要修改的联系人的名字:");
	scanf("%s", name);
	contact* ret = findByName(*con, name);
	if (ret == NULL)
	{
		printf("您要修改的联系人不存在!\n");
		return;
	}
	PeoInfo p = { 0 };
	printf("请输入修改后联系人的姓名:");
	scanf("%s", p.name);
	printf("请输入修改后联系人的性别:");
	scanf("%s", p.sex);
	printf("请输入修改后加联系人的年龄:");
	scanf("%d", &(p.age));
	printf("请输入修改后联系人的电话:");
	scanf("%s", p.tel);
	printf("请输入修改后联系人的住址:");
	scanf("%s", p.addr);
	SListModify(ret, p);
	printf("修改成功!\n");
}

//将输入的数据保存到文件中
void SaveContact(contact** con)
{
	FILE* pf = fopen("contact.txt", "wb");
	if (pf == NULL)
	{
		perror("open fail!\n");
		return;
	}
	contact* cur = *con;
	while (cur)
	{
		fwrite(&(cur->data), sizeof(PeoInfo), 1, pf);
		cur = cur->next;
	}
	printf("历史数据保存成功!\n");
	fclose(pf);
	pf = NULL;
}
//销毁通讯录数据
void DestroyContact(contact** con)
{
	SaveContact(con);
	SListDestroy(con);
}

 这里我就没有单独去写一个菜单了,本身的意义也并不大,但是如果友友们想写一个来玩一玩,可以看看我之前那篇基于顺序表实现通讯录(文章链接,那里有菜单的模版(只要改几个接口的名字就行了)~

4、 完结散花

好了,这期的分享到这里就结束了~

如果这篇博客对你有帮助的话,可以用你们的小手指点一个免费的赞并收藏起来哟~

如果期待博主下期内容的话,可以点点关注,避免找不到我了呢~

我们下期不见不散~~

基于单链表实现通讯管理系统!(有完整源码!),C语言实战项目,java,前端,数据库​​基于单链表实现通讯管理系统!(有完整源码!),C语言实战项目,java,前端,数据库​​文章来源地址https://www.toymoban.com/news/detail-855954.html

到了这里,关于基于单链表实现通讯管理系统!(有完整源码!)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言课程设计|通讯录管理系统(含完整代码)

    目录 菜单功能 录入联系人信息功能 查看系统中全部信息功能 查看单个信息功能 删除全部信息功能 删除单个信息功能 修改信息功能 完整代码 在长达一个多月的学习过程中,终于将C语言学完,因此专门写一个C语言课程设计来检验这一个多月的学习成果,由于写的比较急,

    2024年02月01日
    浏览(46)
  • 基于Springboot的高校固定资产管理系统的设计与实现(源码完整)

    项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据你想解决的问题,今天给大家介绍一篇基于Springboot的高校固定资产管理系统

    2024年02月07日
    浏览(51)
  • 手把手教你基于【SpringBoot+MyBatis】实现员工管理系统‍【附完整源码】

    Hello,你好呀,我是 灰小猿 ,一个超会写 BUG 的程序猿🙊! 近期在学习springboot框架相关的内容,相比于SSM, SpringBoot最大的特点就是集成了Spring和SpringMVC,让之前繁琐的配置工作变得更加简洁, 同时对于业务逻辑层的处理也更加的友好, 所以今天就使用 SpringBoot整合MyBati

    2023年04月08日
    浏览(46)
  • 基于Java和MySQL实现的大学生学籍管理系统(毕业设计附完整项目代码)

    本课题下的功能要求有: 实现学生信息、班级、院系、专业等的管理 实现课程、学生成绩信息管理 实现学生的奖惩信息管理 创建规则用于限制性别项只能输入“男”或“女” 创建视图查询各个学生的学号、姓名、班级、专业、院系 创建存储过程查询指定学生的成绩单 创建

    2024年02月11日
    浏览(58)
  • 【C语言课设计划】个人通讯录管理系统(C语言大作业 链表 结构体 运行截图 完整代码)

    hello 大家好呀 这里是布丁学姐~ 今天给大家带来的是《C语言课设计划》的第一篇,个人通讯录管理系统 通讯录是当前社会每个人不可缺少的信息系统,利用C语言和Dve c++制作个人通讯录管理系统,从根本上改变纸质通讯录难以长久保存、容易丢失的弊端,从而提高信息管理和

    2024年02月02日
    浏览(105)
  • 宿舍管理系统的设计与实现:基于Spring Boot、Java、Vue.js和MySQL的完整解决方案

    ✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 | SpringBoot/SSM Python实战项目 | Django 微信小

    2024年01月17日
    浏览(53)
  • 【数据结构之线性表】单链表实现图书管理系统

            本次实验是在DEV C++软件上进行实现的。语言采用的是c++语言,但在整体上与c语言大致相似(不管用什么语言实现,思想是不变的)。         此次实现的整体思路:首先定义图书这个抽象数据类型,并且定义节点抽象数据类型(根据这些抽象数据类型对下面的数

    2024年02月08日
    浏览(41)
  • 用单链表实现学生信息管理系统(7.23周末作业)

    结构体定义: 功能函数: 1.申请结点 2.创建链表 3.链表判空 4.遍历学生信息 5.尾插法添加学生信息 6.根据姓名查找学生信息 7.根据学号查找学生信息 8.根据姓名删除学生信息 9.根据学号删除学生信息 10.根据学生姓名修改学生信息 11.根据学生学号修改学生信息 12.按学号将学生

    2023年04月20日
    浏览(35)
  • 【C语言】实现通讯录管理系统

    大家好,我是苏貝,本篇博客带大家实现通讯录,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 本文将使用C语言来实现通讯录管理系统,该通讯录包括若干联系人,和每个联系人的姓名、年龄、性别、电话、地址。此通讯录的功能包括:增加联系人信息,

    2024年02月08日
    浏览(49)
  • 学生通讯录管理系统的设计与实现

    1.1 问题的描述 学生通讯录管理系统是为了帮助老师、同学,或者其他一些需要使用通讯录的人员进行管理和分析的一种应用程序。 1.2 问题分析和任务定义 (1)输入数据建立通讯录; (2)查询通讯录中满足要求的信息; (3)插入新的通讯录信息; (4)删除不需要的通讯

    2024年02月10日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包