哇、、、、C++ 实现单向链表

之前相关的文章

C语言,链表

Linux内核链表

#什么是链表

链表是一种基本的数据结构,之前我在C语言里面写过链表的知识,现在延申到C++,不管是什么语言,链表表示的是一种数据结构,跟语言没有强相关性的。

如果我们需要实现一个链表,首先最关键的就是节点,一个节点表示链表的一个数据存储点,链表是由很多个节点组成的。

链表还需要很多线把很多节点串联在一起,可以用数组的特性串联,也可以用指针串联。

/*节点类*/ 
class Node
{
public:DataType data;Node *next;
};

#链表头部

链表是一种数据结构,跟数组一样,和整型的数据一样,都需要一个起始位置,链表头就是这个起始位置,链表头存在,就表示链表存在,链表头没有了,那这个链表也就没有了。

链表头也是一个节点,只是这个节点保存的是这个链表的起始位置

头节点有点意思,它其实是不需要存储数据的,所以data的值可有可无。

代码上我们可以这样写,创建一个链表也就是创建一个链表头

LinkList::LinkList()
{head = new Node;head->data = 0;head->next = NULL;size = 0;
}

#插入一个数据到链表中

如果是一个已经成型的链表,我们要把一个数据插入到链表中,我们需要有几个判断,是从链表头插入,还是链表尾部插入,还是从链表的中间插入

— — 如果从链表头插入,如下图

— — 如果从链表中间插入,如下图

— — 如果从链表尾部插入,如下图

— —代码实现

int LinkList::InsertLinklList(Node *data, int n)
{Node *ptemp;if (this->head == NULL) {cout << "链表为空" << endl;return -1;}if (data == NULL) {cout << "插入节点为空" << endl;return -1;}/*头部插入*/ if (n<2) {Node *pnew = new Node;pnew->data = data->data;pnew->next = this->head->next;this->head->next = pnew;this->size++;return 0;}/*尾部插入*/ if (n > this->size) {ptemp = this->head;while (ptemp->next != NULL) {ptemp = ptemp->next;}Node *pnew = new Node;pnew->data = data->data;pnew->next = NULL;ptemp->next = pnew;this->size++;return 0;}else {/*中间插入*/ ptemp = this->head;for (int i = 1; i < n; i++) {ptemp = ptemp->next;}Node *pnew = new Node;pnew->data= data->data;pnew->next = ptemp->next;ptemp->next = pnew;this->size++;return 0;}
}

#完整的代码

