数据结构--单链表single linked list数据结构C++实现

2018年2月开始学习的 C++ Primer,到今天2019年3月已经整整一年了,非常感谢在一起交流的小伙伴,是你们的无私帮助和分享使得我能跨越很多技术的坑,感谢你们!期待我们2019年一起拿下《数据结构与算法》以及Python入门。 

我的github代码链接https://github.com/hitskyer/course/tree/master/dataAlgorithm/chenmingming/linkedList 

单链表反转 参考他人博客https://blog.csdn.net/feliciafay/article/details/6841115

single_linkedlist.h

#ifndef LINKEDLIST_SINGLE_LINKEDLIST_H
#define LINKEDLIST_SINGLE_LINKEDLIST_H#include<iostream>
using namespace std;template<class ElemType>
struct LinkNode      //节点类
{ElemType _data;    //节点的数据LinkNode *_next;    //指向该节点的下一个节点的指针LinkNode(): _next(NULL){cout << "please enter data: ";cin >> _data;}LinkNode(const ElemType &d, LinkNode* p = NULL) : _data(d), _next(p) {}~LinkNode(){}
};
template <class ElemType> class Single_linkedlist
{LinkNode<ElemType> *p_head = NULL;   //首尾指针LinkNode<ElemType> *p_tail = NULL;int listlength = 0; //链表长度
public:Single_linkedlist(int len = 0); //构造函数(顺序插入)Single_linkedlist(char reverse, int len = 0); //构造函数(逆序插入)~Single_linkedlist()    //析构函数{deleteAll();  //释放new出来的节点}void deleteAll();   //删除所有节点void *get_p_head() const //返回头节点的位置,即头指针{return p_head;}void *get_p_tail() const //返回为节点的位置,即尾指针{return p_tail;}int getLength() const //返回链表长度{return listlength;}bool isEmpty() const    //判断链表是否为空{return listlength == 0;}ElemType getCurData(LinkNode<ElemType> *p) const  //返回当前节点的数据内容{return p->_data;}void addHead(const ElemType &data);    //在链表头部添加元素void addTail(const ElemType &data);     //在链表尾部添加元素LinkNode<ElemType>* find(int m) const; //按下标查找LinkNode<ElemType>* find(ElemType &data) const; //按元素值查找bool insertAtElemFront(const LinkNode<ElemType> &data, int i);    //在i号元素前插入新节点bool insertAtElemBack(const LinkNode<ElemType> &data, int i);    //在i号元素后插入新节点bool deleteElem(int i); //删除i号元素节点bool modifyElem(int i, const ElemType &data);   //修改i号元素的值LinkNode<ElemType>* reverse();  //链表反转(就地反转法)void printList() const; //打印链表数据};#include "single_linkedlist.cpp"    //模板实现文件,包含编译模型
#endif //LINKEDLIST_SINGLE_LINKEDLIST_H

 single_linkedlist.cpp

/** 内存泄漏总结:* 局部定义的指针,指向new出来的节点(堆空间),指针就可以返回* (如果指针没有指向堆空间,函数退出后,栈内的内容销毁,返回的指针也就是无效的)* 链表析构的时候delete 这些new出来的节点的地址(堆指针)*/
template <class ElemType> 
Single_linkedlist<ElemType>::Single_linkedlist(int len)
{LinkNode<ElemType> *curNode;for(int i = 0; i != len; ++i) {curNode = new LinkNode<ElemType>;if(i == 0) {p_head = curNode;p_tail = curNode;} else {p_tail->_next = curNode;p_tail = curNode;}++listlength;}
}
template <class ElemType> 
Single_linkedlist<ElemType>::Single_linkedlist(char reverse, int len)
{if(reverse == 'r' | reverse == 'R') {LinkNode<ElemType> *curNode, *prevNode;for(int i = 0; i != len; ++i) {curNode = new LinkNode<ElemType>;if(i == 0) {p_head = curNode;p_tail = curNode;prevNode = curNode;} else {curNode->_next = prevNode;p_head = curNode;prevNode = curNode;}++listlength;}} else {cout << "you should enter 'r' or 'R' to the second Parameter!" << endl;}
}template <class ElemType> 
void Single_linkedlist<ElemType>:: deleteAll()
{LinkNode<ElemType> *del_tempNode, *tempNode;del_tempNode = this -> p_head;while(del_tempNode != NULL) {tempNode = del_tempNode -> _next;delete del_tempNode;del_tempNode = tempNode;listlength--;}p_head = NULL;p_tail = NULL;
}template <class ElemType> 
LinkNode<ElemType>* Single_linkedlist<ElemType>::find(int m) const
{if(m < 0 | m >= listlength){cout << "位置不正确(位置序号从0开始)!" << endl;return NULL;}else{LinkNode<ElemType> *tempNode = p_head;for (int i = 0; i < m; ++i, tempNode = tempNode->_next){   //空函数体}return tempNode;}
}
template <class ElemType> 
LinkNode<ElemType>* Single_linkedlist<ElemType>::find(ElemType &data) const
{LinkNode<ElemType> *tempNode = p_head;for (; (tempNode != NULL) && (tempNode->_data != data); tempNode = tempNode->_next){   //空函数体}if(tempNode != NULL) {cout << "找到了指定元素!地址是:" << tempNode << endl;return tempNode;} else {cout << data << " is not exist!" << endl;return NULL;}
}
template <class ElemType> 
void Single_linkedlist<ElemType>::addHead(const ElemType &data)
{LinkNode<ElemType> *node = new LinkNode<ElemType>(data);if(p_head == NULL) {p_head = node;p_tail = node;} else {node->_next = p_head;p_head = node;}++listlength;cout << "新的链表是:\n";this->printList();cout << "链表的长度是:" << listlength << endl;
}
template <class ElemType> 
void Single_linkedlist<ElemType>::addTail(const ElemType &data)
{LinkNode<ElemType> *node = new LinkNode<ElemType>(data);if(p_tail == NULL) {p_head = node;p_tail = node;} else {p_tail->_next = node;p_tail = node;}++listlength;cout << "新的链表是:\n";this->printList();cout << "链表的长度是:" << listlength << endl;
}
template <class ElemType> 
bool Single_linkedlist<ElemType>::insertAtElemFront(const LinkNode<ElemType> &data, int i)
{LinkNode<ElemType> *node = new LinkNode<ElemType>(data);LinkNode<ElemType> *tempNode = p_head;if(i < 0 | i >= listlength){cout << "位置不正确(位置序号从0开始)!" << endl;return false;}else{if(this->find(i) == NULL){p_head = node;p_tail = node;}else{while(tempNode->_next != this->find(i)){tempNode = tempNode->_next;}node->_next = this->find(i);tempNode->_next = node;}++listlength;return true;}
}
template <class ElemType> 
bool Single_linkedlist<ElemType>::insertAtElemBack(const LinkNode<ElemType> &data, int i)
{LinkNode<ElemType> *node = new LinkNode<ElemType>(data);LinkNode<ElemType> *tempNode = p_head;if(i < 0 | i >= listlength){cout << "位置不正确(位置序号从0开始)!" << endl;return false;}else{if(this->find(i) == NULL){p_head = node;p_tail = node;}else{tempNode = this->find(i);node->_next = tempNode->_next;tempNode->_next = node;}++listlength;return true;}
}
template <class ElemType> 
bool Single_linkedlist<ElemType>::deleteElem(int i)
{LinkNode<ElemType> *tempNode = p_head, *deleteNode;deleteNode = this->find(i);if(i < 0 | i >= listlength){cout << "位置不正确(位置序号从0开始)!" << endl;return false;}else{if(deleteNode == NULL){return false;}else{while (tempNode->_next != deleteNode){tempNode = tempNode->_next;}tempNode->_next = deleteNode->_next;if (deleteNode == p_tail)p_tail = tempNode;delete deleteNode;--listlength;return true;}}
}
template <class ElemType> 
bool Single_linkedlist<ElemType>::modifyElem(int i, const ElemType &data)
{LinkNode<ElemType> *tempNode = p_head, *modifyNode;modifyNode = this->find(i);if(i < 0 | i >= listlength){cout << "位置不正确(位置序号从0开始)!" << endl;return false;}else{if(modifyNode == NULL){return false;}else{modifyNode->_data = data;return true;}}
}
template <class ElemType> 
LinkNode<ElemType>* Single_linkedlist<ElemType>::reverse()
{if(p_head == NULL || p_head->_next == NULL)return NULL;else    //就地反转法{LinkNode<ElemType> *prevNode, *nextNode, *tempNode;prevNode = p_head;nextNode = prevNode->_next;prevNode->_next = NULL;p_tail = prevNode;while(nextNode != NULL){tempNode = nextNode->_next;nextNode->_next = prevNode;prevNode = nextNode;nextNode = tempNode;}p_head = prevNode;return p_head;}
}
template <class ElemType> 
void Single_linkedlist<ElemType>::printList() const
{int m = 0;LinkNode<ElemType>* tempNode = p_head;for(; tempNode != NULL; tempNode = tempNode->_next){cout << "N.O[" << m++ << "] element "  << tempNode->_data << endl;}cout << "--------------------------------------" << endl;
}

 main_single_linkedlist.cpp

#include "single_linkedlist.h"
#include <iostream>
#include <string>int main()
{Single_linkedlist<int> intList1(2);intList1.printList();cout << "链表的长度是:" << intList1.getLength() << endl;intList1.deleteAll();cout << "链表的长度是:" << intList1.getLength() << endl;Single_linkedlist<string> strList1('r',3);strList1.printList();cout << "链表是空的吗?(0:不是;1:是)" << strList1.isEmpty() << endl;cout << "链表的第2号元素list[2]是:" << (strList1.find(2))->_data << endl;string str("abc");cout << "链表的包含字符串\"abc\"的元素的地址:" << endl;strList1.find(str);strList1.addHead(str);strList1.addTail(str);strList1.insertAtElemFront(str,2);strList1.printList();strList1.insertAtElemBack(str,3);strList1.printList();strList1.deleteElem(strList1.getLength()-1);strList1.printList();strList1.modifyElem(strList1.getLength()-1,string("end"));strList1.printList();strList1.reverse();strList1.printList();return 0;
}

Valgrind内存检测运行结果:

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

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

相关文章

搜索中的 Query 理解及应用

本文转载自公众号“夕小瑶的卖萌屋”&#xff0c;专业带逛互联网算法圈的神操作 -----》我是传送门 关注后&#xff0c;回复以下口令&#xff1a; 回复【789】 &#xff1a;领取深度学习全栈手册&#xff08;含NLP、CV海量综述、必刷论文解读&#xff09; 回复【入群】&#xf…

GAN原理,优缺点、应用总结

<h1 class"csdn_top" id"gan原理优缺点应用总结"><a name"t0"></a>GAN原理&#xff0c;优缺点、应用总结</h1> <br> 本文已投稿至微信公众号–机器学习算法全栈工程师&#xff0c;欢迎关注</article><p&…

java程序员进阶必读书单

以下是我推荐给Java开发者们的一些值得一看的好书&#xff0c;从java基础开始到高级&#xff0c;以及从高级进阶到架构等的书单。 基本都是经典之作&#xff0c;可以利用工作闲暇的时间&#xff0c;系统阅读。 本文作者&#xff0c;优知学院创始人 陈睿 优知学院是IT人在线进…

胡伟 | 面向多实体人机协作消解的对比表生成自动化方法

众包实体消解实体消解&#xff08;Entity Resolution&#xff0c;简称ER&#xff09;旨在发现不同知识图谱中指称真实世界相同对象的实体。众包实体消解&#xff08;Crowd ER&#xff09;在使用机器的基础上&#xff0c;还使用人来完成实体消解任务。众包实体消解的一个常见流程…

poj 1250 解题(链表法)

http://poj.org/problem?id1250 题意大意 住宿床位有限&#xff0c;按顺序入住&#xff0c;用ABC等代表单个人&#xff0c;第1次出现代表入住&#xff0c;第2次出现代表离开 输入&#xff1a; 1 ABCBCA 代表有1个床位&#xff0c; A入住&#xff0c; B入住&#xff0c;入住…

怎样高效阅读一份深度学习项目代码?

犹豫很久要不要把读代码这个事情专门挑出来写成一篇推文。毕竟读代码嘛&#xff0c;大家可能都会读。而且笔者个人读的和写的代码量也并不足以到指导大家读代码的程度。但笔者还是决定大胆地写一点&#xff1a;就当是给自己设立今后读代码的标准&#xff0c;也将一些之前未能践…

令人拍案叫绝的Wasserstein GAN

本文后续&#xff1a;Wasserstein GAN最新进展&#xff1a;从weight clipping到gradient penalty&#xff0c;更加先进的Lipschitz限制手法 在GAN的相关研究如火如荼甚至可以说是泛滥的今天&#xff0c;一篇新鲜出炉的arXiv论文《Wasserstein GAN》却在Reddit的Machine Learnin…

java架构师进阶之独孤九剑:数据结构以及书籍推荐

这是整个java架构师连载系列&#xff0c;分为9大步骤&#xff0c;我们现在还在第一个步骤&#xff1a;程序设计和开发->数据结构与算法。 “ 如果说 Java 是自动档轿车&#xff0c;C 就是手动档吉普。数据结构呢&#xff1f;是变速箱的工作原理&#xff0c; 你完全可以不…

中文文本蕴含计算项目(88万中文文本蕴含数据集+中文文本蕴含模型)

ChineseTextualInference ChineseTextualInference project including chinese corpus build and inferecence model, 中文文本推断项目,包括88万文本蕴含中文文本蕴含数据集的翻译与构建,基于深度学习的文本蕴含判定模型构建. 项目地址:https://github.com/liuhuanyong/Chine…

论文浅尝 | 打通推荐系统与知识图谱: 第一个公开的大规模链接数据集合

本文转载自&#xff1a;RUC智能情报站&#xff0c;知乎专栏链接&#xff1a;https://zhuanlan.zhihu.com/RucAIBox前言&#xff1a;近年来&#xff0c;知识图谱&#xff08;KB&#xff09;被广泛应用于推荐系统&#xff08;RS&#xff09;&#xff0c;但尚未有公开将推荐系统物…

数据结构--链表--判断一个字符串是否为回文串(单向链表,双向链表)

回文串为首尾对称的字符串&#xff1a; 如a&#xff0c;aba&#xff0c;abba等 单链表思路 1.将字符读入链表 2.找到链表中点 3.将链表从中点断开成2条&#xff0c;将后半条反转 4.比较两条链表是否相等&#xff08;比较次数以少的为准&#xff08;长度为奇数时&#xff…

丁香园在语义匹配任务上的探索与实践

前言语义匹配是NLP领域的基础任务之一&#xff0c;直接目标就是判断两句话是否表达了相同或相似意思。其模型框架十分简洁&#xff0c;通常包含文本表示和匹配策略两个模块&#xff0c;因而很容易扩展到相关应用场景&#xff0c;如搜索、推荐、QA系统等。此类模型通常依赖数据驱…

19本高并发编程书籍推荐

Java并发编程实战 &#xff08;java并发的圣经&#xff09; 多处理器编程的艺术 &#xff08;并发编程的各种算法&#xff0c;java实现&#xff0c;有点难度&#xff09; 并发的艺术 &#xff08;多核处理器的共享内存模型中的各种算法&#xff09; Java虚拟机并发编程 &#x…

Wasserstein metric的通俗解释

Wasserstein metric的通俗解释​关注他166 人赞同了该文章本文收录在无痛的机器学习第二季目录。Wasserstein GAN可以算是GAN界的一大突破了&#xff0c;有关它的介绍和使用心得的文章也已经满天飞了&#xff0c;感兴趣的童鞋随便一搜就能好多&#xff0c;今天就不说太多大家说…

肖仰华 | 领域知识图谱落地实践中的问题与对策

本文转载自公众号&#xff1a;知识工场。肖仰华教授2万字长文为您深度剖析领域知识图谱&#xff0c;对领域知识图谱技术与落地应用中的一系列关键问题做了系统的梳理与解答。肖仰华博士&#xff0c;复旦大学计算机科学与技术学院教授&#xff0c;博士生导师&#xff0c;知识工场…

数据结构--链表--约瑟夫环问题(单向循环链表)

问题&#xff1a;一群人站成一个圆圈&#xff0c;从一个人开始报数&#xff0c;1&#xff0c; 2 &#xff0c;。。。m&#xff0c;报到m的拉出去砍了&#xff0c;求被砍的顺序和最后一个活下来的。 利用单向循环链表实现 C代码如下&#xff1a;&#xff08;参考书籍&#xff…

献给新一代人工智能后浪——《后丹》

一只小狐狸带你解锁炼丹术&NLP秘籍视频来源&#xff1a;AIZOO《后丹》那些口口声声&#xff0c;掉包调参侠的人&#xff0c;应该看着你们像我一样&#xff0c;我看着你们&#xff0c;满怀羡慕。人类积攒了几十年的科技&#xff0c;所有的模型、数据、框架和显卡&#xff0c…

神经网络算法学习---mini-batch++++mini-batch和batch的区别

Batch_Size&#xff08;批尺寸&#xff09;是机器学习中一个重要参数&#xff0c;涉及诸多矛盾&#xff0c;下面逐一展开。 首先&#xff0c;为什么需要有 Batch_Size 这个参数&#xff1f; Batch 的选择&#xff0c;首先决定的是下降的方向。如果数据集比较小&#xff0c;完全…

进阶阿里架构师:算法、编程语言、数据库、架构设计!书单推荐!

阿里架构师必读书单 数据结构与算法&#xff1a;算法、算法导论等。 编程语言&#xff1a;java编程思想、java核心技术等 模式与设计&#xff1a;设计模式、代码重构、深入理解java虚拟机 数据库&#xff1a;mysql优化、oracle、redis实战、mongodb权威指南等。 架构设计&a…

刘知远 | 语义表示学习

本文转载自公众号&#xff1a;人工智能图灵。刘知远&#xff0c;清华大学计算机系副教授、博士生导师。主要研究方向为表示学习、知识图谱和社会计算。2011年获得清华大学博士学位&#xff0c;已在ACL、IJCAI、AAAI等人工智能领域的著名国际期刊和会议发表相关论文60余篇&#…