《数据结构之链表篇》--简单通讯录的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

LAMMPS+Phonopy计算声子色散曲线

机器学习训练完势函数之后,需要对加以验证。对于晶体而言,色散曲线是其衡量计算是否准确的最重要标准,当然,还有能量,比热,RDF等性质。

qq_68842798的博客 3462

用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

ABAP动态填充Word模板:基于cl_docx_document的XML替换方案

本文详细介绍了ABAP中基于cl_docx_document类的动态Word模板填充方案。该方案通过直接操作DOCX文件的XML核心,完美解决了传统OLE/DOI方法在格式保真、性能和后台运行方面的痛点,是实现复杂、批量Word文档生成的优雅解决方案。

gpt4scribbler的博客 526

Qcom camera hal简介

Qcom camera hal简介

weixin_42136255的博客 7764

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

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

x1432553805的博客 4643

用Python手把手教你实现一个多层感知机(MLP)——从理论到代码实战

本文详细介绍了如何使用Python和Theano库从零开始实现多层感知机(MLP),涵盖从核心原理到代码实战的全过程。通过构建隐藏层、输出层和完整MLP模型,结合权重初始化、激活函数选择和训练技巧,帮助开发者深入理解神经网络工作机制,并应用于实际机器学习任务。

web39explorer的博客 970

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

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

Saser_的博客 3557

AI之KE:Knowledge Engineering知识工程的简介、发展、应用案例之详细攻略

AI之KE:Knowledge Engineering知识工程的简介、发展、应用案例之详细攻略 目录 Knowledge Engineering知识工程的简介 0.1、What 0.2、How 0.3、Why 1、知识工程过程的5个活动 2、知识图谱的应用 Knowledge Engineering知识工程的发展 1、前知识工程时期——1950-1970时期:图...

头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 5335

大模型——AI对话四象限

{ "摘要": "文章揭示了90%的人不会有效与AI沟通的问题,指出简单粗暴的提问只能得到标准答案。作者提出'AI对话四象限'模型:1)双方都懂时提效;2)AI懂但需学会分层提问;3)共同探索未知领域;4)向AI传授独家知识。强调沟通技巧的重要性,认为会提问的人不会被AI替代。最后呼吁读者尝试四象限思维,与AI碰撞火花。" }

312

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

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

Jason_from_China的博客 1942

MIKE21 MIKE软件 教程 0.1 软件介绍与教学目录

MIKE 21是一个专业的工程软件包,用于模拟河流、湖泊、河口、海湾、海岸及海洋的水流、波浪、泥沙及环境问题。在MIKE Zero集成平台中,主要有MIKE11,MIKE21,MIKE3三类软件,分别对应一维,二维,三维的水动力模型模拟。同时还包括MIKE HYDRO,MIKE FLOOD等其他功能,各软件的具体介绍请参考DHI公司的官方文档,在此不作赘述。学习过程中,对于任何操作界面的疑问,建议大家仔细阅读帮助文档(在有疑问的界面按F1调出),同时官方也提供了对应的线上和线下教学服务(免费+收费)。

Hello Word 2万+

基于QT实现的通讯录

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

波仔头的博客 7939

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

单链表实现简单通讯录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

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值