#include <string>
#include <iostream>
using namespace std;/*节点类*/
class Node
{
public:int data;Node *next;
};class LinkList
{
public:LinkList();/*构造函数*/~LinkList();/*析构函数*/int CreateLinkList(int size);/*新建一个链表*/int DestroyLinkList();/*销毁一个链表*/int TravalLinkList();/*遍历一个链表*/int InsertLinklList(Node *data, int n);/*向链表插入一个数据*/int DeleteLinklist(int n);/*删除链表中的某个值*/int GetLength();/*获取链表的长度*/bool IsEmpty();/*判断链表是否为空*/Node *head;/*链表头*/int size;/*链表长度*/
};LinkList::LinkList()
{head = new Node;head->data = 0;head->next = NULL;size = 0;
}LinkList::~LinkList()
{delete head;
}int LinkList::CreateLinkList(int n)
{if (n<0) {cout<<"error"<<endl;return -1;}Node *ptemp = NULL;Node *pnew = NULL;this->size = n;ptemp = this->head;for(int i =0 ; i<n ; i++){pnew = new Node;pnew->next = NULL;cout << "输入第" << i+1 << "个节点值" << endl;cin >> pnew->data;ptemp->next = pnew;ptemp = pnew;}cout << "创建完成" << endl;return 0;
}int LinkList::DestroyLinkList()
{Node *ptemp;if (this->head == NULL) {cout << "链表原本就为空" << endl;return -1;}while (this->head){ptemp = head->next;free(head);head = ptemp;}cout << "销毁链表完成" << endl;return 0;
}int LinkList::TravalLinkList()
{Node *ptemp = this->head->next;if (this->head == NULL) {cout << "链表为空" << endl;return -1;}while(ptemp){cout << ptemp->data << "->";ptemp = ptemp->next;}cout <<"NULL"<< endl;return 0;
}int LinkList::InsertLinklList(Node *data, int n)
{Node *ptemp;if (this->head == NULL) {cout << "链表为空" << endl;return -1;}if (data == NULL) {cout << "插入节点为空" << endl;return -1;}/*头部插入*/if (n<2) {Node *pnew = new Node;pnew->data = data->data;pnew->next = this->head->next;this->head->next = pnew;this->size++;return 0;}/*尾部插入*/if (n > this->size) {ptemp = this->head;while (ptemp->next != NULL) {ptemp = ptemp->next;}Node *pnew = new Node;pnew->data = data->data;pnew->next = NULL;ptemp->next = pnew;this->size++;return 0;}/*中间插入*/else {ptemp = this->head;for (int i = 1; i < n; i++) {ptemp = ptemp->next;}Node *pnew = new Node;pnew->data= data->data;pnew->next = ptemp->next;ptemp->next = pnew;this->size++;return 0;}
}int LinkList::DeleteLinklist(int n)
{Node *ptemp;Node *ptemp2;if (n > this->size) {cout << "n太大" << endl;return -1;}/*删头节点*/if (n < 2) {ptemp = this->head->next;this->head->next = ptemp->next;free(ptemp);this->size--;return 0;}/*尾部删除*/if (n == this->size) {ptemp = this->head;for (int i = 1; i < this->size;i++) {ptemp = ptemp->next;}ptemp2 = ptemp->next;ptemp->next = NULL;free(ptemp2);this->size--;return 0;}/*中间删除*/else{ptemp = this->head;for (int i = 1; i < n; i++) {ptemp = ptemp->next;}ptemp2 = ptemp->next;ptemp->next = ptemp2->next;free(ptemp2);this->size--;return 0;}
}int LinkList::GetLength()
{return this->size;
}bool LinkList::IsEmpty()
{if (this->head == NULL) {return true;}else{return false;}
}int main(void)
{LinkList list;LinkList *plist = &list;/*创建6个节点的链表*/plist->CreateLinkList(5);plist->TravalLinkList();/*向链表中插入一个数据*/Node temp;temp.data = 77;temp.next = NULL;/*向0号位置插入一个节点*/plist->InsertLinklList(&temp, 0);/*遍历整个链表*/plist->TravalLinkList();/*向尾部插入一个链表*/plist->InsertLinklList(&temp, plist->GetLength()+1);/*遍历整个链表*/plist->TravalLinkList();/*向5号位置插入一个链表*/plist->InsertLinklList(&temp, 5);/*遍历整个链表*/plist->TravalLinkList();plist->DeleteLinklist(0);/*遍历整个链表*/plist->TravalLinkList();/*删除第二个节点*/plist->DeleteLinklist(4);/*遍历整个链表*/plist->TravalLinkList();/*删除整个链表*/plist->DestroyLinkList();system("pause");return (0);
}

#代码输出

输入第1个节点值
2
输入第2个节点值
22
输入第3个节点值
3
输入第4个节点值
44
输入第5个节点值
5
创建完成
2->22->3->44->5->NULL
77->2->22->3->44->5->NULL
77->2->22->3->44->5->77->NULL
77->2->22->3->77->44->5->77->NULL
2->22->3->77->44->5->77->NULL
2->22->3->44->5->77->NULL
销毁链表完成
请按任意键继续. . .

推荐阅读:

专辑|Linux文章汇总

专辑|程序人生

专辑|C语言

我的知识小密圈


嵌入式Linux

微信扫描二维码,关注我的公众号


