《数据结构之链表篇》--简单通讯录的C++实现

【(数据结构) —— 顺序表的应用-通讯录的实现】 (数据结构) —— 顺序表的应用-通讯录的实现 阅读详情

客户端程序:

#include"List.h"

int menu()
{
	cout << "1.新建联系人" << endl;
	cout << "2.删除联系人" << endl;
	cout << "3.浏览通讯录" << endl;
	cout << "4.退出通讯录" << endl;
	cout << "请输入:";
	int input;
	cin >> input;
	return input;
}

void creatContact(List *pList)
{
	Node node;
	Person person;
	cout << "请输入姓名:";
	cin >> person.m_sName;
	cout << "请输入号码:";
	cin >> person.m_sPhone;
	cout << endl;
	node.data = person;
	pList->ListInsertTail(&node);

}

void deleteContact(List *pList)
{
	int num = 0;
	cout << "请输入需要删除的联系人序号:";
	cin >> num;
	Node node;
	pList->ListDelete(num - 1, &node);
}

int main()
{
	List *pList = new List;
	int userOrder = 0;
	while (userOrder != 4)
	{
		userOrder = menu();
		switch (userOrder)
		{
		case 1:
			cout << "用户指令--->新建联系人" << endl;
			creatContact(pList);
			break;
		case 2:
			cout << "用户指令--->删除联系人" << endl;
			deleteContact(pList);
			break;
		case 3:
			cout << "用户指令--->浏览通讯录" << endl;
			pList->ListTraverse();
			break;
		case 4:
			cout << "用户指令--->退出通讯录" << endl;
			break;
		default:
			break;
		}
	}
	delete pList;
	pList = NULL;

	system("pause");
	return 0;
}


链表类的声明与定义:
--头文件

#pragma once
#ifndef LIST_H_
#define LIST_H_

#include"Node.h"

class List
{
public:
	List();
	~List();
	void ClearList();
	int ListLength();
	bool isEmpty();
	bool GetElem(int i, Node *pNode);
	int LocateElem(Node *pNode);
	bool PriorElem(Node *pcurrentNode, Node *pPreNode);
	bool NextElem(Node *pcurrentNode, Node *pNextNode);
	bool ListInsert(int i, Node *pNode);
	bool ListDelete(int i, Node *pNode);
	bool ListInsertHead(Node *pNode);
	bool ListInsertTail(Node *pNode);
	void ListTraverse();
private:
	Node *m_pList;
	int m_iLength;
};



#endif // !LIST_H_


--CPP文件:

#include "List.h"

List::List()
{
	m_pList = new Node;
	m_pList->data.m_sName = "";
	m_pList->data.m_sPhone = "";
	m_pList->next = NULL;
	m_iLength = 0;

}

List::~List()
{
	ClearList();
	delete m_pList;
	m_pList = NULL;

}

void List::ClearList()
{
	Node *currentNode = m_pList->next;
	while (currentNode->next != NULL)
	{
		Node *currentNodeNext = currentNode->next;
		delete currentNode;
		currentNode = currentNodeNext;
	}
	m_iLength = 0;
}

int List::ListLength()
{
	return m_iLength;
}

bool List::isEmpty()
{
	return m_iLength == 0 ? true : false;
}

bool List::GetElem(int i, Node * pNode)
{
	if (i < 0 || i >= m_iLength)
	{
		return false;
	}
	Node *currentNode = m_pList->next;
	for (int k = 0; k < i; k++)
	{
		currentNode = currentNode->next;
	}
	pNode->data = currentNode->data;
	return true;
}

int List::LocateElem(Node * pNode)
{
	Node *currentNode = m_pList;
	int count = 0;
	while (currentNode->next!=NULL)
	{
		currentNode = currentNode->next;
		if (currentNode->data == pNode->data)
			return count;
		count++;
	}
	return -1;
}

bool List::PriorElem(Node * pcurrentNode, Node * pPreNode)
{
	Node *currentNode = m_pList;
	Node *currentNodeBefore = NULL;
	while (currentNode->next != NULL)
	{
		currentNodeBefore = currentNode;
		currentNode = currentNode->next;
		if (currentNode->data == pcurrentNode->data)
		{
			if (currentNodeBefore == NULL)
				return false;
			pPreNode->data = currentNodeBefore->data;
			return true;
		}
	}
	return false;
}