下面是我的僚机号,欢迎大家关注
 

写代码的篮球球痴

微信扫描二维码,关注我的公众号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466903.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vmware与windows共享文件夹

vmware与windows共享文件夹 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 虚拟工具安装好之后&#xff0c;我们就可以在windows和linux设置一个共享目录了,继续看图干活。 设置好共享目录以后&#xff0c;打开终端输入以下命令&#xff0c;就可以再…

asp.net如何取得纯客户端控件的值

例一&#xff1a;纯客户端控件 <input name"edisundong"type"text">在服务器端取得的方法 stringstrvalueRequest.Form.Get("edisundong");例二&#xff1a;纯客户端控件 <input type"radio"name"sex"value"…

C++ const限定符和auto类型说明符

const限定符# 1.限定常量有时我们希望定义这样的变量&#xff1a;它的值不能被改变。为了满足这一要求&#xff0c;我们使用const对变量的类型加以限定&#xff1a;const int bufSize 512;这样就把bufSize定义成了一个常量&#xff0c;它的值不能再发生变化。所以这也就意味着…

Flume框架基础

* Flume框架基础 框架简介&#xff1a; ** Flume提供一个分布式的&#xff0c;可靠的&#xff0c;对大数据量的日志进行高效收集、聚集、移动的服务&#xff0c;Flume只能在Unix环境下运行。 ** Flume基于流式架构&#xff0c;容错性强&#xff0c;也很灵活简单&#xff0c;主要…

tensorflow的安装

安装好adaconda软件&#xff0c;打开 adaconda prompt anaconda search -t conda tensorflow 查看conda create -n tensorflow python3.5 配置python3.5环境选择 yes 进行安装activate tensorflow 激活tensorflowpip install tensorflow 安装 然后打开adaco…

昨晚三巨头聚餐,顺便聊了这三个问题

今天老何找我们吃饭&#xff0c;我和老何还有老墨是邻居&#xff0c;三年前我们就认识了&#xff0c;而且关系还不错&#xff0c;但是今年疫情的原因我们都没聚过&#xff0c;上周六本来说好要聚一下&#xff0c;但又因为周末带娃的原因又没聚成&#xff0c;今天我在微信群上说…

决策树 算法原理及代码

决策树可以使用不熟悉的数据集合&#xff0c;并从中提取出一系列的规则&#xff0c;这是机器根据数据集创建规则的过程&#xff0c;就是机器学习的过程。用一个小案例分析&#xff1a;通过No surfacing 和 flippers判断该生物是否是鱼&#xff0c;No surfacing 是离开水面是否…

深度好文|面试官:进程和线程,我只问这19个问题

# 干了这碗鸡汤&#xff01;我急切地盼望着可以经历一场放纵的快乐&#xff0c;纵使巨大的悲哀将接踵而至&#xff0c;我也在所不惜。-- 太宰治 《人间失格》大家好&#xff0c;这里是周日凌晨4点&#xff0c;仍在笔耕不辍的程序喵大人。下面隆重推出我呕心沥血&#xff0c;耗时…

终于有人将进程间通信讲明白了

使用多进程协作来实现应用和系统是一种被广泛使用的开发方法。多进程协作主要有以下三点优势。将功能模块化&#xff0c;避免重复造轮子。增强模块间的隔离&#xff0c;提供更强的安全保障。提高应用的容错能力。进程间通信&#xff08;Inter-Process Communication&#xff0c…

神舟本本放心率

总得票8520 可以放心购买 22.0% 1942票 不太放心 64.0% 5510票 看情况 12.0% 1068票投票起止时间&#xff1a;2007-11-15 至2008-11-22转载于:https://www.cnblogs.com/badapple126/archive/2007/11/16/962020.html

梯度下降算法

在学习逻辑回归时&#xff0c;对梯度上升算法进行了应用&#xff0c;看到其他的博客讲解&#xff0c;梯度上升算法适合求最大值&#xff0c;梯度下降算法适合求最小值&#xff0c;这里有一个分析&#xff1a;梯度上升算法公式是学习率&#xff0c;是一个常数。这个是根据逻辑回…

花了一个深夜,才用C语言写了一个2048游戏雏形

12年我毕业的第二个月工资&#xff0c;我就买了一个IPAD&#xff0c;然后在IPAD上下了一个2048游戏&#xff0c;玩起来非常爽。然后这几天看到好几个公众号都发了自己写这个游戏的代码&#xff0c;然后我自己也想试试&#xff0c;所以就有了这篇文章&#xff0c;写代码还是很有…

向银行贷款20万, 分期三年买50万的车,个人借款40万, 贷款10年买200万的房子,再贷款120万分创业...

向银行贷款20万按1年期贷款利率为&#xff1a;6%&#xff0c;若按年还贷款&#xff0c;银行贷款利息为&#xff1a;200&#xff0c;000*6%12&#xff0c;000。连本带息&#xff1a;20*106%21.2万分期三年买50万的车 贷款总额30万 年利率按10%算&#xff0c;分三年还清&#xff…

集成算法——Adaboost代码

集成算法是我们将不同的分类器组合起来&#xff0c;而这种组合结果就被称为集成方法或者是元算法。使用集成方法时会有多种形式&#xff1a;可以是不同算法的集成&#xff0c;也可以是同意算法在不同设置下的集成&#xff0c;还可以是数据集不同部分分配给不同分类器之后的集成…

年终抽奖来了

时间很快&#xff0c;2020年已经到了12月份&#xff0c;我从2018年开始写公众号&#xff0c;经过了快两年是时间&#xff0c;我收获了4万的读者&#xff0c;非常开心。我自己是一个挺逗逼的人&#xff0c;而且我写公众号并不觉得我比别人厉害&#xff0c;技术上我真的就是一个很…

嵌入式 Linux下永久生效环境变量bashrc

作者&#xff1a;skdkjxy原文&#xff1a;http://blog.sina.com.cn/s/blog_8795b0970101f1f9.html.bashrc文件 在linux系统普通用户目录&#xff08;cd /home/xxx&#xff09;或root用户目录&#xff08;cd /root&#xff09;下&#xff0c;用指令ls -al可以看到4个隐藏文件&am…

回归分析——线性回归

机器学习中&#xff0c;对于离散的数据可以做分类问题&#xff0c;那对于连续的数据就是做回归问题&#xff0c;这里对一元线性回归和多元线性回归做一个简介&#xff0c;帮组理解。回归分析&#xff1a;从一组样本数据出发&#xff0c;确定变量之间的数学关系式&#xff0c;对…

编译原理(五)自底向上分析之算符优先分析法

自底向上分析之算符优先分析法 说明&#xff1a;以老师PPT为标准&#xff0c;借鉴部分教材内容&#xff0c;AlvinZH学习笔记。 基本过程 1. 一般方法&#xff1a;采用自左向右地扫描和分析输入串&#xff0c;从输入符号串开始&#xff0c;通过反复查找当前句型的句柄&#xff0…

做Android开发,要清楚init.rc里面的东西

init.rc 复习看这个之前&#xff0c;先看看大神总结的文章这篇文章总结的非常到位&#xff0c;但是因为代码不是最新的Android版本&#xff0c;对我们最新的Android版本不适用。http://gityuan.com/2016/02/05/android-init/#init rc文件拷贝拷贝其实也就是把文件放到机器的某个…

宏比较值,坑的一B

昨晚上&#xff0c;我准备睡觉&#xff0c;连总给我发了一段代码#include "stdio.h"#define MAX_MACRO(a, b) ((a) > (b) ? (a) : (b)) int MAX_FUNC(int a, int b) {return ((a) > (b) ? (a) : (b)); }int main() {unsigned int a 1;int b -1;printf(&quo…