bool List::NextElem(Node * pcurrentNode, Node * pNextNode)
{
	Node *currentNode = m_pList;
	while (currentNode->next != NULL)
	{
		currentNode = currentNode->next;
		if (currentNode->data == pcurrentNode->data)
		{
			if (currentNode->next == NULL)
			{
				return false;
			}
			pNextNode->data = currentNode->next->data;
			return true;
		}
	}
	return false;
}

bool List::ListInsert(int i, Node * pNode)
{
	if (i < 0 || i > m_iLength)
	{
		return false;
	}
	Node *currentNode = m_pList;
	for (int k =0; k < i; k++)
	{
		currentNode = currentNode->next;	//currentNode的位置为i-1
	}
	Node *newNode = new Node;
	if (newNode == NULL)
	{
		return false;
	}
	newNode->next = currentNode->next;
	currentNode->next = newNode;
	newNode->data = pNode->data;
	m_iLength++;
	return true;
}

bool List::ListDelete(int i, Node * pNode)
{
	if (i < 0 || i >= m_iLength)
	{
		return false;
	}
	Node *currentNode = m_pList;
	Node *currentNodeBefore = NULL;
	for (int k = 0; k <= i; k++)
	{
		currentNodeBefore = currentNode;	//currentNodeBefore的位置为i-1
		currentNode = currentNode->next;	//currentNode的位置为i
	}
	currentNodeBefore->next = currentNode->next;
	pNode->data = currentNode->data;
	delete currentNode;
	currentNode = NULL;
	m_iLength--;
	return true;
}

bool List::ListInsertHead(Node * pNode)
{
	Node *temp = m_pList->next;
	Node *newNode = new Node;
	if (newNode == NULL)
	{
		return false;
	}
	newNode->data = pNode->data;
	m_pList->next = newNode;
	newNode->next = temp;
	m_iLength++;
	return true;
}

bool List::ListInsertTail(Node * pNode)
{
	Node *currentNode = m_pList;
	while (currentNode->next != NULL)
	{
		currentNode = currentNode->next;
	}
	Node *newNode = new Node;
	if (newNode == NULL)
	{
		return false;
	}
	*newNode = *pNode;
	newNode->next = NULL;
	currentNode->next = newNode;
	m_iLength++;
	return true;
}


void List::ListTraverse()
{
	Node *currentNode = m_pList;
	while (currentNode->next != NULL)
	{
		currentNode = currentNode->next;
		currentNode->printNode();
	}
}

Person类:

--头文件

#pragma once
#ifndef PERSON_H_
#define PERSON_H_

#include<string>
using namespace std;
class Person
{
	friend ostream& operator<<(ostream& out, Person &person);
public:
	string m_sName;
	string m_sPhone;
	Person& operator=(Person &person);
	bool operator==(Person &person);
};

#endif // !PERSON_H_

--CPP文件:
#include "Person.h"

Person & Person::operator=(Person & person)
{
	this->m_sName = person.m_sName;
	this->m_sPhone = person.m_sPhone;
	return *this;
	// TODO: 在此处插入 return 语句
}

bool Person::operator==(Person & person)
{
	return this->m_sName == person.m_sName&&this->m_sPhone == person.m_sPhone ? true : false;
}

ostream & operator<<(ostream & out, Person & person)
{
	out << "姓名:" << person.m_sName << endl;
	out << "号码:" << person.m_sPhone << endl;
	return out;
	// TODO: 在此处插入 return 语句
}

Node类:

#pragma once
#ifndef NODE_H_
#define NODE_H_
 
#include<iostream>
#include"Person.h"
using namespace std;

class Node {
public:
	Person data;
	Node *next;
	void printNode();
};

#endif // !NODE_H_

#include "Node.h"

void Node::printNode()
{
	cout << data << endl;
}


C++用链表存放数据 用链表存放数据在插入和删除操作时比用线性表方便很多,链表不用去移动那些位置的数据。 这是用链表实现的简单通讯录,先上代码 /* * 程序功能:用链表储存学生通讯录信息 * 作者:BossMao * 版本:2.0 */ #include #include using namespace std; struct student_Info{ double stu_Num; //学生学 阅读详情

相关推荐

C++链表实现简单通讯录

通讯录简单介绍 通讯录这东西,相信大家日常生活中都会见到。我们可以联想一下,既然我们要实现通讯录,那么就要搞清楚通讯录里面有什么。这里面有联系人名字,联系人号码(这些是属性),还有简单的一些功能,比如说添加联系人,删除联系人,查找联系人,当你发现号码错误的时候,就需要修改联系人号码了(我们查找联系人一般都是根据名字来查找),这四个都是基本的功能,实现以上三个操作后,我们还可以浏览通讯录,看看通讯录...

weixin_44346470的博客 3928

C++ 使用顺序表实现通讯录

C++ 使用顺序表实现通讯录 数据结构的作业,先放在这,以后有空就看一下。 查找&删除:按姓名,分别进入对应程序,查找到的信息单行显示,删除失败不进行任何改变。 插入:输入需要插入的人数和分别的姓名和电话号码来进行插入,人数超过初始化开辟的空间时,申请另一片空间,姓名重复时,提示重新输入。 显示:界面显示最新的联系人信息以及联系人数量。 销毁:退出时先销毁通讯录。 #include <string> #include <iostream> #define DEFAULT

Z_XiYu的博客 3129

数据结构课程设计——通讯录制作

一、课程设计题目 李刚是一爱折腾的人,当然爱折腾的人均有梦想,他想当中国的盖次呢。可不,现在个人好友信息多了,复杂了,他想制作一个个人通讯录的制作管理软件。 刚好这个学期学了数据结构课,所以他准备使用数据结构知识来实现了。并考虑使用双向链表作数据结构。并制定了初步要求:   (1)每个好友信息包含姓名、性别、住址、邮编、几岁、电话、QQ、微信帐号、生日等。   (2)作为一个完整的系统,

JiyuChen1的专栏 1万+

【C/C++】【数据结构】通讯录——链表实现

  实现功能有: 1.新建,添加联系人,理论上没有上限 2.查看当前通讯录内所有联系人 3.以名字为索引查找联系人 4.以名字为索引修改联系人 5.以名字为索引删除联系人 6.按名字ASCII码值从小到大排序 7.按下按键esc退出 8.十分贴心地把字体调成了红色。     头文件 linkbook.h #ifndef _LINKBOOK_H #define _LINK...

乞木的博客 2032

一个很Low的通讯录管理系统(但是能用)C/C++单链表实现

通讯录管理系统的设计 问题需求分析 在计算机还未普及之前通讯管理都是由联系人采用名片,通讯录往往采用的是笔录手工记帐的方式来操作的。现在一般的通讯录管理都是采用计算机作为工具的实用的计算机通讯录管理程序来帮助人们进行更有效的通讯录信息管理。本通讯录信息管理系统用计算机管理电子通讯录的一种计算机应用技术的创新,通讯录管理系统是典型的信息管理系统,其开发主要包括后台文件存储通信用户记录和维护,以及客户...

菜鸡逆袭的博客 1521

数据结构课程设计——双链表通讯录

李刚是一爱折腾的人,当然爱折腾的人均有梦想,他想当中国的盖次呢。可不,现在个人好友信息多了,复杂了,他想制作一个个人通讯录的制作管理软件。 刚好这个学期学了数据结构课,所以他准备使用数据结构知识来实现了。并考虑使用双向链表作数据结构。并制定了初步要求: (1)每个好友信息包含姓名、性别、住址、邮编、几岁、电话、QQ、微信帐号、生日等。 (2)作为一个完整的系统,应具有友好的

FQB1210的专栏 3222

数据结构——通讯录(基于顺序表实现)

基于顺序表实现通讯录

YUYUJOB的博客 1003

数据结构课程设计报告 单位员工通讯录管理系统(线性表的应用)

题目1、单位员工通讯录管理系统(线性表的应用) [问题描述] 为某个单位建立一个员工通讯录管理系统,可以方便查询每一个员工的办公室电话、手机号、及电子邮箱。其功能包括通讯录链表的建立、员工通讯信息的查询、修改、插入与删除、以及整个通讯录表的输出。 [实现提示] 可以采用单链表的存储结构,如可定义如下的存储结构: typedef struct { /*员工通讯信息的结构类型定义*/ ...

永远在奔跑的学习者 4460

【数据结构】顺序表(实现+详解+源码+通讯录项目(静态+动态+文件保存))

概念及结构 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。 顺序表一般可以分为: 静态顺序表:使用定长数组储存元素。 动态顺序表:使用动态开辟的数组储存。 ...

Edward_Asia的博客 2万+

数据库课程设计——通讯录

             《数据结构课程设计》             课程题目             个人通讯录管理系统 课程编号            j1620102

chenccee的专栏 4426

C++数据结构实战:通讯录管理程序设计与实现

在现代软件开发中,通讯录管理系统是一个经典的入门级项目,它不仅涵盖了基础的数据结构与算法,还融合了面向对象编程(OOP)的核心思想。本项目采用C++语言实现,旨在通过一个实际应用场景,深入理解类与对象的设计、数据结构的选择与应用、以及程序的健壮性设计。系统核心功能包括联系人的增删改查、快速检索、数据持久化存储等。设计上采用面向对象的方式,通过Contact类表示单个联系人,类管理所有联系人,并结合std::list和等STL容器提升性能与可维护性。

weixin_33506815的博客 1993

C语言实现通讯录制作-链表学习案例(C/C++)

使用单链表完成的通讯录小项目制作,文章只是算法思想和如何做的的一种总结,完整的源码在我的资源中获取,最主要的目的是学习单链表的数据结构

EMCred的博客 4638

Ollama部署本地大模型详细教程

创建ModelfilePARAMETER num_gpu 50 # GPU 层卸载比例(0~100)场景是否推荐本地开发/测试 Agent✅ 强烈推荐内部知识库问答(RAG)✅ 推荐(配合 Pgvector)生产环境高并发服务⚠️ 谨慎(建议评估 vLLM / Triton)需要 Function Calling 的 Agent❌ 不推荐(改用 DashScope API)🔑核心价值Ollama 是“本地大模型的 Docker”——让开源模型像容器一样 easy to run。

我们的征途是星辰大海 2625

用C++实现链表版本通讯录

#include #include using namespace std; class Address; class Contact{ private: string name; string sex; string tel; string QQ; string address; string addition; Contact *next; public:

qq_38076413的博客 1821

利用ORCAD/pspice 仿真分析电路的幅度相位谱

利用ORCAD的pspice仿真分析电路的相位谱1.介绍2.搭建电路原理图3.建立仿真文件,进行交流分析4.仿真、查看输出5.总结 1.介绍 orcad配合pspice一直是电路原理图绘制和仿真的主要工具,pspice工具提供了诸如暂态分析、直流分析、交流分析等多个工具。学校主要教的是multisim,对orcad讲得很少,最进要利用orcad对运放构成的电路的频响、相移特性进行分析,发现资料幅度...

qq_40011737的博客 1万+

数据结构与算法 —— 最短路径Dijkstra算法(迪杰斯特拉)详细图解以及python实现

前两章我们讲到了关于图的基本知识,和广度/深度优先搜索。本章,我们将介绍加权图和最短路径的相关知识。最短路径和最小生成树是图论中常见的问题。最短路径是指在一个图中找到两个节点之间的最短路径,最小生成树是指在一个图中找到一个连通子图,使得所有节点都能够互相到达,且总权值最小。最短路径算法常见的有floyd算法(弗洛伊德算法)和 dijkstra算法(迪杰斯特拉)。本文只介绍dijkstra算法。最短路径运用非常广泛,比如在导航系统中,确定两个地点间哪条路线最短;

‘’ 2万+

数据结构课程设计-------双链表实现个人通讯录

一、实训目的 通过课程设计,学会运用数据结构知识,针对具体应用,自己设计合理数据结构,确定存储结构,并能设计具体操作算法,选择使用具体语言进行实现。掌握 C++较复杂程序的组织和设计过程,调试技巧。学习解决实际问题的能力。二、实训环境 VC++6.0 环境用C++语言实现。三、课程设计题目李刚是一爱折腾的人,当然爱折腾的人均有梦想,他想当中国的盖次呢。可不,现在个人好友信息多了,复杂了,他想制作一...

x1432553805的博客 4643

C#实战:如何用winmm.dll打造毫秒级高精度定时器(附完整代码)

本文详细介绍了在C#中利用winmm.dll实现毫秒级高精度定时器的完整方案。针对.NET内置定时器精度不足的问题,通过调用timeSetEvent等原生API,提供了超越系统时钟中断周期的精准定时能力。文章包含核心原理剖析、完整的封装类代码以及音视频处理、游戏开发等场景下的实战应用与性能调优指南。

ujm5678901的博客 690

C++ 双向链表简单实现通讯录

#include<iostream> #include <stdlib.h> #include<string> using namespace std;//定义个结构体目录 typedef struct Directory { string Name; string Mobile; //手机 string Wechatnumber; /

Saser_的博客 3557

maxwell与steady state thermal 通过workbench耦合仿真

文章目录maxwellsteady state thermal maxwell 1加入maxwell并打开 2导入模型 3选择求解器类型:涡流求解器eddy current 4修改模型名字不能带_等特殊符号 5为模型赋材料 6设立3D边界,各边电流进出方向为0其余方向300 7设置激励条件,可设置电流大小,相位,方向 8设置集肤深度,选取中间铜导体的体然后设置,如何设置看帮助文档 9求解设置 迭代步数 收敛精度 交流电频率 10验证条件满足计算 11求解 发现无法求解,删除ai

roymustang的博客 9201

使用xlwings在Python中对Excel表格进行操作是非常方便的,可以实现自动化处理、批量数据处理等功能

使用xlwings在Python中对Excel表格进行操作是非常方便的,可以实现自动化处理、批量数据处理等功能。本篇文章主要介绍如何使用xlwings对Excel表格进行多行多列数据设置和操作,并给出相应的源代码。接着,我们可以对这个范围内的所有单元格进行操作,如设置字体颜色、填充颜色、对齐方式等。以上就是使用xlwings对Excel表格进行多行多列数据操作和设置字体颜色、填充色和对齐方式的全部内容。最后,我们可以将数据写入到单元格中,也可以从单元格中读取数据。在Excel中,可以通过。

BUG?不存在的! 713

双向链表-(增删减改)+双链表实现通讯录项目

双链表是线性表的链式存储结构的一种,它除了包含线性表所具有的数据元素外,每个数据元素还包含两个指针,分别指向前一个元素和后一个元素。这样,通过这两个指针,就可以很方便地访问双链表中的任何一个元素的前驱和后继。在双链表中,每个节点通常包含三个部分:1. 数据域:用于存储节点的数据。2. 左指针域:指向节点的前一个节点。3. 右指针域:指向节点的后一个节点。双链表的主要特点和优势如下:- 删除和插入操作更加高效,因为可以直接通过指针跳转到前一个或后一个节点,不需要像数组那样进行搬移操作。

Jason_from_China的博客 1942

微信小程序:errno: 1500104, errCode: 10008, errMsg: “writeBLECharacteristicValue:fail:system error, status

微信小程序errno: 1500104, errCode: 10008, errMsg: "writeBLECharacteristicValue:fail:system error, status: UNKNOWN (239)"微信小程序调用蓝牙API,wx.writeBLECharacteristicValue()报错,微信小程序蓝牙写入错误,在开发uniapp微信小程序蓝牙通信功能时报错,蓝牙开发设备控制核心api,微信小程序调用蓝牙API “wx.writeBLECharacteristicValu

✅ 精选推荐文章 3930

基于QT实现的通讯录

基于QT实现的通讯录一、题目要求二、概要设计三、详细设计1、数据结构2、功能模块1)导入数据2)点击添加按钮3)点击保存按钮4)双击联系人姓名(1)对话框设计(2)显示(3)修改信息并点击保存按钮(4)点击删除按钮5)查询四、运行结果 一、题目要求 通讯录管理程序的设计 ①利用MFC的向导,创建基于对话框的应用程序,设计操作界面; ②设计通讯录的数据结构(如:以数组或者动态链表)和相应的类; ③完成对通讯录中记录的增加、修改、删除和显示。 ④能够按照姓名或电话号码等关键字进行查询。 ⑤能够将通讯录信息用文件

波仔头的博客 7939

ESP32设备驱动-直流电机与L298N电机驱动器

在本文中,我们将介绍如何使用ESP32通过L298N电机驱动器驱动直流电机。

视觉与物联智能 3593

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

单链表实现简单通讯录c语言,C++双向链表实现简单通讯录

#include#include#include #includeusing namespace std;typedef struct Directory{string Name;string Mobile;string Wechatnumber;string STREET;string CITY;string EIP;string STATE;struct Directory* next;str...

weixin_28907839的博客 472

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

上一篇: 《数据结构之链表篇》--单向链表的C++实现
下一篇: 《数据结构之树篇》--二叉树的数组实现
wingWC
博客等级 码龄10年 46粉丝 73原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值